Proof of concept
En PROCEDURE
kan returnere værdier, men på en meget begrænset måde (fra Postgres 13).
Så din brug af INOUT
tilstand er korrekt. Men opgaven i funktionskroppen mangler. Og nogle andre ting er forkerte/suboptimale. Jeg foreslå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<>fiddle her
Tag dette som proof of concept. Men jeg kan ikke se noget i spørgsmålet, der berettiger brugen af en PROCEDURE
i første omgang.
Du vil sandsynligvis have en FUNKTION
En FUNKTION
tilbyder flere muligheder for at returnere værdier, behøver ikke at køres separat med CALL
, og kan integreres i større forespørgsler. Chancerne er, at det var det, du ønskede i første omgang, og du blev bare vildledt af den udbredte misvisende betegnelse "lagret procedure". Se:
Desuden skal du i den nuværende form angive mange støjparametre, hvis du vil opdatere eller soft-delete en række. Almindelige SQL-kommandoer kan gøre jobbet. Eller separate funktioner ...
tommelfingerreglen :hvis du ikke har brug for at administrere transaktioner indefra, vil du sandsynligvis bruge en funktion i stedet for en procedure. Senere kan Postgres-procedurer blive udvidet til at kunne og returnere flere resultatsæt (pr. SQL-standard), men ikke endnu (s. 13).
Se:
- Hvad er forskellen mellem en "lagret procedure" og andre typer funktioner i PostgreSQL ?
- Kører lagrede procedurer i databasetransaktion i Postgres?
- https ://www.2ndquadrant.com/en/blog/postgresql-11-server-side-procedures-part-1/#comment-72
- Hvad er forskellene mellem "lagrede procedurer" og "lagrede funktioner"?