Конструкция блока в PL/pgSQL расширена необязательным ключевым словом autonomous. Это позволяет выполнять всё тело функции как автономную транзакцию:
create function foo(x integer) returns integer as $$ begin autonomous return x; end; $$ language plpgsql;
или создать отдельный блок begin-end:
create or replace function myaudit() returns boolean as $$
begin autonomous
begin autonomous
insert into audit_schedule values ('new audit',now());
end;
... -- собственно произвести аудит
return true;
end;
$$ language plpgsql;Когда в блоке BEGIN AUTONOMOUS возникает исключение, автономная транзакция прерывается и начинается обычная процедура обработки исключения — стек поднимается до тех пор, пока это исключение не будет перехвачено каким-либо обработчиком. То есть исключения обрабатываются точно так же, как и с обычными подтранзакциями Postgres Pro Enterprise.
Когда ошибка перехватывается конструкцией EXCEPTION, локальные переменные функции PL/pgSQL остаются в том же состоянии, в каком они были в момент ошибки, но все изменения в состоянии базы данных, произведённые данным блоком кода, откатываются назад.