Исходя из вопроса, я не согласен с принятым ответом. Вопрос показывает пакетный скрипт с несколькими утверждениями. RAISE_APPLICATION_ERROR () выходит только из блока PL / SQL (подпрограммы), а не из общего сценария (как указал Джастин), поэтому он продолжит выполнение следующих операторов.
Для пакетных сценариев лучше всего использовать WHENEVER SQLERROR EXIT. Да, это директива SQL * Plus, не стандартная SQL, но довольно переносимая; большинство популярных инструментов Oracle, поддерживающих скрипты, поддерживают эту директиву, по крайней мере, частично. Следующий пример работает в SQL * Plus, SQL * Developer, Toad, SQLsmith и, возможно, других, и демонстрирует проблему, если вы закомментируете строку.
set serveroutput on
-- Without this line, things keep going
WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK;
BEGIN
IF (1 > 0) THEN
DBMS_OUTPUT.PUT_LINE('First thing');
RAISE_APPLICATION_ERROR(-20000, 'Test failed'); -- not enough
END IF;
END;
/
-- This will execute if you remove WHEN SQLERROR.., so RAISE_APPLICATION_ERROR is not enough
BEGIN
DBMS_OUTPUT.PUT_LINE('Second thing - Executes anyway');
END;
/
Если вы удалите WHER SQLERROR, сценарий продолжит работу и выполнит 2-й блок и т. Д., И это именно то, чего просит вопрос.
Преимущество, в данном случае, графических инструментов, эмулирующих sqlplus, заключается в том, что они действительно останавливают сценарий и не отправляют оставшуюся часть сценария в командную оболочку в качестве команд оболочки, что и происходит, если вы вставляете сценарии в SQL * Plus работает в окне консоли. SQL * Plus может завершиться в случае ошибки, но оставшиеся буферизованные команды будут затем обрабатываться оболочкой ОС, которая немного запутана и потенциально опасна, если в комментариях были команды оболочки (что не случайно). Во избежание этого в SQLPlus всегда лучше подключиться, а затем выполнить скрипт или передать его в аргументе командной строки (sqlplus scott / tiger @ foo.sql).