如何在postgres函数中使用CASE返回Select语句?



我试图写一个函数,参数应该返回两个select中的一个,取决于这个函数的参数:

CREATE FUNCTION fx(m integer)
RETURNS SETOF AS $$
BEGIN
CASE m
WHEN 1 then return query select * from pg_catalog.pg_roles
WHEN 2 then return query select * from pg_catalog.pg_auth_members
END
END
$$ LANGUAGE plpgsql;
SELECT fx(1);

对不起,我是全新的sql函数,所以我到底做错了什么?当执行

时,我得到这个错误:SQL Error [42883]: Error: function fx(integer)不存在提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型强制转换"

谢谢先!

你怎么能指定列,如果我有不同的表返回取决于函数参数?不能。函数必须始终具有相同的返回类型,并且必须在函数定义中声明确切的返回值。
你可以通过让你的函数返回一个refcursor来得到你想要的;参见游标43.7.3.5(或适合你的Postgres版本的章节)

create or replace function confused_function( What_to_do integer) 
returns refcursor
language plpgsql
as $$
declare 
rec  refcursor; 
begin 
case when What_to_do  = 1 then 
open rec for select * from t1; 

when What_to_do  = 2 then
open rec for select * from t2; 

else 
raise exception 'Invalid What_to_do parameter value specified (%)', What_to_do
using Hint = 'Value for Parameter: What_to_do must be 1 or 2'; 
end case; 
return rec; 
end;
$$;
然而,

将游标处理转移到调用例程。您最好编写2个函数(每个SQL一个)。让调用例程分析"参数"并调用适当的函数(或者只运行SQL而不使用中间函数)。

一个小的开发哲学:一个函数应该做一件事,把它做好,并且知道完成它所需要的一切。你的函数不知道该做什么;它需要被告知。

最新更新