很多时候Oracle存储过程在跑,不巧编译了它,就会产生ORA-04021: 等待对象锁超时的错误。
session1:
create or replace procedure p_test is
begin
dbms_lock.sleep(1000);
end;
call p_test();
session2:
alter procedure p_test compile;
session3:
select * from dba_ddl_locks where name='P_TEST';
SESSION_ID OWNER NAME TYPE MODE_HELD MODE_REQU
---------- ------ ------- -------- --------------------- --------- -------
191 TEST P_TEST Table/Procedure/Type Null None
132 TEST P_TEST Table/Procedure/Type Exclusive None
select s.SID,s.SERIAL# from v$session s where s.sid=191;
SID SERIAL#
---------- ----------
191 14
alter system kill session '191,14';
alter system kill session '191,14'
*
第 1 行出现错误:<