REM REM DBAToolZ NOTE: REM This script was obtained from DBAToolZ.com REM It's configured to work with SQL Directory (SQLDIR). REM SQLDIR is a utility that allows easy organization and REM execution of SQL*Plus scripts using user-friendly menu. REM Visit DBAToolZ.com for more details and free SQL scripts. REM REM REM File: REM s_locked_obj.sql REM REM USER LOCK TRACE MOST REM REM Author: REM Vitaliy Mogilevskiy REM VMOGILEV REM (vit100gain@earthlink.net) REM REM Purpose: REM REM *** QUICK *** REM Reports the following: REM - object locks from V$LOCKED_OBJECT REM using PL/SQL loops since join of DBA_OBJECTS REM and V$LOCKED_OBJECT is extremely slow REM - blocked objects from V$LOCK and SYS.OBJ$ REM - blocked sessions from V$LOCK REM - pulls blockers session details from V$SESSION and V$SQLTEXT REM REM REM Usage: REM s_locked_obj.sql REM REM Example: REM s_locked_obj.sql REM REM REM History: REM 08-01-1998 VMOGILEV Created REM 12-18-2001 VMOGILEV added V$LOCK queries to ID blockers REM 09-18-2003 VMOGILEV added v$sqltext queries to better ID blockers REM REM set verify off set serveroutput on size 1000000 DECLARE CURSOR lcobj_cur IS select session_id , oracle_username , os_user_name , object_id obj_id , locked_mode from V$LOCKED_OBJECT ; CURSOR obj_cur(p_obj_id IN NUMBER) IS select owner||'.'||object_name object_name , object_type from dba_objects where object_id = p_obj_id; BEGIN DBMS_OUTPUT.PUT_LINE(RPAD('Sid',5)|| RPAD('O-User',10)|| RPAD('OS-User',10)|| RPAD('Owner.Object Name',45)|| RPAD('Object Type',35)); DBMS_OUTPUT.PUT_LINE(RPAD('-',1,'-')|| RPAD('-',6,'-')|| RPAD('-',6,'-')|| RPAD('-',41,'-')|| RPAD('-',31,'-')); FOR lcobj IN lcobj_cur LOOP FOR obj IN obj_cur(lcobj.obj_id) LOOP DBMS_OUTPUT.PUT_LINE(RPAD(lcobj.session_id,5)|| RPAD(lcobj.oracle_username,10)|| RPAD(lcobj.os_user_name,10)|| RPAD(obj.object_name,45)|| RPAD(obj.object_type,35)); END LOOP; END LOOP; END; / prompt blocked objects from V$LOCK and SYS.OBJ$ set lines 132 col BLOCKED_OBJ format a35 trunc select /*+ ORDERED */ l.sid , l.lmode , TRUNC(l.ctime/60) min_blocked , u.name||'.'||o.NAME blocked_obj from (select * from v$lock where type='TM' and sid in (select sid from v$lock where block!=0)) l , sys.obj$ o , sys.user$ u where o.obj# = l.ID1 and o.OWNER# = u.user# / prompt blocked sessions from V$LOCK select /*+ ORDERED */ blocker.sid blocker_sid , blocked.sid blocked_sid , TRUNC(blocked.ctime/60) min_blocked , blocked.request from (select * from v$lock where block != 0 and type = 'TX') blocker , v$lock blocked where blocked.type='TX' and blocked.block = 0 and blocked.id1 = blocker.id1 / prompt blockers session details from V$SESSION and V$SQLTEXT clear col clear breaks set lines 80 set trims on set pages 9000 col sql_text format a70 word_wrapped col sid format a10 noprint new_value n_sid col serial format a10 noprint new_value n_serial col username format a20 noprint new_value n_username col machine format a20 noprint new_value n_machine col osuser format a20 noprint new_value n_osuser col process format a20 noprint new_value n_process col action format a45 noprint new_value n_action break on sid on serial on username on process on machine on action skip page ttitle - "Sid .......... : " n_sid - skip 1 - "Serial ....... : " n_serial - skip 1 - "Username ..... : " n_username - skip 1 - "Machine ...... : " n_machine - skip 1 - "OSuser ....... : " n_osuser - skip 1 - "Process ...... : " n_process - skip 1 - "Action ....... : " n_action - select /*+ ORDERED */ sid,serial# serial,username,machine,osuser,process,module||' '||action action,sql_text from v$session ses, v$sqltext txt where txt.address(+) = ses.sql_address and txt.hash_value(+) = ses.sql_hash_value and ses.sid IN (select sid from v$lock where block != 0 and type = 'TX') order by sid,piece /