PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm thế nào để trả về một giá trị từ một thủ tục được lưu trữ (không phải hàm)?

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 sử dụng CALL :

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:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Yii Framework:Không thể tìm thấy bảng cho lớp bản ghi đang hoạt động trong cơ sở dữ liệu

  2. psycopg2 rò rỉ bộ nhớ sau khi truy vấn lớn

  3. Nhận thời gian với múi giờ từ thời gian không có múi giờ và tên múi giờ

  4. Có ai đã thành công khi sử dụng một ngôn ngữ cụ thể cho cơ sở dữ liệu PostgreSQL để so sánh văn bản không phân biệt chữ hoa chữ thường không?

  5. Tổng hợp kết nối PostgreSQL:Phần 2 - PgBouncer