16.6. Расширение языка PL/pgSQL для автономных транзакций

Конструкция блока в 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 остаются в том же состоянии, в каком они были в момент ошибки, но все изменения в состоянии базы данных, произведённые данным блоком кода, откатываются назад.