Проблемът е, че SQL*Plus интерпретира първия ви ;
като терминатор за командата. Може би сте забелязали, че ако напишете вашите команди в текстов файл и го изпълните (или го редактирате в текстов редактор с SQL*Plus), тя работи.
За да работи с писане на живо, ако наистина искате да го направите (изглежда малко вероятно, ако ще са много дълги!), можете да изключите автоматичното откриване на терминатора с SET SQLTERMINATOR off
. Имайте предвид, че ще трябва да кажете на SQL*Plus, че сте готови и че трябва да се изпълни с /
инструкция като втория ;
също се игнорира.
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.
Ако ги създавате от речника на данните, друга опция е да използвате PL/SQL за извършване на заявките и манипулациите и dbms_output
за да произведете изхода, който ще обработите, стига крайният размер на файла да не надвишава ограниченията на буфера.