Masalahnya adalah SQL*Plus menafsirkan ;
. pertama Anda sebagai terminator untuk perintah. Anda mungkin telah memperhatikan bahwa jika Anda menulis perintah ke file teks dan menjalankannya (atau mengeditnya di editor teks dengan SQL*Plus), perintah itu akan berfungsi.
Untuk membuatnya bekerja dengan pengetikan langsung, jika Anda benar-benar ingin melakukannya (tampaknya tidak mungkin jika itu akan menjadi sangat lama!), Anda dapat mematikan deteksi otomatis terminator dengan SET SQLTERMINATOR off
. Perhatikan bahwa Anda harus memberi tahu SQL*Plus bahwa Anda sudah selesai dan itu harus dijalankan dengan /
instruksi sebagai ;
. kedua diabaikan juga.
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.
Jika Anda membangun ini dari kamus data, opsi lain adalah menggunakan PL/SQL untuk melakukan kueri dan manipulasi dan dbms_output
untuk menghasilkan output yang akan Anda spool, selama ukuran file akhir tidak melebihi batas buffer.