Dowód koncepcji
PROCEDURA
może zwracają wartości, ale w bardzo ograniczonym zakresie (od Postgres 13).
Więc używasz INOUT
tryb jest poprawny. Brakuje jednak przypisania w treści funkcji. A niektóre inne rzeczy są złe / nieoptymalne. Proponuję:
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 tutaj
Potraktuj to jako dowód koncepcji. Ale nie widzę nic w pytaniu, które uzasadniałoby użycie PROCEDURA
przede wszystkim.
Prawdopodobnie chcesz FUNKCJĘ
FUNKCJA
oferuje więcej opcji zwracania wartości, nie musi być uruchamiany oddzielnie za pomocą CALL
i można je zintegrować z większymi zapytaniami. Są szanse, że właśnie tego chciałeś w pierwszej kolejności, a po prostu zwodziła cię rozpowszechniona, myląca „procedura przechowywana”. Zobacz:
Co więcej, w obecnej formie musisz podać wiele parametrów szumu, jeśli chcesz zaktualizować lub delikatnie usunąć wiersz. Zwykłe polecenia SQL mogą załatwić sprawę. Lub oddzielne funkcje ...
Zasada kciuka :jeśli nie potrzebujesz zarządzać transakcjami od wewnątrz, prawdopodobnie chcesz użyć funkcji zamiast procedury. Później procedury Postgresa mogą zostać rozszerzone, aby mogły i zwracać wiele zestawów wyników (zgodnie ze standardem SQL), ale jeszcze nie (str. 13).
Zobacz:
- Jaka jest różnica między „procedurą składowaną” w PostgreSQL a innymi typami funkcji ?
- Czy procedury składowane działają w transakcji bazy danych w Postgresie?
- https ://www.2ndquadrant.com/en/blog/postgresql-11-server-side-procedures-part-1/#comment-72
- Jakie są różnice między „procedurami przechowywanymi” a „funkcjami przechowywanymi”?