如何 Return 在函数内创建的 Table?

How to Return a Table That Was Created Within Function?

我有一个 PL/pgSQL 函数可以创建 table。我想 return 作为 "Return Table" 函数的一部分创建的 table。这是我正在谈论的函数类型的示例:

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 ;
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;

我如何 return 我创建的新 table 结果?我猜 return 必须使用某种类型的动态 SQL "execute" 语句,因为新创建的 table 的名称在变量中。

是的,这可以使用 RETURN QUERY EXECUTE 'command string' 来完成。对于您的示例,它看起来像这样:

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 ;
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