返回具有未知table_name的记录集

时间:2014-06-18 13:53:36

标签: sql postgresql plpgsql

我想从具有此功能的表中返回一行(我不知道表的名称,它是随机的)

CREATE FUNCTION foo( text ) RETURNS setof record AS $$
 DECLARE
  table_name ALIAS FOR $1;
 BEGIN 
  SELECT *  from table_name ;
 END
$$ LANGUAGE plpgsql;

然后我想这样做:

select col1,col2 from foo('bar');

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

SQL要求在调用时知道返回类型。函数也要求您定义返回类型。你所追求的并不是微不足道的。

如果您不知道 通话时间 的退货类型,那么您基本上没有运气。您无法通过单个函数调用来解决问题。

如果您在通话时知道类型,则可以选择多态类型和带EXECUTE的动态SQL:

CREATE OR REPLACE FUNCTION f_data_of_table(_tbl_type anyelement)
  RETURNS SETOF anyelement AS
$func$
BEGIN

RETURN QUERY EXECUTE 
'SELECT * FROM ' || pg_typeof(_tbl_type);

END
$func$ LANGUAGE plpgsql;

呼叫:

SELECT * FROM f_data_of_table(NULL::my_table_name);

详情在此相关答案中:
Refactor a PL/pgSQL function to return the output of various SELECT queries

警惕SQL注入:
Table name as a PostgreSQL function parameter

只有做SELECT * FROM tbl以上,或者只是使用SQL命令时才有意义。

除了:
不要使用ALIAS将名称附加到参数值。 That's outdated and discouraged。改为使用命名参数。