В соответствии с документацией (https://www.postgresql.org/docs/current/app-psql.html), даже при отключенном AUTOCOMMIT
PSQL выдает неявный BEGIN
непосредственно перед любой командой, которая еще не находится в блоке транзакции и сама не является BEGIN
или другая команда управления транзакциями, или команда, которая не может быть выполнена внутри блока транзакции, например VACUUM
. (К сожалению, CALL
не обрабатывается так же, как VACCUM
). И, согласно Шону Томасу (https://blog.2ndquadrant.com/pg-phriday-stored-procedures-postgres-11/), ошибка недействительного завершения транзакции происходит из-за невозможности закрыть текущую транзакцию (в данном случае инициированную PSQL) изнутри процедуры. Я пробовал все параметры PSQL, связанные с управлением транзакциями, но со всеми ними возникает ошибка завершения недопустимой транзакции, даже если файл команд, обрабатываемый PSQL, содержит только оператор CALL
.
Это процедура, которую я вызываю:
create or replace procedure producto$cargar_imagenes(_super$ bigint, _archivo$ character varying) as $$
declare
_msg character varying;
_log rastro_proceso%ROWTYPE;
begin
perform rastro_proceso_temporal$insert(_super$);
perform producto$cargar_imagenes$biz(_super$, _archivo$);
if (_super$ is not null and _super$ > 0) then
perform producto$cargar_imagenes$log(_super$, _archivo$);
else
perform tarea_usuario$private$update(6519204281880642486, null);
end if;
commit;
end;
$$ language plpgsql set search_path = public;
Ошибка в операторе commit
; это работает, если я закомментирую это.