Je mengt de syntaxis voor het retourneren van SETOF
waarden met syntaxis voor het retourneren van een enkele rij of waarde.
-- Een gerelateerde vraag is - hoe retourneer ik de enkele record 'r' van
Wanneer u een functie declareert met RETURNS TABLE
, moet je RETURN NEXT
. gebruiken in de body om een rij (of scalaire waarde) te retourneren. En als je een record
wilt gebruiken variabele waarmee het moet overeenkomen het retourtype. Raadpleeg de codevoorbeelden verderop.
Retourneer een enkele waarde of rij
Als u slechts een enkele rij wilt retourneren, is dat niet nodig voor een record van ongedefinieerd type. @Kevin heeft al twee manieren laten zien. Ik zal een vereenvoudigde versie toevoegen met OUT
parameters:
CREATE OR REPLACE FUNCTION my_func(OUT a integer, OUT b text)
AS
$func$
BEGIN
a := ...;
b := ...;
END
$func$ LANGUAGE plpgsql;
U hoeft niet eens RETURN;
. toe te voegen in de hoofdtekst van de functie, de waarde van de gedeclareerde OUT
parameters worden automatisch geretourneerd aan het einde van de functie - NULL
voor elke parameter die niet is toegewezen.
En u hoeft RETURNS RECORD
niet te declareren want dat blijkt al uit de OUT
parameters.
Retourneer een reeks rijen
Als u daadwerkelijk meerdere wilt retourneren rijen (inclusief de mogelijkheid voor 0 of 1 rij), kunt u het retourtype definiëren als RETURNS
...
-
SETOF some_type
, waarsome_type
kan elk geregistreerd scalair of samengesteld type zijn. -
TABLE (col1 type1, col2 type2)
- een ad-hoc definitie van rijtype. -
SETOF record
plusOUT
parameters om kolomnamen en typen te definiëren.
100% gelijk aanRETURNS TABLE
. -
SETOF record
zonder verdere definitie. Maar dan zijn de geretourneerde rijen undefined en u moet bij elke oproep een kolomdefinitielijst toevoegen (zie voorbeeld).
De handleiding over het recordtype:
Recordvariabelen lijken op variabelen van het rijtype, maar ze hebben een niet-vooraf gedefinieerde structuur. Ze nemen de feitelijke rijstructuur aan van de rij die ze zijn toegewezen tijdens een SELECT- of FOR-commando.
Er is meer, lees de handleiding.
Je kunt een recordvariabele gebruiken zonder een gedefinieerd type toe te wijzen, kunt zelfs zulke ongedefinieerde records retourneren:
CREATE OR REPLACE FUNCTION my_func()
RETURNS SETOF record AS
$func$
DECLARE
r record;
BEGIN
r := (1::int, 'foo'::text); RETURN NEXT r; -- works with undefined record
r := (2::int, 'bar'::text); RETURN NEXT r;
END
$func$ LANGUAGE plpgsql;
Bel:
SELECT * FROM my_func() AS x(a int, b text);
Maar dit is erg onpraktisch omdat u bij elke oproep de kolomdefinitielijst moet verstrekken. Het kan over het algemeen worden vervangen door iets eleganters:
- Als u het type weet op het moment van het maken van een functie, declareer het dan meteen (
RETURNS TABLE
of vrienden).
CREATE OR REPLACE FUNCTION my_func()
RETURNS SETOF tbl_or_type AS
$func$
DECLARE
r tbl_or_type;
BEGIN
SELECT INTO tbl_or_type * FROM tbl WHERE id = 10;
RETURN NEXT r; -- type matches
SELECT INTO tbl_or_type * FROM tbl WHERE id = 12;
RETURN NEXT r;
-- Or simpler:
RETURN QUERY
SELECT * FROM tbl WHERE id = 14;
END
$func$ LANGUAGE plpgsql;
- Als je het type weet op het moment van de functieaanroep , zijn er elegantere manieren om polymorfe typen te gebruiken:
Refactor een PL/pgSQL-functie om de uitvoer van verschillende SELECT-query's te retourneren
Uw vraag is onduidelijk over wat u precies nodig heeft.