Problem polega na tym, że SQL*Plus interpretuje Twój pierwszy ;
jako terminator polecenia. Być może zauważyłeś, że jeśli zapiszesz swoje polecenia do pliku tekstowego i wykonasz je (lub edytujesz je w edytorze tekstowym z SQL*Plus), to zadziała.
Aby działało z pisaniem na żywo, jeśli naprawdę chcesz to zrobić (wydaje się mało prawdopodobne, jeśli będzie to bardzo długie!), możesz wyłączyć automatyczne wykrywanie terminatora za pomocą SET SQLTERMINATOR off
. Zwróć uwagę, że będziesz musiał poinformować SQL*Plus, że skończyłeś i że powinien zostać wykonany z /
instrukcja jako drugi ;
jest również ignorowany.
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.
Jeśli budujesz je ze słownika danych, inną opcją jest użycie PL/SQL do wykonywania zapytań i manipulacji oraz dbms_output
aby wytworzyć dane wyjściowe, które zamierzasz buforować, o ile ostateczny rozmiar pliku nie przekroczy limitów bufora.