Bukti konsep
PROCEDURE
bisa mengembalikan nilai, tetapi dengan cara yang sangat terbatas (pada Postgres 13).
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:
- Di PostgreSQL, apa perbedaan antara “Prosedur Tersimpan” dan jenis fungsi lainnya ?
- Apakah prosedur tersimpan berjalan dalam transaksi basis data di Postgres?
- https ://www.2ndquadrant.com/en/blog/postgresql-11-server-side-procedures-part-1/#comment-72
- Apa perbedaan antara “Prosedur Tersimpan” dan “Fungsi Tersimpan”?