我想从具有此功能的表中返回一行(我不知道表的名称,它是随机的)
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');
有什么想法吗?
答案 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。改为使用命名参数。