Mohli byste vrátit celý řádek jako složený typ a přidat další:
CREATE OR REPLACE FUNCTION f_rowplus()
RETURNS TABLE (rec demo, add_int int, add_txt text) AS
$func$
SELECT d, 5, 'baz'::text FROM demo d;
$func$ LANGUAGE sql;
Ale pak, když použijete jednoduché volání:
SELECT * FROM f_rowplus();
Řádek získáte z tabulky demo
jako samostatný kompozitní typ. Budete muset zavolat:
SELECT (rec).*, add_int, add_txt FROM f_rowplus();
získat všechny individuální sloupců. Jsou povinné závorky.
Postgres je zde trochu nekonzistentní. Pokud vytvoříte funkci pomocí:
CREATE OR REPLACE FUNCTION f_row2()
RETURNS TABLE (rec demo) AS
...
pak složený typ demo
se tiše převede na jednotlivé sloupce (rozloží). Nezůstává žádná vazba na původní složený typ. Nemůžete odkazovat na deklarovaný výstupní sloupec rec
vůbec, protože to bylo nahrazeno sloupci dekomponovaného typu. Toto volání by mělo za následek chybovou zprávu:
SELECT rec FROM f_row2();
Totéž zde:
CREATE OR REPLACE FUNCTION f_row3(OUT rec demo)
RETURNS SETOF demo AS
...
Nicméně , jakmile přidáte jakékoli více OUT
sloupců, je složený typ zachován jako deklarovaný (ne rozložený) a můžete:
SELECT rec FROM f_rowplus();
s první funkcí.
Vytvořil jsem SQL Fiddle předvedení variant.
Strana
Při použití funkce vracející více sloupců v FROM
seznam (jako tabulková funkce) a rozklad v SELECT
seznam takto:
SELECT (rec).* FROM f_rowplus();
... funkce je stále vyhodnocena jednou pouze – při volání a rozklad v SELECT
seznam přímo takto:
SELECT (f_rowplus()).*; -- also: different result
... vyhodnotí jednou pro každý sloupec v návratovém typu. Podrobnosti: