El problema es que SQL*Plus está interpretando su primer ;
como terminador del comando. Es posible que haya notado que si escribe sus comandos en un archivo de texto y lo ejecuta (o lo edita en un editor de texto con SQL*Plus), funciona.
Para que funcione con la escritura en vivo, si realmente quieres hacer eso (¡parece poco probable si van a ser muy largos!), puedes desactivar la detección automática del terminador con SET SQLTERMINATOR off
. Tenga en cuenta que tendrá que decirle a SQL*Plus que ha terminado y que debería ejecutarse con /
instrucción como el segundo ;
también se ignora.
SQL> SPOOL myscript.sql
SQL> SET SQLTERMINATOR off
SQL> SELECT q'[SPOOL log
2 SELECT COUNT(*) FROM DUAL;
3 PROMPT Done.
4 ]' FROM DUAL
5 /
SPOOL log
SELECT COUNT(*) FROM DUAL;
PROMPT Done.
Si está construyendo estos desde el diccionario de datos, otra opción es usar PL/SQL para realizar las consultas y manipulaciones y dbms_output
para producir la salida que va a poner en cola, siempre que el tamaño final del archivo no supere los límites del búfer.