對於經常操作Oracle的人來說,對spool肯定不陌生。
但是裏面也有幾個小的注意事項,要多加謹慎,小心被坑了。
1、spool如果不指定文件的後綴名,則會自動產生後綴名“.lst”。
曾經在shell腳本中,sqlplus連上去之後,spool一個文件,然後用shell去操作它,結果找不到文件,最後發現,spool出來的文件名字裏多了一個後綴“.lst”,被坑了,從此使用spool,我都指定後綴名,如“.sql”等。
2、在shell腳本中,如果spool代碼不是放在單獨的sql文件中執行的,而是直接執行的,則會生成“SQL>”開頭的語句。
例如下面的shell代碼:
#!/usr/bin/env bash
sqlplus / as sysdba << EOF
set heading off pagesize 0 linesize 4096 echo off termout off feedback off colsep % wrap off trims on
spool test.sql
select 'success' from dual;
spool off
exit
EOF
這個代碼所輸出的test.sql則肯定會帶着“SQL>”的內容。
而如果將spool單獨放到一個sql文件去,再執行則不會有“SQL>”開頭的內容,例如:
test_spool.sql:
set heading off pagesize 0 linesize 4096 echo off termout off feedback off colsep % wrap off trims on
spool test.sql
select 'success' from dual;
spool off
test.sh:
#!/usr/bin/env bash
sqlplus / as sysdba << EOF
@test_spool.sql
exit
EOF
如上方式執行,則不會生成含“SQL>”的字樣內容。
如果覺得還得需要中間文件test_spool.sql的方式太麻煩,則可以使用“set SQLPROMPT --SQL>”命令,設置將要顯示的“SQL>”爲“--SQL>”,則這樣spool出來的文件可以直接執行,因爲“SQL>”已經被註釋掉了。
當然如果你不嫌麻煩,也可以對spool生成出來的文件,使用sed命令將“SQL>”所在的行過濾掉,這樣也行。