sql >> Database >  >> RDS >> PostgreSQL

De tupelstructuur van een record declareren in PL/pgSQL

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 , waar some_type kan elk geregistreerd scalair of samengesteld type zijn.

  • TABLE (col1 type1, col2 type2) - een ad-hoc definitie van rijtype.

  • SETOF record plus OUT parameters om kolomnamen en typen te definiëren.
    100% gelijk aan RETURNS 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.



  1. PostgreSQL-schema maken

  2. MySQL versus MariaDB versus Percona Server:vergelijking van beveiligingsfuncties

  3. Snijpunt van meerdere arrays in PostgreSQL

  4. Top 30 SQL Query-interviewvragen die u moet oefenen in 2022