1)
Подключаемся SQLPlus 9i к БД 10g и наблюдаем:
SQL> help spool
SPOOL
-----
Stores query results in a file, or optionally sends the file to a printer.
In iSQL*Plus, use the Preferences screen to direct output to a file.
SPO[OL] [file_name[.ext] [CRE[ATE] | REP[LACE] | APP[END]] | OFF | OUT]
Not available in iSQL*Plus
SQL> spool 1.txt APP
SP2-0333: Неверное имя спулинг файла: "1.txt APP" (плохой символ: ' ')
SQL>
Т.е. справка по команде выводится из БД, а парсер SQLPlus команду не распознаёт :-)
Сделали бы уж и справку из SQLPlus только для его директив, остальное из БД. А то как-то через задницу всё...
2)
SQL> call dbms_output.put_line('
2 a
3 ');
a
SQL> call dbms_output.put_line('
2 @
2 ');
SQL> call dbms_output.put_line('
2 '||'@
3 ');
@
SQL> call dbms_output.put_line('
2 @a
SP2-0310: unable to open file "a.sql"
2 ');
SQL> call dbms_output.put_line('
2 a @a
3 ');
a @a
SQL>
И ему совершенно пофиг, что символ @ находится в кавычках. Если он первый в строке (или до него только пробелы и табуляции) - SQLPlus непременно пытается вызвать внешний файл.
Причём эту злое...злополучную "собачку" никак не отключить директивами SQLPlus, в отличии от других спец.символов, типа & и других. Приходится построчно применять regexp_replace(vLine,'^(( | )*)@','\1''||''@'), что, как минимум, портит эстетику выгружаемого кода...
Как всегда, из-за таких мелких огрехов получаем кучу геморроя.