Důkaz konceptu
PROCEDURE
může návratové hodnoty, ale velmi omezeným způsobem (od Postgres 13).
Takže vaše použití INOUT
režim je správný. Chybí ale přiřazení v těle funkce. A některé další věci jsou špatné/neoptimální. Navrhuji:
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 zde
Berte to jako důkaz konceptu. V otázce však nevidím nic, co by opravňovalo k použití PROCEDURE
na prvním místě.
Pravděpodobně budete chtít FUNCTION
FUNCTION
nabízí více možností pro návrat hodnot, není nutné jej spouštět samostatně pomocí CALL
a lze je integrovat do větších dotazů. Je pravděpodobné, že to je to, co jste chtěli na prvním místě, a byli jste jen uvedeni v omyl rozšířeným nesprávným pojmenováním „uložená procedura“. Viz:
Navíc v aktuální podobě musíte zadat mnoho parametrů šumu, pokud chcete aktualizovat nebo jemně smazat řádek. Úlohu mohou provést obyčejné příkazy SQL. Nebo samostatné funkce ...
Pravidlo :pokud nepotřebujete spravovat transakce zevnitř, pravděpodobně budete chtít místo procedury použít funkci. Později mohou být procedury Postgres rozšířeny tak, aby umožňovaly a vracely více sad výsledků (podle standardu SQL), ale zatím ne (str. 13).
Viz:
- Jaký je v PostgreSQL rozdíl mezi „uloženou procedurou“ a jinými typy funkcí ?
- Spouštějí se uložené procedury v databázové transakci v Postgresu?
- https ://www.2ndquadrant.com/en/blog/postgresql-11-server-side-procedures-part-1/#comment-72
- Jaké jsou rozdíly mezi „Uloženými procedurami“ a „Uloženými funkcemi“?