PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara mengembalikan nilai dari prosedur tersimpan (bukan fungsi)?

Bukti konsep

PROCEDURE bisa mengembalikan nilai, tetapi dengan cara yang sangat terbatas (pada Postgres 13).

Manual tentang CALL :

Panduan tentang CREATE PROCEDURE :

Jadi Anda menggunakan INOUT modusnya benar. Tetapi penugasan di badan fungsi tidak ada. Dan beberapa hal lain yang salah/suboptimal. Saya sarankan:

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 di sini

Ambil ini sebagai bukti konsep. Tapi saya tidak melihat apa pun dalam pertanyaan yang menjamin penggunaan PROCEDURE di tempat pertama.

Anda mungkin menginginkan FUNCTION

Sebuah FUNCTION menawarkan lebih banyak opsi untuk mengembalikan nilai, tidak perlu dijalankan secara terpisah dengan CALL , dan dapat diintegrasikan dalam kueri yang lebih besar. Kemungkinannya adalah, itulah yang Anda inginkan sejak awal, dan Anda hanya disesatkan oleh "prosedur tersimpan" keliru yang tersebar luas. Lihat:

Selain itu, dalam bentuk saat ini, Anda harus menyediakan banyak parameter noise jika Anda ingin memperbarui atau menghapus baris. Perintah SQL biasa mungkin berhasil. Atau fungsi terpisah ...

Aturan praktis :jika Anda tidak perlu mengelola transaksi dari dalam, Anda mungkin ingin menggunakan fungsi daripada prosedur. Nanti, prosedur Postgres dapat diperluas untuk dapat dan mengembalikan beberapa set hasil (sesuai standar SQL), tetapi belum (hal 13).

Lihat:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sistem Rekomendasi untuk aplikasi toko buku

  2. Bagaimana Anda menemukan ukuran disk dari tabel Postgres / PostgreSQL dan indeksnya?

  3. Izin ditolak untuk hubungan

  4. Mustahil untuk Menginstal permata PG di mac saya dengan Mavericks

  5. Bagaimana Abs() Bekerja di PostgreSQL