In base alla domanda, non sono d'accordo con la risposta accettata. La domanda mostra uno script batch con più istruzioni. RAISE_APPLICATION_ERROR() esce solo da un blocco PL/SQL (sottoprogramma), non dallo script generale (come indicato da Justin), quindi continuerà con le istruzioni che seguono.
Per gli script batch, è preferibile utilizzare WHENEVER SQLERROR EXIT. Sì, è una direttiva SQL * Plus, non SQL standard, ma è abbastanza portatile; i più diffusi strumenti Oracle che supportano gli script supportano questa direttiva, almeno in parte. Il seguente esempio funziona in SQL * Plus, SQL * Developer, Toad, SQLsmith e possibilmente altri, e dimostra il problema, se si commenta la line out.
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;
/
Se si rimuove la QUANDO SQLERROR, lo script continuerà ed eseguire il 2 ° blocco, ecc, che è esattamente ciò che la domanda chiede di evitare.
Il vantaggio, in questo caso, degli strumenti grafici che emulano sqlplus, è che interrompono realmente lo script e non inviano il resto dello script alla shell dei comandi come comandi della shell, che è ciò che accade se si incolla script in SQL * Plus in esecuzione in una finestra della console. SQL * Plus può uscire in caso di errore, ma i restanti comandi bufferizzati saranno quindi gestiti dalla shell del sistema operativo, che è un po 'caotico e potenzialmente rischioso, se nei commenti sono presenti comandi di shell (che non è inaudito). Con SQLPlus, è sempre meglio connettersi, quindi eseguire lo script o passarlo nell'argomento < start> command line (sqlplus scott/tiger @ foo.sql) per evitare questo.
Stai davvero parlando di uno script PL/SQL? O uno script SQL * Plus? Non è possibile avere una dichiarazione DDL in PL/SQL (a meno che non la si inserisca in un 'ESEGUI IMMEDIATO'). Quindi mi sembra che tu stia parlando di uno script SQL * Plus. Se si sta parlando di uno script SQL * Plus, se il blocco PL/SQL si guasta, SQL * Plus continuerà per impostazione predefinita a eseguire la successiva istruzione SQL (o blocco PL/SQL) nello script. Dovresti utilizzare il comando SQL * Plus 'WHENEVER SQLERROR EXIT'. –
Grazie per il tuo commento Justin. In realtà non sono un "Oracle Expert", anche se ho una buona conoscenza del DBMS in generale. Quindi non ho ancora compreso la differenza tra gli script PL/SQL o SQL * Plus (conosci qualche blog/doc/sito che spiega chiaramente questa differenza?). Tutto quello che posso dire è che sto usando ** Navicat **, usando il pannello "query" e caricando il mio file di script al suo interno. In quel contesto specifico, 'RAISE_APPLICATION_ERROR()' fa il lavoro. –