Bewijs van concept
Een PROCEDURE
kan retourneert waarden, maar op een zeer beperkte manier (vanaf Postgres 13).
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:
- Wat is in PostgreSQL het verschil tussen een 'opgeslagen procedure' en andere soorten functies ?
- Worden opgeslagen procedures uitgevoerd in databasetransacties in Postgres?
- https ://www.2ndquadrant.com/en/blog/postgresql-11-server-side-procedures-part-1/#comment-72
- Wat zijn de verschillen tussen "Opgeslagen procedures" en "Opgeslagen functies"?