1SQL> SELECT text
2FROM dba_source
3WHERE name = 'PROC_KILLSESSION'
4ORDER BY owner, line;
5
6TEXT
7------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
8PROCEDURE proc_killsession
9AS
10v_sid NUMBER := 0;
11v_serial NUMBER := 0;
12v_sql VARCHAR2(2000);
13v_record_time VARCHAR2(19) := to_char(sysdate,'yyyy-mm-dd hh24:mi:ss');
14v_object_name VARCHAR2(30);
15CURSOR block_session_list IS
16 SELECT s1.sid, s1.serial#, ao.object_name
17 FROM v$session s1, v$session s2, all_objects ao
18 WHERE s1.sid = s2.final_blocking_session
19 AND s2.blocking_session IS NOT NULL
20 AND s2.blocking_session_status = 'VALID'
21 AND s2.state = 'WAITING'
22 AND s2.row_wait_obj# = ao.object_id
23 AND s2.last_call_et > 60;
24BEGIN
25 INSERT INTO block_event
26 SELECT v_record_time record_time,
27 to_char(s1.logon_time, 'yyyy-mm-dd hh24:mi:ss') logon_time,
28 nvl(to_char(t.start_date, 'yyyy-mm-dd hh24:mi:ss'),'~') start_time,
29 s1.username||'@'||s1.machine||'('||s1.client_info||') '||s1.program||' '||s1.action
30 ||' (sid='||s1.sid||' serial#='||s1.serial#||' sql_id='||s1.sql_id||' | prev_sql_id='||s1.prev_sql_id||')' blocker,
31 s2.username||'@'||s2.machine||'('||s2.client_info||') '||s2.program||' '||s2.action
32 ||' (sid='||s2.sid||' serial#='||s2.serial#||' sql_id='||s2.sql_id||')' blocked,
33 q1.sql_text blocking_text, q2.sql_text blocked_text,
34 l1.lmode lock_mode, l2.request request_mode, l1.ctime CTIME1,l2.ctime CTIME2,
35 s1.event blocking_event,s2.event blocked_event,ao.owner||'.'||ao.object_name object_name,
36 DBMS_ROWID.rowid_create(1, ao.data_object_id, s2.row_wait_file#, s2.row_wait_block#, s2.row_wait_row#) BLOCKED_ROWID,
37 s2.final_blocking_session final_blocking_session
38 FROM v$lock l1, v$session s1, v$lock l2, v$session s2, v$locked_object lo, all_objects ao, v$transaction T, v$sql q1, v$sql q2
39 WHERE s1.sid=l1.sid AND s2.sid=l2.sid
40 AND s2.last_call_et > 60
41 AND l1.block=1 AND l2.request>0
42 AND l1.id1=l2.id1 AND l1.id2=l2.id2
43 AND s1.sid=lo.session_id
44 AND lo.object_id=ao.object_id
45 AND hextoraw(s1.saddr) = hextoraw(t.ses_addr(+))
46 AND q2.sql_id = s2.sql_id
47-- AND ao.owner='LUCIFER'
48 AND q1.sql_id IN (s1.sql_id,s1.prev_sql_id);
49 COMMIT;
50 OPEN block_session_list;
51 FETCH block_session_list INTO v_sid,v_serial,v_object_name;
52 LOOP
53 EXIT WHEN block_session_list%notfound;
54 v_sql := 'insert into block_sql select :v_record_time,sql_id,hash_value,sql_fulltext,first_load_time,last_load_time,last_active_time from v$sql
55 where upper(sql_text) like ''% '||v_object_name||' %'' AND command_type=6 AND last_active_time > sysdate-10/1440';
56 EXECUTE IMMEDIATE v_sql using v_record_time;
57 v_sql := 'alter system kill session '''||v_sid||','||v_serial||'''';
58 --DBMS_OUTPUT.PUT_LINE(v_sql);
59 EXECUTE IMMEDIATE v_sql;
60 FETCH block_session_list INTO v_sid,v_serial,v_object_name;
61 END LOOP;
62 CLOSE block_session_list;
63 COMMIT;
64 EXCEPTION
65 WHEN OTHERS THEN DBMS_OUTPUT.put_line('Error NO:'||SQLCODE);
66END proc_killsession;