日期:2014-05-17  浏览次数:20807 次

如何找出是那个session锁住了一个表
有个存储过程sp_init_emp 内容为:

select count(1) into i_count from user_tables where table_name='SESSION_TMP_EMP'
if i_count<1 then
    execute immediate 'create global temporary table SESSION_TMP_EMP
                        (
                              empid integer,
                              empname varchar2(22),
                              stype char(1)
                        ) on commit preserve rows' ;
else
   execute immediate 'truncate table SESSION_TMP_EMP ';
end if ;

execute immediate 'insert into SESSION_TMP_EMP 
                   select empid,empname,stype 
                   from rpt_emp where in_data=20130131';

commit;

也就是说,这个存储过程里面用到了一个session表


现在sqlplus中启动2个session
在session 1 中执行 exec sp_init_emp;

session 1执行完之后,在session 2 中 我想drop table SESSION_TMP_EMP
执行之后,会发现drop不了
ORA-14452: attempt to create, alter or drop an index on temporary table already in use

现在的问题是,我一定要drop掉这个表,
假设我们不知道是那个session 执行了sp_init_emp这个存储过程把SESSION_TMP_EMP表锁了

请问,这种情况下,如何找出是那个session把SESSION_TMP_EMP表锁了

------解决方案--------------------
dba_ddl_locks找找
------解决方案--------------------
SELECT A.SID,A.SERIAL#,A.USERNAME,B.TYPE FROM V$SESSION A,V$LOCK B WHERE A.SID=B.SID

------解决方案--------------------
引用:
SELECT A.SID,A.SERIAL#,A.USERNAME,B.TYPE FROM V$SESSION A,V$LOCK B WHERE A.SID=B.SID
我就用这个查看。
------解决方案--------------------
重点查v$session, v$sql, v$lock
------解决方案--------------------
和我查询方式一样这个不错
------解决方案--------------------
select b.owner,b.object_name,a.session_id,a.locked_mode,a.oracle_username,a.os_user_name
from v$locked_object a,dba_objects b
where b.object_id