sqlplus 執行大量sql指令碼時遇到問題分析(很常見)

perfychi發表於2014-02-28
sqlplus -s  / as sysdba <
@test.sql
EOF






第二個EOF前面有沒有exit效果都一樣。 也就是說預設就是exit


test.sql裡最後加不加commit效果都一樣,exit預設的時候就是提交(這個可以控制)




test.sql 名字如果是帶空格t est.sql,怎麼辦?


(下面是好多sql檔案進行遍歷)
【1】
cat database.sh
ls *sql | while read line;do
sqlplus -s / as sydsba <
@"$line"
EOF




【2】
cat database.sh
for line in `ls *sql` ;do
sqlplus -s / as sydsba <
@"$line"
EOF
done


用while迴圈,而不用for in 是因為如果檔名有空格,ls *sql出來以後,line取值是按照空格或者換行符作為間隔符號,
所以一個檔名會被空格分成為2個值使用;而用while read 則是隻按照換行符作為間隔符號,所以一個檔名不會被分割。這就是這兩種方式的區別。
下面的sqlplus 下面執行@"line",變數line需要加雙引號,防止檔名被空格分割解析






sqlplus 的兩種方式對比對比:
【1】
#cat test.sql
insert into test values(sysdate);
commit;


#cat database.sh
ls *sql | while read line;do
sqlplus -s / as sydsba <
@"$line"
EOF


上面的exit退出動作是由EOF完成的


【2】
#cat test.sql
insert into test values(sysdate);
commit;
exit;


#cat database.sh
ls *sql | while read line;do
sqlplus -s / as sydsba @"$line"


上面的exit退出動作,只能在test.sql中完成。
在這種情況下如果不在test.sql中加exit,那麼迴圈會在第一次sqlplus 執行的時候阻塞,直到被手工處理以後,才能進入到下一次迴圈。







來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27042095/viewspace-1096885/,如需轉載,請註明出處,否則將追究法律責任。

相關文章