sql >> Database >  >> RDS >> PostgreSQL

Hoe kan ik een waarde teruggeven van een opgeslagen procedure (geen functie)?

Bewijs van concept

Een PROCEDURE kan retourneert waarden, maar op een zeer beperkte manier (vanaf Postgres 13).

De handleiding over CALL :

De handleiding over CREATE PROCEDURE :

Dus uw gebruik van de INOUT modus klopt. Maar de toewijzing in de functietekst ontbreekt. En sommige andere dingen zijn verkeerd / suboptimaal. Ik stel voor:

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 hier

Neem dit als proof of concept. Maar ik zie niets in de vraag die het gebruik van een PROCEDURE in de eerste plaats.

U wilt waarschijnlijk een FUNCTIE

Een FUNCTIE biedt meer opties om waarden te retourneren, hoeft niet afzonderlijk te worden uitgevoerd met CALL , en kan worden geïntegreerd in grotere zoekopdrachten. De kans is groot dat je dat in de eerste plaats wilde, en je werd gewoon misleid door de wijdverbreide verkeerde benaming "opgeslagen procedure". Zie:

Bovendien moet u in de huidige vorm veel ruisparameters opgeven als u een rij wilt bijwerken of zacht wilt verwijderen. Gewone SQL-commando's zouden het werk kunnen doen. Of afzonderlijke functies ...

De vuistregel :als u transacties niet van binnenuit hoeft te beheren, wilt u waarschijnlijk een functie gebruiken in plaats van een procedure. Later kunnen Postgres-procedures worden uitgebreid om meerdere resultatensets te kunnen retourneren (volgens SQL-standaard), maar nog niet (pg 13).

Zie:




  1. PostgreSQL-logboekanalyse met pgBadger

  2. Anorm Mysql Stored Procedure aanroepen

  3. Postgres-fout bij invoegen - ERROR:ongeldige bytereeks voor codering van UTF8:0x00

  4. Is dit een veilige/sterke ontsmettingsfunctie voor invoer?