Въпросът показва пакетен скрипт с множество изрази. RAISE_APPLICATION_ERROR() излиза само от PL/SQL блок (подпрограма), а не от цялостния скрипт (както е посочено от Джъстин), така че ще продължи с изразите, които следват.
За групови скриптове е най-добре да използвате WHENEVER SQLERROR EXIT. Да, това е директива SQLPlus, а не стандартен SQL, но е доста преносим; повечето популярни инструменти на Oracle, които поддържат скриптове, поддържат тази директива, поне частично. Следният пример работи в SQL Освен това, 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;
/
Ако премахнете WHEN SQLERROR, скриптът ще продължи и ще изпълни 2-ри блок и т.н., което е точно това, което въпросът изисква да избягвате.
Предимството, в този случай, на графичните инструменти, които емулират sqlplus, е, че те наистина спират скрипта и не изпращат остатъка от скрипта на командната обвивка като команди на обвивката, което се случва, ако поставите скриптове в SQLПлюс стартиране в конзолен прозорец. SQL Plus може да излезе при грешка, но останалите буферирани команди ще бъдат обработени от обвивката на OS, което е малко объркващо и потенциално рисковано, ако сте имали команди на обвивката в коментарите (което не е нечувано). С SQLPlus винаги е най-добре да се свържете и след това да изпълните скрипта или да го предадете в аргумента на командния ред