Du kunde returnera en hel rad som sammansatt typ och lägg till några fler:
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 sedan, när du använder det enkla samtalet:
SELECT * FROM f_rowplus();
Du får raden från tabellen demo
som separat komposittyp. Du måste ringa:
SELECT (rec).*, add_int, add_txt FROM f_rowplus();
för att få alla enskilda kolumner. Parentes krävs.
Postgres är lite inkonsekvent här. Om du skapar en funktion med:
CREATE OR REPLACE FUNCTION f_row2()
RETURNS TABLE (rec demo) AS
...
sedan den sammansatta typen demo
omvandlas tyst till enskilda kolumner (nedbryts). Ingen länk till den ursprungliga komposittypen finns kvar. Du kan inte referera till den deklarerade utdatakolumnen rec
överhuvudtaget, eftersom det har ersatts med kolumner av sönderfallen typ. Detta anrop skulle resultera i ett felmeddelande:
SELECT rec FROM f_row2();
Samma här:
CREATE OR REPLACE FUNCTION f_row3(OUT rec demo)
RETURNS SETOF demo AS
...
Men , så snart du lägger till någon mer OUT
kolumner, den sammansatta typen bevaras som deklarerad (inte dekomponerad) och du kan:
SELECT rec FROM f_rowplus();
med den första funktionen.
Jag skapade en SQL Fiddle visar varianterna.
Åsido
När du använder en funktion som returnerar flera kolumner i FROM
lista (som tabellfunktion) och dekomposition i SELECT
lista så här:
SELECT (rec).* FROM f_rowplus();
... funktionen utvärderas fortfarande en gång endast - medan du ringer och sönderdelas i SELECT
lista direkt så här:
SELECT (f_rowplus()).*; -- also: different result
... skulle utvärdera en gång för varje kolumn i returtypen. Detaljer: