Bằng chứng về khái niệm
PROCEDURE
can trả về giá trị, nhưng theo một cách rất hạn chế (kể từ Postgres 13).
Hướng dẫn về CREATE PROCEDURE
:
Vì vậy, việc bạn sử dụng INOUT
chế độ là chính xác. Nhưng sự phân công trong cơ quan chức năng bị thiếu. Và một số điều khác là sai / chưa tối ưu. Tôi đề nghị:
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 tại đây
Hãy coi đây là bằng chứng về khái niệm. Nhưng tôi không thấy câu hỏi nào đảm bảo việc sử dụng PROCEDURE
ở vị trí đầu tiên.
Bạn có thể muốn có một FUNCTION
FUNCTION
cung cấp nhiều tùy chọn hơn để trả về giá trị, không cần phải chạy riêng với CALL
, và có thể được tích hợp trong các truy vấn lớn hơn. Rất có thể, đó là những gì bạn muốn ngay từ đầu, và bạn chỉ đang bị đánh lừa bởi "thủ tục lưu trữ" phổ biến. Xem:
Hơn nữa, trong biểu mẫu hiện tại, bạn phải cung cấp nhiều tham số nhiễu nếu bạn muốn cập nhật hoặc xóa mềm một hàng. Các lệnh SQL thuần túy có thể thực hiện công việc. Hoặc các chức năng riêng biệt ...
Quy tắc ngón tay cái :nếu bạn không cần quản lý các giao dịch từ bên trong, bạn có thể muốn sử dụng một hàm thay vì một thủ tục. Sau đó, các thủ tục Postgres có thể được mở rộng để có thể và trả về nhiều bộ kết quả (theo tiêu chuẩn SQL), nhưng chưa (trang 13).
Xem:
- Trong PostgreSQL, sự khác biệt giữa “Thủ tục được lưu trữ” và các loại hàm khác là gì ?
- Các thủ tục được lưu trữ có chạy trong giao dịch cơ sở dữ liệu trong Postgres không?
- https ://www.2ndquadrant.com/en/blog/postgresql-11-server-side-procedures-part-1/#comment-72
- Sự khác biệt giữa “Thủ tục được lưu trữ” và “Hàm được lưu trữ” là gì?