Konzeptnachweis
Ein VERFAHREN
kann Rückgabewerte, aber in sehr begrenztem Umfang (ab Postgres 13).
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:
- Was ist in PostgreSQL der Unterschied zwischen einer „gespeicherten Prozedur“ und anderen Funktionstypen? ?
- Werden gespeicherte Prozeduren in Datenbanktransaktionen in Postgres ausgeführt?
- https ://www.2ndquadrant.com/en/blog/postgresql-11-server-side-procedures-part-1/#comment-72
- Was sind die Unterschiede zwischen „gespeicherten Prozeduren“ und „gespeicherten Funktionen“?