ablog

不器用で落着きのない技術者のメモ

SQL*Plus でspool するときに余計なものを出力しない方法

こんな風に spool すると、

$ sqlplus / as sysdba <<EOF
set pagesize 0
set head off
set feed off
spool onlineall.sql
select 'alter database datafile '''||name||''' online;' from v\$datafile;
spool off
EOF
$ cat onlineall.sql
SQL> select 'alter database datafile '''||name||''' online;' from v$datafile;
alter database datafile '/u01/app/oracle/oradata/orcl/system01.dbf' online;     
alter database datafile '/u01/app/oracle/oradata/orcl/undotbs01.dbf' online;    
alter database datafile '/u01/app/oracle/oradata/orcl/sysaux01.dbf' online;     
alter database datafile '/u01/app/oracle/oradata/orcl/user01.dbf' online;       
SQL> spool off

という具合に実行した SQL やら「spool off」まで出力されてしまう。

ぐぐってみたら、

SQL*Plus をサイレントモード(-S) で起動する
SQL*Plus 起動時、終了時のメッセージやバージョン情報、コマンドプロンプトなどを出力させずに実行する。特にバッチ処理向けにスクリプトファイルを呼び出して問い合わせ結果を スプール する場合に用いる。

サイレントモードでSQL*Plusを起動する - オラクル・Oracle SQL*Plus リファレンス

SQL*Plus にサイレントモードなるものがあるらしいので試してみると、

$ sqlplus -s / as sysdba <<EOF
set pagesize 0
set head off
set feed off
spool onlineall.sql
select 'alter database datafile '''||name||''' online;' from v\$datafile;
spool off
EOF
$ cat onlineall.sql
alter database datafile '/u01/app/oracle/oradata/orcl/system01.dbf' online;     
alter database datafile '/u01/app/oracle/oradata/orcl/undotbs01.dbf' online;    
alter database datafile '/u01/app/oracle/oradata/orcl/sysaux01.dbf' online;     
alter database datafile '/u01/app/oracle/oradata/orcl/user01.dbf' online; 

でけた。