Вопрос:
Я использую три оператора insert, и если в третьем выражении есть ошибка, я хочу откат первого и второго. Если нет способа сделать это, пожалуйста, скажите мне другой подход, чтобы справиться с этим в PostgresqQL.
Если я использую COMMIT или ROLLBACK, я получаю сообщение об ошибке.
CREATE OR REPLACE FUNCTION TEST1 () RETURNS VOID LANGUAGE ‘plpgsql’ AS $$ BEGIN INSERT INTO table1 VALUES (1); INSERT INTO table1 VALUES (2); INSERT INTO table1 VALUES (‘A’); COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; END;$$;
Вышеприведенный код не работает; COMMIT и ROLLBACK не поддерживаются функциями PostgreSQL.
Лучший ответ:
Вы не можете использовать операторы транзакций, такие как SAVEPOINT, COMMIT или ROLLBACK в функции.
BEGIN который запускает блок в PL/pgSQL, отличается от инструкции BEGIN SQL, которая запускает транзакцию.
Просто удалите COMMIT из своей функции, и у вас есть решение: поскольку вся функция всегда выполняется внутри одной транзакции, любая ошибка в третьем выражении приведет к ROLLBACK который также отменяет первые два оператора.