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

时间:2017-08-15 17:01:52

标签: java postgresql jdbc plpgsql dynamic-sql

是否可以在单个存储过程中创建多个表? 我正在创建一个创建表的函数,我像表参数一样传递表名,但我想一次创建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创建数据库,我尝试在存储过程中再次使用“create table”,但它只创建第一个。

1 个答案:

答案 0 :(得分:3)

当然,应该可以。

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=# select create_tables('foo');
┌───────────────┐
│ create_tables │
╞═══════════════╡
│               │
└───────────────┘
(1 row)

postgres=# \dt
        List of relations
┌────────┬──────┬───────┬───────┐
│ Schema │ Name │ Type  │ Owner │
╞════════╪══════╪═══════╪═══════╡
│ public │ foo1 │ table │ pavel │
│ public │ foo2 │ table │ pavel │
│ public │ foo3 │ table │ pavel │
└────────┴──────┴───────┴───────┘
(3 rows)