在单个存储过程中创建两个或多个表

Posted

技术标签:

【中文标题】在单个存储过程中创建两个或多个表【英文标题】:Create two or more tables in a single stored procedure 【发布时间】:2017-08-15 17:01:52 【问题描述】:

是否可以在一个存储过程中创建多个表? 我正在制作一个创建表的函数,我将表名作为参数传递,但我想一次创建 3 个表,这是我的存储过程:

CREATE OR REPLACE FUNCTION create_tables(t_name varchar(30))
  RETURNS VOID AS
$func$
BEGIN

EXECUTE format('
   CREATE TABLE IF NOT EXISTS %I (
    cond_a02_cabecera_id PRIMARY KEY,
    cond_a02_cabecera_nombre_archivo varchar(100),
    cond_a02_cabecera_centro varchar(100),
    cond_a02_cabecera_longitud int,
    cond_a02_cabecera_archivo_activo boolean,
    cond_a02_cabecera_fechae date,
    cond_a02_cabecera_fechad date
   )', t_name);
END
$func$ LANGUAGE plpgsql;

我使用 JDBC 来创建数据库,我尝试将“创建表”再次放入存储过程中,但它只创建第一个。

【问题讨论】:

【参考方案1】:

当然,应该可以。

CREATE OR REPLACE FUNCTION public.create_tables(t_name character varying)
 RETURNS void
 LANGUAGE plpgsql
AS $function$
BEGIN

EXECUTE format('
   CREATE TABLE IF NOT EXISTS %I (a int);
   CREATE TABLE IF NOT EXISTS %I (a int);
   CREATE TABLE IF NOT EXISTS %I (a int);',
   t_name || 1, t_name || 2, t_name || 3);
END
$function$;
postgres=# 选择 create_tables('foo'); ┌────────────────┐ │ create_tables │ ╞═══════════════╡ │ │ └────────────────┘ (1 行) postgres=#\dt 关系列表 ┌────────┬──────┬────────┬────────┐ │ Schema │ Name │ Type │ Owner │ ╞════════╪══════╪═══════╪═══════╡ │ public │ foo1 │ table │ pavel │ │ public │ foo2 │ table │ pavel │ │ public │ foo3 │ table │ pavel │ └────────┴──────┴────────┴────────┘ (3 行)

【讨论】:

以上是关于在单个存储过程中创建两个或多个表的主要内容,如果未能解决你的问题,请参考以下文章

如何在存储过程中创建视图

在存储过程中创建临时表

sql中创建关于更新的存储过程

在存储过程中创建动态表而在 PL/SQL 块表中创建时权限不足[重复]

具有多个存储过程的任务

在 MySQL 存储过程中创建临时表