PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да върна стойност от съхранена процедура (не функция)?

Доказателство за концепцията

ПРОЦЕДУРА може връща стойности, но по много ограничен начин (от Postgres 13).

Ръководството за CALL :

Ръководството за 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).

Вижте:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ScalikeJDBC:Пулът от връзки все още не е инициализиран. (име:'по подразбиране)

  2. PostgreSQL вложени JSON заявки

  3. Променете от SQLite към PostgreSQL в нов проект на Rails

  4. Пакетът „pgadmin4“ няма кандидат за инсталиране за Ubuntu 20.04

  5. Как да получа стойност от последния вмъкнат ред?