sqlplus卡在删除查询上

时间:2015-04-08 10:22:20

标签: oracle session plsql oracle-sqldeveloper sqlplus

在使用SQL * Plus启动的匿名PL / SQL块时,我遇到了一个奇怪的问题。该块包含一个delete语句,如果由oracle sql developer接口启动,它将按预期工作。如果我通过sqlplus从cmd启动它会卡住。 我发现删除语句是问题...我有一个更简单的代码相同的情况:

set serveroutput on size 1000000
begin
  DELETE FROM USER_LEAD;
  dbms_output.put_line('test');
end;
/
exit;

如果我删除了删除语句,一切正常,而且与我的真实匿名块相同。我想指出我是唯一一个使用db的人,所以我不认为该表被另一个用户/进程锁定。

有没有人遇到过这个问题?

2 个答案:

答案 0 :(得分:3)

这可能是一个愚蠢的事情,但是,这种情况大多数时候都会发生。

  • 您在一个会话中执行 DML 交易。
  • 您尚未 COMMIT / ROLLBACK 该会话。
  • 您打开另一个会话并执行另一个DML。
  • 您发现查询保持等待

您案例中发生的事情的小型演示:

第1节

SQL> delete from emp where empno = 7369;

1 row deleted.

会话2

SQL> delete from emp where empno = 7369;

第二场会议一直在等待。

让我们检查原因:

SQL> SELECT
  2     s.blocking_session,
  3     s.sid,
  4     s.serial#,
  5     s.seconds_in_wait
  6  FROM
  7     v$session s
  8  WHERE
  9     blocking_session IS NOT NULL;

BLOCKING_SESSION        SID    SERIAL# SECONDS_IN_WAIT
---------------- ---------- ---------- ---------------
             373        130      11069              44

SQL>

第1节

SQL> rollback;

Rollback complete.

SQL>

会话2

SQL> delete from emp where empno = 7369;

1 row deleted.

SQL>

第2节成功。

SQL> SELECT
  2     s.blocking_session,
  3     s.sid,
  4     s.serial#,
  5     s.seconds_in_wait
  6  FROM
  7     v$session s
  8  WHERE
  9     blocking_session IS NOT NULL;

no rows selected

SQL>

所以,没有更多的会议在等待!

答案 1 :(得分:2)

我发现了问题所在。

我使用sqlpus执行cmd的匿名阻止,而我与sql-developer工具的会话仍处于打开状态。我关闭了与db的连接,一切都按预期工作。

我认为该会话中有一些DML,我没有提交/回滚。

感谢@LalitKumarB和@AlexPoole的见解。