Het probleem is dat SQL*Plus uw eerste ;
. interpreteert als de terminator voor de opdracht. Je hebt misschien gemerkt dat als je je commando's naar een tekstbestand schrijft en dat uitvoert (of het bewerkt in een teksteditor vanuit SQL*Plus), het werkt.
Om het te laten werken met live typen, als je dat echt wilt doen (het lijkt onwaarschijnlijk als ze erg lang gaan duren!), kun je de automatische detectie van de terminator uitschakelen met SET SQLTERMINATOR off
. Houd er rekening mee dat u SQL*Plus moet vertellen dat u klaar bent en dat het moet worden uitgevoerd met de /
instructie als de tweede ;
wordt ook genegeerd.
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.
Als u deze vanuit de datadictionary bouwt, is een andere optie om PL/SQL te gebruiken om de query's en manipulaties uit te voeren en dbms_output
om de uitvoer te produceren die u wilt spoolen, zolang de uiteindelijke bestandsgrootte de bufferlimieten niet overschrijdt.