Доказателство за концепцията
ПРОЦЕДУРА
може връща стойности, но по много ограничен начин (от Postgres 13).
Ръководството за CREATE PROCEDURE :
Така че вашето използване на INOUT
режимът е правилен. Но присвояването в тялото на функцията липсва. И някои други неща са грешни / неоптимални. Предлагам:
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 тук
Приемете това като доказателство за концепцията. Но не виждам нищо във въпроса, което да оправдава използването на PROCEDURE
на първо място.
Вероятно искате ФУНКЦИЯ
ФУНКЦИЯ
предлага повече опции за връщане на стойности, не е необходимо да се изпълнява отделно с CALL
и може да се интегрира в по-големи заявки. Вероятно това е, което сте искали на първо място и просто сте били подведени от широко разпространеното погрешно наименование „съхранена процедура“. Вижте:
Освен това в текущата форма трябва да предоставите много шумови параметри, ако искате да актуализирате или меко изтриете ред. Обикновените SQL команди може да свършат работа. Или отделни функции ...
Основното правило :ако не е необходимо да управлявате транзакции отвътре, вероятно искате да използвате функция вместо процедура. По-късно процедурите на Postgres могат да бъдат разширени, за да могат и да връщат множество набори от резултати (по SQL стандарт), но все още не (стр. 13).
Вижте:
- В PostgreSQL каква е разликата между „съхранена процедура“ и други типове функции ?
- Запомнените процедури изпълняват ли се в транзакция на база данни в Postgres?
- https ://www.2ndquadrant.com/en/blog/postgresql-11-server-side-procedures-part-1/#comment-72
- Какви са разликите между „Съхранени процедури“ и „Съхранени функции“?