在使用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的人,所以我不认为该表被另一个用户/进程锁定。
有没有人遇到过这个问题?
答案 0 :(得分:3)
这可能是一个愚蠢的事情,但是,这种情况大多数时候都会发生。
您案例中发生的事情的小型演示:
第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的见解。