sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur returnerar man ett värde från en lagrad procedur (inte funktion)?

Proof of concept

En PROCEDUR kan returnera värden, men på ett mycket begränsat sätt (från och med Postgres 13).

Handboken om CALL :

Handboken om SKAPA PROCEDUR :

Så din användning av INOUT läget är korrekt. Men uppdraget i funktionskroppen saknas. Och vissa andra saker är fel / suboptimala. Jag föreslår:

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<>fiol här

Ta detta som proof of concept. Men jag ser ingenting i frågan som motiverar användningen av en PROCEDUR i första hand.

Du vill förmodligen ha en FUNKTION

En FUNKTION erbjuder fler alternativ för att returnera värden, behöver inte köras separat med CALL , och kan integreras i större frågor. Chansen är stor att det var vad du ville ha i första hand, och du blev bara vilseledd av den utbredda missvisande benämningen "lagrat förfarande". Se:

Dessutom, i den nuvarande formen, måste du tillhandahålla många brusparametrar om du vill uppdatera eller mjukta bort en rad. Vanliga SQL-kommandon kan göra jobbet. Eller separata funktioner ...

tumregeln :om du inte behöver hantera transaktioner inifrån vill du förmodligen använda en funktion istället för en procedur. Senare kan Postgres-procedurer utökas för att kunna och returnera flera resultatuppsättningar (enligt SQL-standard), men inte ännu (s. 13).

Se:




  1. Skickar en avgränsad sträng i NOT IN-satsen

  2. Lägg till IIS 7 AppPool-identiteter som SQL Server-inloggningar

  3. DATE_SUB() Exempel – MySQL

  4. Om RM-formatelementet i Oracle