我正在嘗試撰寫一個帶有引數的函式,該引數應該根據此函式的引數回傳兩個 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 錯誤 [42883]:錯誤:函式 fx(整數)不存在提示:沒有函式與給定的名稱和引數型別匹配。您可能需要添加顯式型別轉換”
預先感謝!
uj5u.com熱心網友回復:
如果我根據函式引數回傳不同的表,如何指定列?你不能。函式必須始終具有相同的回傳型別,并且必須在函式定義中宣告確切的回傳。
你可以通過讓你的函式回傳一個參考來獲得你想要的東西;請參閱游標 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 而沒有干預函式)。
一點開發理念:一個函式應該做一件事,把它做好,并且知道完成它所需的一切。你的函式不知道該怎么做;它需要被告知。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/464766.html
標籤:PostgreSQL sql函数
下一篇:地理資訊系統|ST_Intersects:對混合SRID幾何圖形(Point,0)的操作!=(MultiPolygon,24379)SQL狀態:XX000
