Non è possibile uscire dallo script e rimanere in SQL * Plus, ma è possibile interrompere l'esecuzione. Non è bello, ma assumendo che tu possa modificare lo script per aggiungere il flusso di controllo, puoi farlo con la variabile bind.
set serveroutput on
var flag char;
exec :flag := 'Y';
begin
if :flag != 'Y' then
raise program_error;
end if;
dbms_output.put_line('Doing some work');
/* Check for some error condition */
if 0 != 1 then
raise program_error;
end if;
/* Only reach this if earlier statements didn't fail
* but could wrap in another flag check if needed */
dbms_output.put_line('Doing some more work');
exception
when program_error then
dbms_output.put_line(sqlerrm);
:flag := 'N';
when others then
/* Real exception handling, obviously */
dbms_output.put_line(sqlerrm);
:flag := 'N';
end;
/
-- DML only does anything if flag stayed Y
select sysdate from dual
where :flag = 'Y';
-- Optional status message at the end of the script, for DBA info
set feedback off
set head off
select 'Something went wrong' from dual where :flag != 'Y';
set feedback on
set head on
Quando eseguite:
SQL> @script
PL/SQL procedure successfully completed.
Doing some work
ORA-06501: PL/SQL: program error
PL/SQL procedure successfully completed.
no rows selected
Something went wrong
SQL>
eventuali blocchi PL/SQL nello script possono controllare lo stato della segnalazione alla partenza, e sollevare program_error
(proprio come un pratico pre-definito eccezione) per tornare indietro su. Qualsiasi cosa che errori all'interno di un blocco PL/SQL può aggiornare il flag della variabile di binding, direttamente o in un gestore di eccezioni. E qualsiasi DML non PL/SQL può avere una clausola aggiuntiva where
per controllare lo stato del flag, quindi se è stato impostato su N
quando viene raggiunta tale istruzione, non viene eseguito alcun lavoro. (Per un insert
immagino che significherebbe non usare il modulo values
).
Ciò che questo non può fare è gestire eventuali errori da istruzioni SQL semplici, ma non sono sicuro se questo è un problema. Se è così, è possibile che debbano essere modificati in SQL dinamico all'interno di un blocco PL/SQL.
fonte
2012-06-26 08:21:23
Di interesse perché non si suddividono gli script in uno script shell/batch e _use_ 'ogni volta che sqlerror esce? E quindi lo script di shell gestisce gli errori per decidere se continuare? – Ben
Perché ci sono un sacco di cose manuali che vorranno fare prima e/o dopo l'esecuzione dello script, incluso l'esecuzione di altri script, specifici per la situazione/ambiente/dati/ecc. Coinvolti. Questo è principalmente per sistemare le cose in produzione, e costantemente essere cacciato/dover riconnettersi è peggio che fastidioso quando il tuo sito non funziona. Non possono essere suddivisi in più script poiché i comandi SQLPlus utilizzano l'output dei comandi PL/SQL. – Thought