如何返回在函数内创建的表?

时间:2015-11-11 17:31:12

标签: plpgsql

我有一个创建表的PL / pgSQL函数。我想返回作为“返回表”功能的一部分创建的表。这是我正在谈论的函数类型的一个例子:

CREATE OR REPLACE FUNCTION my_schema.new_foo_table(character varying)
  RETURNS table(row_id bigint, 
         catalog_id varchar, 
         value numeric(5,4)) AS
$BODY$
DECLARE
v_table_name ALIAS FOR $1;
cmd            text;

BEGIN
  cmd := 'CREATE TABLE '||v_table_name||' 
          (row_id bigint, 
           catalog_id varchar, 
           value numeric(5,4))';
  EXECUTE cmd;

  cmd := 'INSERT INTO '||v_table_name||'
          SELECT row_id, catalog_id, sum(value)
          FROM other_table
          GROUP BY row_id, catalog_id';
  EXECUTE cmd;

  RETURN --results of select * from v_table_name;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

我如何返回我创建的新表的结果?我猜测返回将不得不使用某种类型的动态SQL“执行”语句,因为新创建的表的名称是在变量中。

1 个答案:

答案 0 :(得分:0)

是的,这可以使用RETURN QUERY EXECUTE'命令字符串'来完成。对于您的示例,它看起来像这样:

CREATE OR REPLACE FUNCTION my_schema.new_foo_table(character varying)
  RETURNS table(row_id bigint, 
          catalog_id varchar, 
          value numeric(5,4)) AS
$BODY$
DECLARE
arg_table_name ALIAS FOR $1;
v_table_name   varchar;
cmd            text;

BEGIN
  v_table_name := quote_ident(arg_table_name);
  cmd := 'CREATE TABLE '||v_table_name||' 
          (row_id bigint, 
           catalog_id varchar, 
           value numeric(5,4))';
  EXECUTE cmd;

  cmd := 'INSERT INTO '||v_table_name||'
          SELECT row_id, catalog_id, sum(value)
          FROM other_table
          GROUP BY row_id, catalog_id';
  EXECUTE cmd;

  RETURN QUERY EXECUTE 'select * from v_table_name';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

有关其他信息,请参阅第40.6.1.2节。在POSTGRESQL文档中:http://www.postgresql.org/docs/9.3/static/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING