możesz zwróć cały wiersz jako typ złożony i dodaj trochę więcej:
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 wtedy, gdy używasz prostego wywołania:
SELECT * FROM f_rowplus();
Pobierasz wiersz z tabeli demo
jako oddzielny typ kompozytowy. Musisz zadzwonić:
SELECT (rec).*, add_int, add_txt FROM f_rowplus();
aby uzyskać wszystkie indywidualne kolumny. Wymagane nawiasy.
Postgres jest tu trochę niespójny. Jeśli tworzysz funkcję za pomocą:
CREATE OR REPLACE FUNCTION f_row2()
RETURNS TABLE (rec demo) AS
...
następnie typ złożony demo
jest po cichu konwertowany na poszczególne kolumny (rozkładany). Nie pozostał żaden link do oryginalnego typu złożonego. Nie możesz odwołać się do zadeklarowanej kolumny wyjściowej rec
w ogóle, ponieważ zostało to zastąpione kolumnami typu rozłożonego. To wywołanie spowoduje wyświetlenie komunikatu o błędzie:
SELECT rec FROM f_row2();
To samo tutaj:
CREATE OR REPLACE FUNCTION f_row3(OUT rec demo)
RETURNS SETOF demo AS
...
Jednak , gdy tylko dodasz dowolny więcej OUT
kolumny, typ złożony jest zachowywany jako zadeklarowany (nie zdekomponowany) i możesz:
SELECT rec FROM f_rowplus();
z pierwszą funkcją.
Utworzyłem SQL Fiddle demonstrowanie wariantów.
Na bok
Gdy używasz funkcji zwracającej wiele kolumn w FROM
lista (jako funkcja tabeli) i dekompozycja w SELECT
lista w ten sposób:
SELECT (rec).* FROM f_rowplus();
... funkcja jest nadal oceniana raz tylko - podczas rozmowy i dekompozycja w SELECT
lista bezpośrednio w ten sposób:
SELECT (f_rowplus()).*; -- also: different result
... oceni raz dla każdej kolumny w zwracanym typie. Szczegóły: