У меня есть процедура PL/SQL (в базе данных Oracle 12c), которая пытается вставить некоторые данные. Если это не удается, он должен проверить таблицу, чтобы узнать, можно ли найти там какую-либо информацию, которая поможет решить проблему. Если он находит информацию, все в порядке, если нет, он должен повторно вызвать ошибку.
Это мой код:
BEGIN
-- Try to insert some data.
INSERT INTO table VALUES x;
EXCEPTION
WHEN OTHERS THEN
BEGIN
-- Check a table to fins some info to help solve the problem.
-- If we find a row here, we can fix it.
-- If not, we should reraise the error.
SELECT * INTO y FROM table WHERE a = b;
-- Do some more stuff here to fix the problem.
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- We could not find anything in the table,
-- so we could not handle the situation.
-- Reraise the error.
RAISE;
END;
END;
Проблема здесь в том, что оператор RAISE;
вызывает самое последнее исключение, то есть NO_DATA_FOUND
, которое выдало оператор SELECT
. Исходное исключение из INSERT
находится ниже в стеке, но не наверху.
Можно ли как-то "спасти" ошибку от INSERT
и переподнять? Или я могу запустить SELECT INTO
, который не выдает ошибку, если ничего не находит? Моя цель здесь - повторно вызвать исходное исключение INSERT
без каких-либо следов исключения NO_DATA_FOUND
.
EDIT: См. комментарии о том, почему это не дубликат.
RAISE
. Я уже делаю это, но я хочу вызвать исходную ошибку, а не ту, которая возникла в блоке исключений. - person Anders   schedule 12.11.2015