Le problème est que SQL*Plus interprète votre premier ;
comme terminateur de la commande. Vous avez peut-être remarqué que si vous écrivez vos commandes dans un fichier texte et que vous l'exécutez (ou que vous le modifiez dans un éditeur de texte avec SQL*Plus), cela fonctionne.
Pour que cela fonctionne avec la saisie en direct, si vous voulez vraiment le faire (cela semble peu probable s'ils vont être très longs !), vous pouvez désactiver la détection automatique du terminateur avec SET SQLTERMINATOR off
. Notez que vous devrez dire à SQL*Plus que vous avez terminé et qu'il doit s'exécuter avec le /
instruction comme deuxième ;
est également ignoré.
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 vous les construisez à partir du dictionnaire de données, une autre option consiste à utiliser PL/SQL pour effectuer les requêtes et les manipulations et dbms_output
pour produire la sortie que vous allez mettre en file d'attente, tant que la taille finale du fichier ne dépasse pas les limites de la mémoire tampon.