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

Posted

技术标签:

【中文标题】插入记录时 SQLPlus 命令行脚本挂起【英文标题】:SQLPlus command line script hangs when inserting records 【发布时间】:2010-08-28 15:21:30 【问题描述】:

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

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

我试图让插入语句成为一条具有相同结果的连续行。

使用 echo on,它会在 sql 最后一行之后挂起(...为 null;)并显示一个新行开始,永远不会处理提交。我假设我的插入语句的语法不正确,无法在 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;

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

打开了我测试插入语句的sql developer,执行了提交;现在 sqlplus 可以正确执行脚本。完美的答案。 哦,哇,你为我节省了这么多时间......完全相同的场景(sqlplus + sql developer)。【参考方案2】:

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

【讨论】:

以上是关于插入记录时 SQLPlus 命令行脚本挂起的主要内容,如果未能解决你的问题,请参考以下文章

sqlplus多行代码怎么

命令行通过执行shell脚本启动java类,命令行“卡住”or“挂起”or“停顿”,不能输入新的命令了,怎么办

SQLPLUS 不打印受影响的行数

如何通过命令行在服务器上运行php脚本

oracle sqlplus命令汇总

如何通过 sql plus 从命令行发出单个命令?