sql >> Database teknologi >  >> RDS >> PostgreSQL

Nem måde at få returtype til at være SETOF-tabel plus yderligere felter?

Du kunne returner en hel række som sammensat type og tilføj nogle flere:

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;

Men så, når du bruger det simple opkald:

SELECT * FROM f_rowplus();

Du får rækken fra tabellen demo som separat komposittype. Du skal ringe til:

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

for at få alle individuelle kolonner. Parentes påkrævet.

Postgres er lidt inkonsekvent her. Hvis du opretter en funktion med:

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

derefter den sammensatte type demo konverteres lydløst til individuelle kolonner (nedbrydes). Der er intet link til den originale sammensatte type tilbage. Du kan ikke referere til den erklærede outputkolonne rec overhovedet, da det er blevet erstattet med søjlerne af den nedbrudte type. Dette opkald ville resultere i en fejlmeddelelse:

SELECT rec FROM f_row2();

Samme her:

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

Men , så snart du tilføjer enhver mere OUT kolonner, bevares den sammensatte type som deklareret (ikke dekomponeret), og du kan:

SELECT rec FROM f_rowplus();

med den første funktion.

Jeg oprettede en SQL Fiddle demonstrerer varianterne.

Bortset
Når du bruger en funktion, der returnerer flere kolonner i FROM liste (som tabelfunktion) og dekomponering i SELECT liste som denne:

SELECT (rec).* FROM f_rowplus();

... funktionen evalueres stadig én gang kun - mens du ringer til og dekomponerer i SELECT liste direkte sådan her:

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

... ville evaluere én gang for hver kolonne i returtypen. Detaljer:




  1. MariaDB JSON_EXTRACT() Forklaret

  2. Kan jeg bruge kommandoen \copy ind i en funktion af postgresql?

  3. lagring af fremmednøgle, ikke fra form POST-metoden, men fra formulardata, jeg allerede har

  4. Openshift, kan ikke oprette forbindelse til Mysql fra konsollen