2010-08-28 89 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时,它会尝试插入并挂起。