Как проверить, была ли установлена точка сохранения перед выполнением отката?
У меня есть пакет Oracle, который просматривает список процедур и вызывает их динамически. Перед каждым вызовом процедуры создается SAVEPOINT, и, если возникает исключение, он выполняет откат и регистрирует проблему. Недавно была введена ошибка, когда к одной из динамических процедур был добавлен COMMIT, который при запуске отменяет действие SAVEPOINT. Если эта же процедура завершается ошибкой (вызывает исключение) и обработчик исключений вызывающего пакета пытается выполнить откат, в блоке обработчика исключений возникает следующее исключение:
ORA-01086: savepoint 'EXAMPLE_SAVEPOINT' never established in this session or is invalid
Теперь я мог бы добавить другой обработчик исключений в свой обработчик исключений, чтобы обработать это конкретное исключение, но было бы гораздо лучше, если бы я мог сделать быструю проверку SAVEPOINT, чтобы убедиться, что она действительна или нет непосредственно перед попыткой выдачи откатить. Это возможно?
1 ответ
Я думаю, тебе придется забыть об этом; извиняюсь. Кто-то задал этот вопрос Тому Кайту в апреле 2013 года, его ответ:
2) где oracle отслеживает создаваемую нами точку сохранения? И создается ли SCN для созданных точек сохранения?
и мы сказали...
...
2) точка сохранения - это просто концептуально указатель на ваш поток отмены. Нам не нужен SCN для этого, нам просто нужно знать, как далеко назад в вашем потоке отмены откатиться.
И Джонатан Льюис, и Берлесон не думают, что они хранятся где-либо в словаре данных. Если вы используете Workspace Manager или хотите использовать точки восстановления, тогда данные будут сохранены в ALL_WM_MODIFIED_TABLES и V$RESTORE_POINT соответственно, но это выглядит как перебор.