Вие можете връща цял ред като съставен тип и добавя още:
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;
Но тогава, когато използвате простото извикване:
SELECT * FROM f_rowplus();
Получавате реда от таблица demo
като отделен съставен тип. Трябва да се обадите на:
SELECT (rec).*, add_int, add_txt FROM f_rowplus();
за да получите всички индивидуални колони. Необходими са скоби.
Postgres е малко непоследователен тук. Ако създадете функция с:
CREATE OR REPLACE FUNCTION f_row2()
RETURNS TABLE (rec demo) AS
...
след това съставния тип demo
тихо се преобразува в отделни колони (разлага се). Не остава връзка с оригиналния съставен тип. Не можете да препращате към декларираната изходна колона rec
изобщо, тъй като това е заменено с колоните от разложен тип. Това повикване ще доведе до съобщение за грешка:
SELECT rec FROM f_row2();
Същото тук:
CREATE OR REPLACE FUNCTION f_row3(OUT rec demo)
RETURNS SETOF demo AS
...
Въпреки това , веднага щом добавите всеки още OUT
колони, съставният тип се запазва както е деклариран (не е разложен) и можете:
SELECT rec FROM f_rowplus();
с първата функция.
Създадох SQL Fiddle демонстриране на вариантите.
Настрана
Когато използвате функция, връщаща множество колони в FROM
списък (като таблична функция) и разлагане в SELECT
списък като този:
SELECT (rec).* FROM f_rowplus();
... функцията все още се оценява веднъж само - докато се обажда и разлагане в SELECT
списък директно като този:
SELECT (f_rowplus()).*; -- also: different result
... ще оцени веднъж за всяка колона в типа връщане. Подробности: