Прервать программу PL/SQL
Как мне заставить программу PL/SQL заканчиваться на полпути? Я не смог найти способ изящно завершить программу, если возникает исключение - если я ее обработаю, он возвращается обратно в код.
В принципе, я хочу, чтобы приложение не запускалось в определенных условиях. Итак, я хочу добавить что-то вроде этого в начало программы:
BEGIN
IF [condition]
EXIT
END IF
[the rest of the program]
END
Предлагаемый способ заключается в том, чтобы генерировать исключение, но блок может быть внутренним блоком, поэтому программа за пределами блока просто продолжает двигаться.
Ответы
Ответ 1
Вы можете использовать RETURN
[email protected]> set serveroutput on
[email protected]> !cat test.sql
BEGIN
IF 1 = 1 THEN
DBMS_OUTPUT.PUT_LINE('ABOUT TO EXIT');
RETURN;
END IF;
DBMS_OUTPUT.PUT_LINE('DID NOT EXIT');
END;
[email protected]> @test
8 /
ABOUT TO EXIT
PL/SQL procedure successfully completed.
[email protected]>
Ответ 2
Я знаю, что слишком поздно отвечать, но у меня есть еще один способ, который не упоминается в предыдущих ответах.
Используйте RAISE_APPLICATION_ERROR и поймайте это исключение в разделе EXCEPTION.
Поскольку это откатывает незафиксированные транзакции, убедитесь, что они явно переданы, если требуется.
Таким образом, вы можете изящно вернуться из программы, а не выполнять обработку исключений в блоке IF, когда используете RETURN.
Я использовал это для справки.
http://www.plsql-tutorial.com/plsql-exception-handling.htm
Ответ 3
Если вы создаете исключение, которое блок не обрабатывает, исключение всегда возникает для вызывающего. Таким образом, самый простой способ остановить обработку - это вызвать исключение, которое не обрабатывается нигде в стеке вызовов.
например.
DECLARE
e_halt_processing EXCEPTION;
BEGIN
IF [condition] THEN
RAISE e_halt_processing;
END IF;
[the rest of the program]
END;
Ответ 4
Я не знаю PL/SQL, но почему бы вам не попробовать (используя ваши слова):
BEGIN
IF [!condition]
[the rest of the program]
END IF
END
Просто думая
Ответ 5
Пока вы используете последовательные (не вложенные) блоки pl/sql и отдельную обработку исключений, тогда RAISE работает отлично.
Если вы выполняете чрезмерные исключения во вложенных блоках, остерегайтесь состояния гонки.