2010-08-28 115 views
1

在Windows上使用sqlplus 11g在11g數據庫上運行sql腳本。如果插入行留在腳本中,Sqlplus掛起。如果我註釋掉插入行,腳本將返回記錄。SQLPlus命令行腳本在插入記錄時掛起

腳本執行時間是<在sql開發中運行1秒。

我試圖使插入聲明一個連續的行與相同的resutls。

使用echo時,它在sql最後一行(...爲空;)後立即掛起並顯示一條新行開始,提交從不處理。我想我的INSERT語句是不正確syntaxed到在sqlplus運行

命令行調用:

sqlplus e_fraud/[email protected] @"C:\temp\Actimize_ETL\Versions\03\sql\merge2000_insert_new_bank_keys.sql" 

SQL腳本:

--insert into e_fraud.bank 
select stg.bank_key bank_key, stg.bank_key bank_name from 
(
select distinct account_bank bank_key 
from e_fraud.rgbk_stg_account 
where account_bank is not null 
or account_bank != '' 
UNION 
select distinct bank_key 
from e_fraud.rgbk_stg_branch 
where bank_key is not null 
or bank_key != '' 
) stg 
left outer join e_fraud.bank b 
on stg.bank_key = b.bank_key 
where b.bank_key is null; 

commit; 

exit; 

回答

5

如果語法是錯了,它會告訴你,不掛。

如果您在SQL Developer中嘗試從SQL * Plus嘗試之前或之後成功運行它,目前尚不清楚。我的猜測是,你首先在那裏運行插入,並且沒有提交或回滾該事務,導致鎖定 - 表明在其中一個e_fraud列上可能存在唯一約束。或者可能不太可能,您已在一個會話中插入並提交,但在另一個會話中,您在重新運行之前刪除了記錄,但不是已提交。

您的SQL * Plus會話正在等待某個其他事務以任何方式完成,因此它可以執行插入操作或報告違反約束條件,但此時它處於閒置狀態。確保你已經承諾或在每個你打開的會話中回滾。有必要檢查鎖的方法。

順便提一下,由於null和空字符串由Oracle處理相同,因此不需要!= ''子句中的任何一個。

+1

打開sql開發者,我測試了插入語句,執行了一個提交;現在sqlplus正確執行腳本。完美的答案。 – longday 2010-08-28 16:08:30

+0

哦,你剛纔救了我這麼多時間......完全相同的情況(sqlplus + sql developer)。 – rogerdpack 2011-09-20 18:37:18

2

我相信bank_key中的「or」邏輯不爲空或者bank_key!=''結束了,基本上是說基本上混淆了下層的程序集來返回所有內容。所以當它到達一個爲空的bank_key時,它會嘗試插入並掛起。