Proof of concept
En PROCEDUR
kan returnera värden, men på ett mycket begränsat sätt (från och med Postgres 13).
Så din användning av INOUT
läget är korrekt. Men uppdraget i funktionskroppen saknas. Och vissa andra saker är fel / suboptimala. Jag föreslår:
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<>fiol här
Ta detta som proof of concept. Men jag ser ingenting i frågan som motiverar användningen av en PROCEDUR
i första hand.
Du vill förmodligen ha en FUNKTION
En FUNKTION
erbjuder fler alternativ för att returnera värden, behöver inte köras separat med CALL
, och kan integreras i större frågor. Chansen är stor att det var vad du ville ha i första hand, och du blev bara vilseledd av den utbredda missvisande benämningen "lagrat förfarande". Se:
Dessutom, i den nuvarande formen, måste du tillhandahålla många brusparametrar om du vill uppdatera eller mjukta bort en rad. Vanliga SQL-kommandon kan göra jobbet. Eller separata funktioner ...
tumregeln :om du inte behöver hantera transaktioner inifrån vill du förmodligen använda en funktion istället för en procedur. Senare kan Postgres-procedurer utökas för att kunna och returnera flera resultatuppsättningar (enligt SQL-standard), men inte ännu (s. 13).
Se:
- Vad är skillnaden mellan en "Lagrad procedur" och andra typer av funktioner i PostgreSQL ?
- Körs lagrade procedurer i databastransaktioner i Postgres?
- https ://www.2ndquadrant.com/en/blog/postgresql-11-server-side-procedures-part-1/#comment-72
- Vilka är skillnaderna mellan "Lagrade procedurer" och "Lagrade funktioner"?