PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann ich einen Wert von einer gespeicherten Prozedur (keine Funktion) zurückgeben?

Konzeptnachweis

Ein VERFAHREN kann Rückgabewerte, aber in sehr begrenztem Umfang (ab Postgres 13).

Das Handbuch zu CALL :

Das Handbuch zu CREATE PROCEDURE :

Also Ihre Verwendung des INOUT Modus stimmt. Aber die Zuweisung im Funktionskörper fehlt. Und einige andere Dinge sind falsch / suboptimal. Ich schlage vor:

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

Betrachten Sie dies als Proof of Concept. Aber ich sehe nichts in der Frage, das die Verwendung eines PROCEDURE an erster Stelle.

Sie möchten wahrscheinlich eine FUNKTION

Eine FUNKTION bietet mehr Optionen zur Rückgabe von Werten, muss nicht separat mit CALL ausgeführt werden , und kann in größere Abfragen integriert werden. Die Chancen stehen gut, dass Sie das von Anfang an wollten, und Sie wurden nur durch die weit verbreitete Fehlbezeichnung "gespeicherte Prozedur" in die Irre geführt. Siehe:

Darüber hinaus müssen Sie in der aktuellen Form viele Rauschparameter angeben, wenn Sie eine Zeile aktualisieren oder vorläufig löschen möchten. Einfache SQL-Befehle könnten die Aufgabe erledigen. Oder getrennte Funktionen ...

Die Faustregel :Wenn Sie Transaktionen nicht von innen verwalten müssen, möchten Sie wahrscheinlich eine Funktion anstelle einer Prozedur verwenden. Später können Postgres-Prozeduren erweitert werden, um mehrere Ergebnismengen zurückgeben zu können (gemäß SQL-Standard), aber noch nicht (Seite 13).

Siehe: