使用Plpgsql创建动态表

时间:2013-01-08 16:24:55

标签: postgresql plpgsql

我有一个场景,有点复杂。我想创建一个表,其名称和字段由用户定义。设置表的名称并不是很困难,但是一个表可以有2个字段,另外5个具有不同的名称,依此类推。我想用pl / pgsql做这个工作。通常可以在pl / pgsql中执行此操作吗? 是否可以在第一个字段读取字段数,然后为每个字段读取字段的名称? 你能给我一些提示吗?

1 个答案:

答案 0 :(得分:1)

使用这样的功能:

CREATE OR REPLACE FUNCTION mktable(tabname TEXT, fields TEXT[]) 
RETURNS VOID AS $$
DECLARE 
  q TEXT := ''; 
BEGIN
  q := 'CREATE TABLE ' || quote_ident(tabname) || ' ( ';
  for i in array_lower(fields, 1) .. array_upper(fields, 1) loop
    q := q || quote_ident(fields[i]) || ' TEXT ';
    if i <> array_upper(fields, 1) then
      q := q || ',';
    end if; 
  end loop;
  q := q || ' ) ';
  raise notice 'Running query: ';
  raise notice '%', q;
  execute q;
END;
$$ LANGUAGE PLPGSQL;

您可以像以下一样运行它:

SELECT mktable('tab1', ARRAY['a', 'b', 'ccc', 'd d']);

然后你有了表:

    Table "public.tab1"
 Column | Type | Modifiers 
--------+------+-----------
 a      | text | 
 b      | text | 
 ccc    | text | 
 d d    | text |