Plpgsql

如何從 plpgsql 函式返回單個複合類型而不顯式地重複複合類型的部分作為 OUT 參數?

  • December 30, 2019

我已經在網上和通過文件進行了搜尋,但常見的案例似乎是返回 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 查詢中通常遵循“選擇”的所有內容。

引用自:https://dba.stackexchange.com/questions/256398