1. 程式人生 > 其它 >postgresql PL/pgSQL return setof和TABLE的區別

postgresql PL/pgSQL return setof和TABLE的區別

在pg中,廣泛的使用了表函式代替檢視,返回集合有兩種定義,setof和table。他們的區別在於table明確定義了欄位名和型別,如下:

CREATE FUNCTION events_by_type_1(text) RETURNS TABLE(id bigint, name text) AS $$
    SELECT id, name FROM events WHERE type = $1;
$$ LANGUAGE SQL STABLE;

而setof則依賴SQL編譯器解析,如下:

CREATE FUNCTION events_by_type_2(text) RETURNS SETOF record AS
$$ SELECT id, name FROM events WHERE type = $1; $$ LANGUAGE SQL STABLE;

使用的時候要明確as一把,如下:

SELECT * from events_by_type_2('social') as (id bigint, name text);

否則會提示"ERROR: a column definition list is required for functions returning "record""。

另外一種方式是不要返回record而是具體的型別,例如:

CREATE TYPE footype AS
(score int, term text); CREATE FUNCTION foo() RETURNS SETOF footype AS $$ SELECT * FROM ( VALUES (1,'hello!'), (2,'Bye') ) t; $$ language SQL immutable; SELECT * FROM foo();

在pg 10+新版本中,本質上沒有區別。return setof my_type會更合適一些,它鼓勵重用型別、而不是隨意的拼接。

https://stackoverflow.com/questions/22423958/sql-function-return-type-table-vs-setof-records

花若盛開,蝶自飛來,你若精彩,幸福開懷!2020年12月11日-18日