PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Лесен начин типът на връщане да бъде таблица SETOF плюс допълнителни полета?

Вие можете връща цял ред като съставен тип и добавя още:

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

... ще оцени веднъж за всяка колона в типа връщане. Подробности:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Получаване на въведени резултати от необработен SQL ActiveRecord

  2. Knex.js - Как да създадете уникален индекс с клауза "къде"?

  3. Защо postgresql 9.1 не работи с rails 3.0?

  4. инсталация на postgres, инициализацията на клъстера на базата данни е неуспешна (Postgresql версия 9.4.4)

  5. Създайте списък с първи и последен ден от месеца за даден период