Prueba de concepto
Un PROCEDURE
puede devuelve valores, pero de forma muy limitada (a partir de Postgres 13).
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:
- En PostgreSQL, ¿cuál es la diferencia entre un "procedimiento almacenado" y otros tipos de funciones? ?
- ¿Los procedimientos almacenados se ejecutan en transacciones de base de datos en Postgres?
- https ://www.2ndquadrant.com/en/blog/postgresql-11-server-side-procedures-part-1/#comment-72
- ¿Cuáles son las diferencias entre "Procedimientos almacenados" y "Funciones almacenadas"?