Oracle
 sql >> Database >  >> RDS >> Oracle

Generazione di spool basata su condizioni nello script Oracle SQL

Se puoi inserire questa sezione di controllo nel proprio script, ad es. elcm_ctl.sql , potresti farlo:

accept run_it char format a1 prompt "Run the script?"

set termout off

whenever sqlerror exit success rollback
exec if upper(nvl('&run_it', 'N')) != 'Y' then raise no_data_needed; end if;
whenever sqlerror continue

spool c:\elcm.sql
select 'select sysdate from dual;' from dual;
spool off

set termout on

spool c:\elcm_details.spl
@c:\elcm.sql
spool off

Il accept comando è un po' più ordinato che fare affidamento su richieste di sostituzione, secondo me, ed è in qualche modo autodocumentante. Questo richiede all'utente la stringa specificata, anziché solo 'gen' . (In SQL*Plus puoi estenderlo e costringere l'utente a inserire un singolo carattere, chiedendo nuovamente se ha inserito qualcosa di più lungo; e il valore predefinito è 'N' se premono semplicemente Invio senza inserire nulla. Ma SQL Developer supporta solo un sottoinsieme della funzionalità).

Quindi un piccolo blocco anonimo genera un'eccezione - non importa quale - se il valore della variabile immesso non è 'y' o 'Y' . Mentre lo faccio ho set termout off quindi non vedi l'eccezione effettiva. E ho usato whenever sqlerror per fare in modo che lo script esca quando viene sollevata quell'eccezione, quindi tutto ciò che viene dopo non viene eseguito. Questo è tutto il resto nello script di controllo, non solo la query successiva, ma potresti avere diversi sub-script se dovessi essere più flessibile.

Ma in SQL Developer, termout funziona solo come previsto quando esegui tramite @ . Se esegui il contenuto di elcm_ctl.sql direttamente dal foglio di lavoro SQL vedrai l'eccezione sollevata, il che è un po' brutto. Quindi salva invece quello script di controllo e in un foglio di lavoro vuoto fai semplicemente:

@c:\elcm_ctl.sql

Esegui quel foglio di lavoro come uno script e ti verrà chiesto; se inserisci 'Y' vedrai l'output dello script nella finestra di output dello script (a meno che non lasci set termout off nello script di controllo) e creerà il file di spool. Se inserisci qualcos'altro, non eseguirà elcm.sql file, non mostrerà nulla nella finestra di output dello script e non creerà un file di spool.