2013-05-09 44 views
0

我使用EXECUTE(動態SQL)和SETOF(結果返回的列表),但它是錯誤的:(Postgres的動態SQL和列表結果

create table test as 
select 1 id, 'safd' data1,'sagd' data2 
union 
select 2 id, 'hdfg' data1,'sdsf' data2; 

create or replace function test2(a varchar) returns SETOF record as 
$BODY$ 
declare x record; 
begin 
for x in execute a loop 
RETURN NEXT x; 
end loop; 
return; 
end; 
$BODY$ 
LANGUAGE 'plpgsql' VOLATILE; 

select * from test2('select * from test'); 
+0

錯誤:返回「記錄」的函數需要列定義列表 第1行:select * from test2('select * from test'); ^ ********** **********錯誤 錯誤:需要一個字段定義列表返回 「記錄」 SQL國家職能:42601 字符:15 – Virus 2013-05-09 01:24:11

回答

1

你必須事先知道返回的記錄

select * from test2('select * from test') s(a int, b text, c text); 
a | b | c 
---+------+------ 
1 | safd | sagd 
2 | hdfg | sdsf 

或者,如果返回的集將永遠是一組測試表中,然後使用阿卡什的提出的解決方案的結構。

0

您需要添加一些OUT參數,。

CREATE FUNCTION test2(a character varying, OUT id integer, OUT data1 text, OUT data2 text) RETURNS SETOF record 
LANGUAGE plpgsql 
AS $$ 
begin 
RETURN QUERY EXECUTE a; 
end; 
$$; 
1

更換

create or replace function test2(a varchar) returns SETOF RECORD as 

create or replace function test2(a varchar) returns SETOF test as 
                  ^^^^ name of table (it specifies the datatypes of the set)