| CREATE OR REPLACE PROCEDURE P_MONITOR( AN_MINUTES NUMBER DEFAULT 60) /******************************************* 存储过程用途:识别出系统中超过一定空闲连接时间( AS_MINUTES)的用户,并将其kill掉参数: AN_MINUTES 空闲时间数,单位为分钟,默认为60分钟 ********************************************/ AS v_Str VARCHAR2(100); CURSOR C_users(v_minutes number) IS SELECT s.username, s.status, s.machine, 'alter system kill session ' ||''''||s.sid||','||s.serial# ||'''' operates FROM v$session s, v$process p WHERE TYPE = 'USER' AND p.addr = s.paddr AND status != 'KILLED' -- AND SUBSTR (machine, 1, 19) NOT IN ('需要屏蔽不被处理的机器名') AND last_call_et > v_minutes*60 ORDER BY last_call_et desc; BEGIN FOR T_users IN C_users(an_minutes) LOOP v_Str := T_USERS.OPERATES; EXECUTE IMMEDIATE v_str; END LOOP; END; / |
| DECLARE jobno number; BEGIN DBMS_JOB.SUBMIT( job => jobno, what => 'p_monitor(60);', next_date => SYSDATE, interval => '/*1:Hr*/ sysdate + 30/1440); -- 每半小时运行一次 END; / |