sql >> Database >  >> RDS >> PostgreSQL

Gemakkelijke manier om het retourtype SETOF-tabel plus extra velden te hebben?

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:




  1. MySQL - verander OR in AND

  2. Waarom geeft Rails / ActiveRecord een Postgres SyntaxError non-integer constante in ORDER?

  3. type afbeelding is niet ingesteld voor polymorfe associaties

  4. database herstellen naar een bepaalde staat voor testen