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ì?