Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Geração de spool baseada em condição no script Oracle SQL


Se você puder colocar esta seção de controle em seu próprio script, por exemplo, elcm_ctl.sql , você poderia fazer isso:
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

O accept comando é um pouco mais limpo do que confiar em prompts de substituição, na minha opinião, e é um pouco auto-documentado. Isso solicita ao usuário a string especificada, em vez de apenas 'gen' . (No SQL*Plus, você pode estender isso e forçar o usuário a inserir um único caractere, solicitando novamente se ele inserir algo mais; e o padrão para 'N' se ele apenas pressionar return sem inserir nada. Mas o SQL Developer suporta apenas um subconjunto da funcionalidade).

Em seguida, um pequeno bloco anônimo lança uma exceção - realmente não importa qual - se o valor da variável inserida não for 'y' ou 'Y' . Enquanto isso, eu set termout off para que você não veja a exceção real. E eu usei whenever sqlerror para fazer o script sair quando essa exceção for levantada, então o que vier depois não será executado. Isso é todo o resto no script de controle, não apenas a próxima consulta, mas você pode ter vários subscripts se precisar ser mais flexível.

Mas no SQL Developer, termout só funciona como esperado quando você executa via @ . Se você executar o conteúdo de elcm_ctl.sql diretamente da planilha SQL, você verá a exceção sendo levantada, o que é um pouco feio. Então, em vez disso, salve esse script de controle e, em uma planilha vazia, faça:
@c:\elcm_ctl.sql

Execute essa planilha como um script e ela irá avisá-lo; se você digitar 'Y' você verá a saída do script na janela de saída do script (a menos que você deixe set termout off no script de controle) e ele criará o arquivo de spool. Se você digitar qualquer outra coisa, ele não executará o elcm.sql arquivo, não mostrará nada na janela de saída do script e não criará um arquivo de spool.