sql >> Databáze >  >> RDS >> PostgreSQL

Jak vrátit hodnotu z uložené procedury (ne funkce)?

Důkaz konceptu

PROCEDURE může návratové hodnoty, ale velmi omezeným způsobem (od Postgres 13).

Příručka pro CALL :

Příručka k CREATE PROCEDURE :

Takže vaše použití INOUT režim je správný. Chybí ale přiřazení v těle funkce. A některé další věci jsou špatné/neoptimální. Navrhuji:

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 zde

Berte to jako důkaz konceptu. V otázce však nevidím nic, co by opravňovalo k použití PROCEDURE na prvním místě.

Pravděpodobně budete chtít FUNCTION

FUNCTION nabízí více možností pro návrat hodnot, není nutné jej spouštět samostatně pomocí CALL a lze je integrovat do větších dotazů. Je pravděpodobné, že to je to, co jste chtěli na prvním místě, a byli jste jen uvedeni v omyl rozšířeným nesprávným pojmenováním „uložená procedura“. Viz:

Navíc v aktuální podobě musíte zadat mnoho parametrů šumu, pokud chcete aktualizovat nebo jemně smazat řádek. Úlohu mohou provést obyčejné příkazy SQL. Nebo samostatné funkce ...

Pravidlo :pokud nepotřebujete spravovat transakce zevnitř, pravděpodobně budete chtít místo procedury použít funkci. Později mohou být procedury Postgres rozšířeny tak, aby umožňovaly a vracely více sad výsledků (podle standardu SQL), ale zatím ne (str. 13).

Viz:




  1. Použití jako v MySQL pro vyhledávací operace pomocí vzoru

  2. Jak vkládat data přímo z Excelu do databáze Oracle

  3. com.mysql.jdbc.exceptions.MySQLSyntaxErrorException při použití PreparedStatement

  4. MySQL načte proměnnou z uložené procedury v PHP PDO