Доказателство за концепцията
ПРОЦЕДУРА
може връща стойности, но по много ограничен начин (от 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
- Какви са разликите между „Съхранени процедури“ и „Съхранени функции“?