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

SQLPlus命令行脚本在插入记录时挂起,sql,oracle,sqlplus,Sql,Oracle,Sqlplus,在windows上使用sqlplus 11g在11g数据库上运行sql脚本。如果在脚本中插入左行,Sqlplus将挂起。如果注释掉插入行,脚本将返回记录 在sql developer中运行时,脚本执行时间

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

在sql developer中运行时,脚本执行时间<1秒

我试着用同样的结果使插入状态成为一条连续的线

使用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;

如果语法错误,它会告诉你,而不是挂断

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

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


顺便说一句,由于null和空字符串被Oracle视为相同的,所以您不需要使用
!=''中的任何一个子句。

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

打开了sql developer,我在那里测试了insert语句,执行了一个commit;现在sqlplus可以正确地执行脚本。完美的答案。哦,哇,你刚才为我节省了这么多时间…完全相同的场景(sqlplus+SQLDeveloper)。