插入记录时SQLPlus命令行脚本挂起

时间:2010-08-28 15:21:31

标签: sql oracle sqlplus

在Windows上使用sqlplus 11g在11g数据库上运行sql脚本。如果在脚本中留下插入行,则Sqlplus挂起。如果我注释掉插入行,脚本将返回记录。

脚本执行时间是<在sql developer中运行时为1秒。

我试图使用相同的resutls使插入语句成为一条连续的行。

使用echo on,它在sql最后一行(...为null;)之后立即挂起并显示一个新行开始,从不处理commit。我假设我的insert语句没有正确的语法,无法在sqlplus中运行

命令行调用:

sqlplus e_fraud/e_fraud@eftst2 @"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;

2 个答案:

答案 0 :(得分:6)

如果语法错误,它会告诉你,不要挂起。

目前尚不清楚在SQL Developer中从SQL * Plus尝试之前或之后是否成功运行它。我的猜测是你首先在那里运行插入,并且没有提交或回滚该事务,导致锁定 - 表明其中一个e_fraud列可能存在唯一约束。或者可能不太可能,您已在一个会话中插入并提交,但随后在另一个会话中,您在重新运行之前删除了记录,但已提交。

您的SQL * Plus会话正在等待其他一些事务以任何方式完成,因此它可以执行插入或报告约束违规,但目前它处于不确定状态。确保您已在每个已打开的会话中提交或回滚。如有必要,有办法检查锁。

顺便说一句,由于Oracle和null处理空字符串相同,因此您不需要!= ''子句中的任何一个。

答案 1 :(得分:2)

我相信bank_key中的“或”逻辑不是null或bank_key!=''最终基本上是通过基本上混淆较低级别的程序集来返回所有内容。因此,当它到达一个null_的bank_key时,它将尝试插入并挂起。