sql >> Base de Datos >  >> RDS >> Oracle

Generación de spool basada en condiciones en el script Oracle SQL

Si puede poner esta sección de control en su propio script, p. elcm_ctl.sql , podrías hacer eso:

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

El accept comando en mi opinión, es un poco más ordenado que confiar en indicaciones de sustitución, y es algo autodocumentado. Esto solicita al usuario la cadena especificada, en lugar de solo 'gen' . (En SQL*Plus, puede extender esto y obligar al usuario a ingresar un solo carácter, volviendo a preguntar si ingresan algo más largo; y por defecto a 'N' si simplemente presionan regresar sin ingresar nada. Pero SQL Developer solo admite un subconjunto de la funcionalidad).

Luego, un pequeño bloque anónimo arroja una excepción, realmente no importa cuál, si el valor de la variable ingresada no es 'y' o 'Y' . Mientras lo hace, he set termout off para que no vea la excepción real. Y he usado whenever sqlerror para hacer que el script salga cuando se genera esa excepción, de modo que lo que venga después no se ejecute. Eso es todo lo demás en el script de control, no solo la siguiente consulta, sino que podría tener varios subguiones si necesitara ser más flexible.

Pero en SQL Developer, termout solo funciona como se espera cuando se ejecuta a través de @ . Si ejecuta el contenido de elcm_ctl.sql directamente desde la hoja de trabajo de SQL, verá que se genera la excepción, lo cual es un poco feo. Entonces, en su lugar, guarde ese script de control y en una hoja de trabajo vacía simplemente haga:

@c:\elcm_ctl.sql

Ejecute esa hoja de trabajo como un script y le indicará; si ingresa 'Y' verá el resultado del script en la ventana de salida del script (a menos que deje set termout off) en el script de control), y creará el archivo de cola. Si ingresa algo más, no se ejecutará elcm.sql archivo, no mostrará nada en la ventana de salida del script y no creará un archivo de spool.