1.procedure
CREATE OR REPLACE 
PROCEDURE kill_session
   IS 
   v_session_id number;
   v_serial number;
   v_cursor_number number;
   cursor c_locked_session is
    select a.session_id,b.serial# from v$locked_object a,v$session b where a.session_id=b.sid;
BEGIN
   open c_locked_session;
   loop
    fetch c_locked_session into v_session_id,v_serial;
    exit when c_locked_session%notfound;
    v_cursor_number:=dbms_sql.open_cursor;
    dbms_sql.parse(v_cursor_number,' alter system kill session '||''''||v_session_id||''','''||v_serial||'''',2); 
    commit;
   end loop;
   close c_locked_session;
END; -- Procedure
/
2.job
declare
  v_job_id number;
begin
  v_job_id :=1;
  dbms_job.submit(v_job_id,'kill_session;',sysdate,'sysdate+1');
end;

解决方案 »

  1.   

    我也不知道行不行:)
    CREATE OR REPLACE PROCEDURE ZT AS
      CURSOR L_CUR IS
        SELECT A.SESSION_ID A, B.SERIAL# B
          FROM V$LOCKED_OBJECT A, V$SESSION B
         WHERE A.SESSION_ID = B.SID;
    BEGIN
      FOR v_cur IN l_cur LOOP
        EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION '''||v_cur.A||','||v_cur.B||'''';
      END LOOP;
    END;
      

  2.   

    经常出现死锁的问题其實那不能叫死鎖,而是鎖等待
    是由於某個進程執行了某項操作但還沒有提交鎖造成。在非必要的情況下不建議KILL掉對應的SESSION,
    因為如果直接KILL會照成用戶數據的丟失。ORACEL的鎖機制就是為了保証數據的完整性。建議從程序代碼和用戶實際操作來解決鎖等待的問題。
    比如:後台程序中盡量多使用COMMIT
      

  3.   

    不過同意 wupangzi(无本之木)的建議.
      

  4.   

    dbms_job.submit(v_job_id,'kill_session;',sysdate,'sysdate+1/1440');
      

  5.   

    baojianjun(包子) 说的是对的楼主可以使用profile等手段限制对资源的占用
    只在业务需要commit的时候commit,kill会话只能由DBA手工来做,否则出了问题责任谁负呢?
      

  6.   

    请问DBMS_JOB是用来添加一个新的JOB吗?如何删除一个JOB呢?这是否是一个ORACLE内置的函数,怎样查找这些函数?
      

  7.   

    DBMS_JOB.SUBMIT(:jobno,//job号
                    'your_procedure;',//要执行的过程
                    trunc(sysdate)+1/24,//下次执行时间
                    'trunc(sysdate)+1/24+1'//每次间隔时间
                   );
    删除job:dbms_job.remove(jobno);
    修改要执行的操作:job:dbms_job.what(jobno,what);
    修改下次执行时间:dbms_job.next_date(job,next_date);
    修改间隔时间:dbms_job.interval(job,interval);
    停止job:dbms.broken(job,broken,nextdate);
    启动job:dbms_job.run(jobno);
    例子:
    VARIABLE jobno number;
    begin
          DBMS_JOB.SUBMIT(:jobno, 
                  'Procdemo;',//Procdemo为过程名称 
                   SYSDATE, 'SYSDATE + 1/720');
             commit;
    end;
      

  8.   

    你那就不一定是死锁,死锁很少见的。
    oracle会自动检测死锁,并处理的。