Du kunne returner en hel række som sammensat type og tilføj nogle flere:
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;
Men så, når du bruger det simple opkald:
SELECT * FROM f_rowplus();
Du får rækken fra tabellen demo
som separat komposittype. Du skal ringe til:
SELECT (rec).*, add_int, add_txt FROM f_rowplus();
for at få alle individuelle kolonner. Parentes påkrævet.
Postgres er lidt inkonsekvent her. Hvis du opretter en funktion med:
CREATE OR REPLACE FUNCTION f_row2()
RETURNS TABLE (rec demo) AS
...
derefter den sammensatte type demo
konverteres lydløst til individuelle kolonner (nedbrydes). Der er intet link til den originale sammensatte type tilbage. Du kan ikke referere til den erklærede outputkolonne rec
overhovedet, da det er blevet erstattet med søjlerne af den nedbrudte type. Dette opkald ville resultere i en fejlmeddelelse:
SELECT rec FROM f_row2();
Samme her:
CREATE OR REPLACE FUNCTION f_row3(OUT rec demo)
RETURNS SETOF demo AS
...
Men , så snart du tilføjer enhver mere OUT
kolonner, bevares den sammensatte type som deklareret (ikke dekomponeret), og du kan:
SELECT rec FROM f_rowplus();
med den første funktion.
Jeg oprettede en SQL Fiddle demonstrerer varianterne.
Bortset
Når du bruger en funktion, der returnerer flere kolonner i FROM
liste (som tabelfunktion) og dekomponering i SELECT
liste som denne:
SELECT (rec).* FROM f_rowplus();
... funktionen evalueres stadig én gang kun - mens du ringer til og dekomponerer i SELECT
liste direkte sådan her:
SELECT (f_rowplus()).*; -- also: different result
... ville evaluere én gang for hver kolonne i returtypen. Detaljer: