PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment renvoyer une valeur à partir d'une procédure stockée (pas de fonction) ?

Preuve de concept

Une PROCEDURE peut valeurs de retour, mais de manière très limitée (à partir de Postgres 13).

Le manuel sur CALL :

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 :