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

Hvordan returnerer man en værdi fra en lagret procedure (ikke funktion)?

Proof of concept

En PROCEDURE kan returnere værdier, men på en meget begrænset måde (fra Postgres 13).

Manualen til CALL :

Manualen om OPRET PROCEDURE :

Så din brug af INOUT tilstand er korrekt. Men opgaven i funktionskroppen mangler. Og nogle andre ting er forkerte/suboptimale. Jeg foreslår:

CREATE OR REPLACE PROCEDURE public.spproductinsertupdatedelete(
  _ser        int
, _subcategid int
, _inrprice   numeric
, _usdprice   numeric
, _colour     int
, _size       int
, _qty        int
, INOUT _prod_id int DEFAULT NULL
)
  LANGUAGE plpgsql AS
$proc$
BEGIN
   CASE _ser    -- simpler than IF
   WHEN 1 THEN  -- INSERT
      INSERT INTO product
             (prod_subcateg_id, prod_inr_price, prod_usd_price, prod_colour, prod_size, prod_qty)
      VALUES (_subcategid     , _inrprice     , _usdprice     , _colour    , _size    , _qty    )
      RETURNING prod_id
      INTO _prod_id;   -- !!!

   WHEN 2 THEN  -- UPDATE
      UPDATE product
      SET   (prod_subcateg_id, prod_inr_price, prod_usd_price, prod_size, prod_colour, prod_qty)
          = (_subcategid     , _inrprice     , _usdprice     , _size    , _colour    , _qty)
      WHERE  prod_id = _prod_id;

   WHEN 3 THEN  -- soft-DELETE
      UPDATE product
      SET    prod_datetill = now()
      WHERE  prod_id = _prod_id;

   ELSE
      RAISE EXCEPTION 'Unexpected _ser value: %', _ser;
   END CASE;
END
$proc$;

db<>fiddle her

Tag dette som proof of concept. Men jeg kan ikke se noget i spørgsmålet, der berettiger brugen af ​​en PROCEDURE i første omgang.

Du vil sandsynligvis have en FUNKTION

En FUNKTION tilbyder flere muligheder for at returnere værdier, behøver ikke at køres separat med CALL , og kan integreres i større forespørgsler. Chancerne er, at det var det, du ønskede i første omgang, og du blev bare vildledt af den udbredte misvisende betegnelse "lagret procedure". Se:

Desuden skal du i den nuværende form angive mange støjparametre, hvis du vil opdatere eller soft-delete en række. Almindelige SQL-kommandoer kan gøre jobbet. Eller separate funktioner ...

tommelfingerreglen :hvis du ikke har brug for at administrere transaktioner indefra, vil du sandsynligvis bruge en funktion i stedet for en procedure. Senere kan Postgres-procedurer blive udvidet til at kunne og returnere flere resultatsæt (pr. SQL-standard), men ikke endnu (s. 13).

Se:




  1. Oracle IN vs Exists forskel?

  2. dato/klokkeslæt Konvertering mellem forskellige tidszoner

  3. Sådan modelleres mange-til-mange relationer i MongoDB (for en MySQL-bruger)

  4. Sådan repareres en MySQL-database i cPanel