Plpgsql
如何從 plpgsql 函式返回單個複合類型而不顯式地重複複合類型的部分作為 OUT 參數?
我已經在網上和通過文件進行了搜尋,但更常見的案例似乎是返回 SETOF 某些特定的行類型,而不僅僅是單行。
下面的案例對於說明來說是微不足道的,因為我只是想確定這在 plpgsql 中是否可能,並理解用於它的語法。(就像 Postgresql 文件包含返回一組靜態固定值的函式範例一樣,這裡的重點不是案例而是語法。)
有了這張表:
create table my_table (f1 int primary key, f2 text, f3 real, f4 text, f5 bool);
可以創建以下函式:
create function my_func1(f1_to_look_up int) returns my_table language sql as $$ select * from my_table where f1 = f1_to_look_up $$;
此外,這可以像這樣在 plpgsql 中完成,使用顯式輸出參數(並
f1
在子句中顯式指定where
以避免歧義):create function my_func2(f1_to_look_up int, out f1 int, out f2 text, out f3 real, out f4 text, out f5 bool) language plpgsql as $$ begin select * into strict f1, f2, f3, f4, f5 from my_table where my_table.f1 = f1_to_look_up; return; end $$;
有沒有辦法在 plpgsql 中完成同樣的事情,而無需重複定義
my_table
以列出所有 OUT 參數?
您可以通過使用具有該類型的表達式來返回行類型。這裡有效
select my_table from my_table
create function my_func4(f1_to_look_up int) returns my_table language plpgsql as $$ begin return my_table from my_table where f1 = f1_to_look_up; end; $$;
或通過變數
create or replace function my_func4(f1_to_look_up int) returns my_table language plpgsql as $$ declare retval my_table; begin select into retval * from my_table where f1 = f1_to_look_up; return retval; end; $$;
您還可以使用行建構子,如果查詢更複雜並且您需要返回從多個連接在一起的表中獲取的值,這將特別有用:
create function my_func5(f1_to_look_up integer) returns my_table language plpgsql as $function$ begin return row(t.*) from my_table as t where f1 = f1_to_look_up; end $function$ ;
關鍵是在 plpgsql 語法文件表明您可以編寫的地方
return expression
, “表達式”可以是在普通 SQL 查詢中通常遵循“選擇”的所有內容。