create or replace procedure moni_lock is
begin
insert /* +append */
into moni_lock_block
select seq_mlb.nextval, mkb.*
from (select /*+rule*/
do.OWNER || '.' || do.OBJECT_NAME,
vs.LAST_CALL_ET,
vs.USERNAME,
vs.OSUSER,
vs.MACHINE,
vs.PROGRAM,
vs.SID,
'(' || vs.SID || ',' || vs.SERIAL# || ')',
SYS_CONTEXT('USERENV', 'INSTANCE_NAME'),
sysdate,
vsq.SQL_TEXT
from v$lock a,
v$session vs,
v$locked_object vl,
dba_objects do,
v$sqlarea vsq
where exists (select 1
from v$lock b
where a.ID1 = b.ID1
and a.ID2 = b.ID2
and a.SID <> b.SID)
and vs.SQL_ADDRESS = vsq.ADDRESS(+)
and a.SID = vs.SID
and a.SID = vl.SESSION_ID
and vl.OBJECT_ID = do.OBJECT_ID
and a.BLOCK = 1
and vs.LAST_CALL_ET > 600
order by SID) mkb
where mkb.sid is not null;
commit;
end moni_lock;