функция plpgsql автоматично се изпълнява в транзакция. Всичко е успешно или всичко се проваля. Ръководството:
Функциите и тригерните процедури винаги се изпълняват в рамките на транзакция, установена от външна заявка — те не могат да стартират или да извършат тази транзакция, тъй като няма да има контекст, в който да се изпълняват. Въпреки това, блок, съдържащ
EXCEPTION
клауза ефективно формира подтранзакция, която може да бъде върната назад, без да се засяга външната транзакция. За повече информация вижте раздел 42.6.6.
Така че, ако трябва, можете да хванете изключение, което теоретично може да възникне (но е много малко вероятно).
Подробности за прихващането на грешки в ръководството.
Вашата функция е прегледана и опростена:
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$;
Ако наистина трябва да започвате/прекратявате транзакции както е посочено в заглавието, погледнете SQL процедурите в Postgres 11 или по-нова версия (CREATE PROCEDURE
). Вижте:
- В PostgreSQL каква е разликата между „запомнена процедура“ и други типове функции?