sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo devolver un valor de un procedimiento almacenado (no función)?

Prueba de concepto

Un PROCEDURE puede devuelve valores, pero de forma muy limitada (a partir de Postgres 13).

El manual sobre CALL :

El manual sobre CREATE PROCEDURE :

Así que tu uso del INOUT el modo es correcto. Pero falta la asignación en el cuerpo de la función. Y algunas otras cosas están mal / subóptimas. Sugiero:

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 aquí

Toma esto como prueba de concepto. Pero no veo nada en la pregunta que justifique el uso de un PROCEDURE en primer lugar.

Probablemente quieras una FUNCTION

Una FUNCTION ofrece más opciones para devolver valores, no necesita ejecutarse por separado con CALL , y se puede integrar en consultas más grandes. Lo más probable es que eso es lo que quería en primer lugar, y simplemente estaba siendo engañado por el nombre inapropiado generalizado "procedimiento almacenado". Ver:

Además, en el formulario actual, debe proporcionar muchos parámetros de ruido si desea actualizar o eliminar temporalmente una fila. Los comandos SQL simples podrían hacer el trabajo. O funciones separadas...

La regla general :si no necesita administrar transacciones desde adentro, probablemente desee usar una función en lugar de un procedimiento. Más adelante, los procedimientos de Postgres pueden ampliarse para poder devolver múltiples conjuntos de resultados (según el estándar SQL), pero aún no (pág. 13).

Ver: