Je zou retourneer een hele rij als samengesteld type en voeg wat meer toe:
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;
Maar dan, wanneer u de eenvoudige oproep gebruikt:
SELECT * FROM f_rowplus();
Je krijgt de rij uit tabel demo
als afzonderlijk composiettype. Je zou moeten bellen:
SELECT (rec).*, add_int, add_txt FROM f_rowplus();
om alle individuele . te krijgen kolommen. Haakjes vereist.
Postgre is hier een beetje inconsequent. Als u een functie maakt met:
CREATE OR REPLACE FUNCTION f_row2()
RETURNS TABLE (rec demo) AS
...
dan het samengestelde type demo
wordt stil omgezet in afzonderlijke kolommen (ontbonden). Er blijft geen link naar het oorspronkelijke composiettype over. U kunt niet verwijzen naar de gedeclareerde uitvoerkolom rec
helemaal niet, want dat is vervangen door de kolommen van het ontbonden type. Deze oproep zou resulteren in een foutmelding:
SELECT rec FROM f_row2();
Hetzelfde hier:
CREATE OR REPLACE FUNCTION f_row3(OUT rec demo)
RETURNS SETOF demo AS
...
Echter , zodra u elke . toevoegt meer OUT
kolommen, wordt het samengestelde type behouden als gedeclareerd (niet ontleed) en kunt u:
SELECT rec FROM f_rowplus();
met de eerste functie.
Ik heb een SQL Fiddle gemaakt de varianten demonstreren.
Terzijde
Bij gebruik van een functie die meerdere kolommen retourneert in de FROM
lijst (als tabelfunctie) en ontbinden in de SELECT
lijst als volgt:
SELECT (rec).* FROM f_rowplus();
... de functie wordt nog steeds eenmaal geëvalueerd alleen - terwijl een aanroep en ontbinden in de SELECT
lijst direct als volgt:
SELECT (f_rowplus()).*; -- also: different result
... zou eenmaal voor elke kolom evalueren in het retourtype. Details: