PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Łatwy sposób, aby zwracany typ był tabelą SETOF i dodatkowymi polami?

możesz zwróć cały wiersz jako typ złożony i dodaj trochę więcej:

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;

Ale wtedy, gdy używasz prostego wywołania:

SELECT * FROM f_rowplus();

Pobierasz wiersz z tabeli demo jako oddzielny typ kompozytowy. Musisz zadzwonić:

SELECT (rec).*,  add_int, add_txt FROM f_rowplus();

aby uzyskać wszystkie indywidualne kolumny. Wymagane nawiasy.

Postgres jest tu trochę niespójny. Jeśli tworzysz funkcję za pomocą:

CREATE OR REPLACE FUNCTION f_row2()
  RETURNS TABLE (rec demo) AS
...

następnie typ złożony demo jest po cichu konwertowany na poszczególne kolumny (rozkładany). Nie pozostał żaden link do oryginalnego typu złożonego. Nie możesz odwołać się do zadeklarowanej kolumny wyjściowej rec w ogóle, ponieważ zostało to zastąpione kolumnami typu rozłożonego. To wywołanie spowoduje wyświetlenie komunikatu o błędzie:

SELECT rec FROM f_row2();

To samo tutaj:

CREATE OR REPLACE FUNCTION f_row3(OUT rec demo)
  RETURNS SETOF demo AS
...

Jednak , gdy tylko dodasz dowolny więcej OUT kolumny, typ złożony jest zachowywany jako zadeklarowany (nie zdekomponowany) i możesz:

SELECT rec FROM f_rowplus();

z pierwszą funkcją.

Utworzyłem SQL Fiddle demonstrowanie wariantów.

Na bok
Gdy używasz funkcji zwracającej wiele kolumn w FROM lista (jako funkcja tabeli) i dekompozycja w SELECT lista w ten sposób:

SELECT (rec).* FROM f_rowplus();

... funkcja jest nadal oceniana raz tylko - podczas rozmowy i dekompozycja w SELECT lista bezpośrednio w ten sposób:

SELECT (f_rowplus()).*;  -- also: different result

... oceni raz dla każdej kolumny w zwracanym typie. Szczegóły:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie PostgresSQL INTERVAL w SQLAlchemy, gdzie czas trwania jest dynamicznie przechowywany w DB i nie jest parametrem

  2. Polecenie rozmiaru bazy danych Postgres

  3. Powolne zapytanie postgres podczas dołączania do dużych stołów

  4. Postgresql:Grupowanie z limitem rozmiaru grupy przy użyciu funkcji okna

  5. Co decyduje o tym, czy rails zawiera id::serial w definicji tabeli?