Preuve de concept
Une PROCEDURE
peut valeurs de retour, mais de manière très limitée (à partir de Postgres 13).
Le manuel sur CREATE PROCEDURE
:
Donc, votre utilisation de la INOUT
mode est correct. Mais l'affectation dans le corps de la fonction est manquante. Et certaines autres choses sont fausses / sous-optimales. Je suggère :
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<>violon ici
Prenez cela comme une preuve de concept. Mais je ne vois rien dans la question justifiant l'utilisation d'une PROCEDURE
en premier lieu.
Vous voulez probablement une FUNCTION
Une FUNCTION
offre plus d'options pour renvoyer des valeurs, n'a pas besoin d'être exécuté séparément avec CALL
, et peut être intégré dans des requêtes plus importantes. Il y a de fortes chances que ce soit ce que vous vouliez en premier lieu, et vous étiez simplement induit en erreur par l'appellation erronée et répandue de "procédure stockée". Voir :
De plus, dans le formulaire actuel, vous devez fournir de nombreux paramètres de bruit si vous souhaitez mettre à jour ou supprimer en douceur une ligne. Les commandes SQL simples peuvent faire l'affaire. Ou des fonctions séparées...
La règle empirique :si vous n'avez pas besoin de gérer les transactions depuis l'intérieur, vous voudrez probablement utiliser une fonction au lieu d'une procédure. Plus tard, les procédures Postgres peuvent être étendues pour pouvoir et renvoyer plusieurs ensembles de résultats (selon la norme SQL), mais pas encore (pg 13).
Voir :
- Dans PostgreSQL, quelle est la différence entre une "procédure stockée" et d'autres types de fonctions ? ?
- Les procédures stockées s'exécutent-elles dans les transactions de base de données dans Postgres ?
- https ://www.2ndquadrant.com/en/blog/postgresql-11-server-side-procedures-part-1/#comment-72
- Quelles sont les différences entre les "procédures stockées" et les "fonctions stockées" ?