sql >> Databáze >  >> RDS >> PostgreSQL

Snadný způsob, jak mít návratový typ tabulky SETOF plus další pole?

Mohli byste vrátit celý řádek jako složený typ a přidat další:

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 pak, když použijete jednoduché volání:

SELECT * FROM f_rowplus();

Řádek získáte z tabulky demo jako samostatný kompozitní typ. Budete muset zavolat:

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

získat všechny individuální sloupců. Jsou povinné závorky.

Postgres je zde trochu nekonzistentní. Pokud vytvoříte funkci pomocí:

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

pak složený typ demo se tiše převede na jednotlivé sloupce (rozloží). Nezůstává žádná vazba na původní složený typ. Nemůžete odkazovat na deklarovaný výstupní sloupec rec vůbec, protože to bylo nahrazeno sloupci dekomponovaného typu. Toto volání by mělo za následek chybovou zprávu:

SELECT rec FROM f_row2();

Totéž zde:

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

Nicméně , jakmile přidáte jakékoli více OUT sloupců, je složený typ zachován jako deklarovaný (ne rozložený) a můžete:

SELECT rec FROM f_rowplus();

s první funkcí.

Vytvořil jsem SQL Fiddle předvedení variant.

Strana
Při použití funkce vracející více sloupců v FROM seznam (jako tabulková funkce) a rozklad v SELECT seznam takto:

SELECT (rec).* FROM f_rowplus();

... funkce je stále vyhodnocena jednou pouze – při volání a rozklad v SELECT seznam přímo takto:

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

... vyhodnotí jednou pro každý sloupec v návratovém typu. Podrobnosti:




  1. mysql vyberte, chcete-li vrátit mezery pro všechny kromě prvního řádku opakujícího se sloupce

  2. Php pdo foreach

  3. SQL Server verze ADD_MONTHS() Oracle

  4. Ověření formuláře