sql >> Databasteknik >  >> RDS >> PostgreSQL

Enkelt sätt att ha returtyp vara SETOF-tabellen plus ytterligare fält?

Du kunde returnera en hel rad som sammansatt typ och lägg till några fler:

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 sedan, när du använder det enkla samtalet:

SELECT * FROM f_rowplus();

Du får raden från tabellen demo som separat komposittyp. Du måste ringa:

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

för att få alla enskilda kolumner. Parentes krävs.

Postgres är lite inkonsekvent här. Om du skapar en funktion med:

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

sedan den sammansatta typen demo omvandlas tyst till enskilda kolumner (nedbryts). Ingen länk till den ursprungliga komposittypen finns kvar. Du kan inte referera till den deklarerade utdatakolumnen rec överhuvudtaget, eftersom det har ersatts med kolumner av sönderfallen typ. Detta anrop skulle resultera i ett felmeddelande:

SELECT rec FROM f_row2();

Samma här:

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

Men , så snart du lägger till någon mer OUT kolumner, den sammansatta typen bevaras som deklarerad (inte dekomponerad) och du kan:

SELECT rec FROM f_rowplus();

med den första funktionen.

Jag skapade en SQL Fiddle visar varianterna.

Åsido
När du använder en funktion som returnerar flera kolumner i FROM lista (som tabellfunktion) och dekomposition i SELECT lista så här:

SELECT (rec).* FROM f_rowplus();

... funktionen utvärderas fortfarande en gång endast - medan du ringer och sönderdelas i SELECT lista direkt så här:

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

... skulle utvärdera en gång för varje kolumn i returtypen. Detaljer:




  1. Låser upp tabeller om tråden tappas bort

  2. Vilken är den bästa DBMS för jobbet?

  3. MySQL kommer inte att stängas av:Stoppa server:FEL! MySQL-serverns PID-fil kunde inte hittas!

  4. Hur kan jag visa bilder lagrade i en MySQL-databas?