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

PostgreSQL không thể bắt đầu / kết thúc giao dịch trong PL / pgSQL

Một hàm plpgsql tự động chạy bên trong một giao dịch. Tất cả đều thành công hoặc tất cả đều thất bại. Hướng dẫn sử dụng:

Các hàm và thủ tục kích hoạt luôn được thực thi bên trong giao dịch được thiết lập bởi truy vấn bên ngoài - chúng không thể bắt đầu hoặc gửi giao dịch đó, vì sẽ không có ngữ cảnh để chúng thực thi. Tuy nhiên, một khối chứa EXCEPTION điều khoản hình thành một cách hiệu quả một giao dịch con có thể được quay trở lại mà không ảnh hưởng đến giao dịch bên ngoài. Để biết thêm về điều đó, hãy xem Phần 42.6.6.

Vì vậy, nếu cần, bạn có thể bắt gặp một trường hợp ngoại lệ về mặt lý thuyết có thể xảy ra (nhưng rất khó xảy ra).
Chi tiết về cách mắc lỗi trong sách hướng dẫn.

Chức năng của bạn đã được xem xét và đơn giản hóa:

CREATE FUNCTION foo(v_weather text
                  , v_timeofday text
                  , v_speed text
                  , v_behavior text)
  RETURNS SETOF custombehavior
  LANGUAGE plpgsql AS
$func$
BEGIN

DELETE FROM custombehavior
WHERE  weather = 'RAIN'
AND    timeofday = 'NIGHT'
AND    speed = '45MPH';

INSERT INTO custombehavior (weather, timeofday, speed, behavior)
SELECT v_weather, v_timeofday, v_speed, v_behavior
WHERE  NOT EXISTS (
   SELECT FROM defaultbehavior
   WHERE  a = 'RAIN'
   AND    b = 'NIGHT'
   AND    c = '45MPH'
   );

RETURN QUERY
SELECT * FROM custombehavior WHERE ... ;

END
$func$;

Nếu bạn thực sự cần bắt đầu / kết thúc giao dịch như được chỉ ra trong tiêu đề, hãy tìm đến thủ tục SQL trong Postgres 11 trở lên ( CREATE PROCEDURE ). 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ì?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Phát hiện xem hàng đã được cập nhật hoặc được chèn hay chưa

  2. PostgreSQL có thể lập chỉ mục các cột mảng không?

  3. Quan hệ được chuyển đến # hoặc phải tương thích về cấu trúc. Các giá trị không tương thích:[:reference]

  4. Rails tự động gán id đã tồn tại

  5. Làm cách nào để tạo cơ sở dữ liệu mới với phần mở rộng hstore đã được cài đặt?