O problema é que o SQL*Plus está interpretando seu primeiro
;
como o terminador para o comando. Você deve ter notado que se você escrever seus comandos em um arquivo de texto e executá-lo (ou editá-lo em um editor de texto com o SQL*Plus), ele funcionará. Para fazê-lo funcionar com a digitação ao vivo, se você realmente quiser fazer isso (parece improvável se eles forem muito longos!), você pode desativar a detecção automática do terminador com
SET SQLTERMINATOR off
. Observe que você terá que dizer ao SQL*Plus que terminou e que ele deve ser executado com o /
instrução como o segundo ;
também é ignorado. 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.
Se você estiver construindo a partir do dicionário de dados, outra opção é usar PL/SQL para fazer as consultas e manipulações e
dbms_output
para produzir a saída que você vai colocar em spool, contanto que o tamanho final do arquivo não exceda os limites do buffer.