PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zwrócić wartość z procedury składowanej (nie funkcji)?

Dowód koncepcji

PROCEDURA może zwracają wartości, ale w bardzo ograniczonym zakresie (od Postgres 13).

Podręcznik CALL :

Podręcznik CREATE PROCEDURE :

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:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dodanie nowej wartości do istniejącego typu ENUM

  2. Czy w Spring Boot 2 można automatycznie wygenerować tabelę JoinTable z unikalnym ograniczeniem?

  3. R RPostgreSQL Połącz się ze zdalną bazą danych Postgres za pomocą SSL

  4. Npgsql z Pgbouncer na Kubernetes - łączenie i keepalive

  5. Zmień klucz podstawowy w tabeli PostgreSQL