Вы не можете сделать это. Функции PostgreSQL выполняются внутри внешней транзакции, и эта внешняя транзакция должна быть зафиксирована или откатана снаружи. Когда вы запускаете функцию из оператора SELECT
, тогда этот оператор выполняется в неявной транзакции (в режиме автоматической фиксации) или явной транзакции (когда автоматическая фиксация выключена). Кто начал эту транзакцию, значит, он должен завершить транзакцию.
Что вы можете:
вы можете вызвать исключение - если это исключение не обработано, то внешний оператор должен выполнить откат.
вы можете использовать пункт EXCEPTION WHEN
. Затем защищенный блок неявно объединяется с точкой сохранения. Когда обрабатывается любое исключение, то ядро использует неявно ROLLBACK TO savepoint
.
В любом случае, эта система отличается от той, которую вы знаете из MS-SQL или Oracle, и вы не можете использовать некоторые шаблоны, известные вам из Oracle. С другой стороны - дизайн Postgres очень прост.
В новом PostgreSQL 11 есть процедуры, и там вы можете использовать явные COMMIT
и ROLLBACK
.