存儲過程停止執行


前文再續,說我最近被一存儲過程折磨。
為啥說折磨呢。主要是很難調試。數據庫的強項不在於編碼,存儲過程寫的過程比較別扭,其實運行起來更坑爹。出了問題,你很難知道是哪一部分引起的。如果這個存儲過程執行的時間很長,就更加痛苦了,是哪一部分慢嘛?
另外,由於執行時間長,實在等不下去,就想中途掐掉。要怎么搞?
?
1
2
3
4
5
6
7
8
--獲得SID
select * from v$access where object='存儲過程名';
 
--獲得SID,serial#
select sid,serial#,lockwait,status,wait_time,state from v$session where sid='SID';
 
--殺掉進程
alter system kill session 'SID,serial#';
如果是存儲過程托付給了JOB執行,要中途停掉JOB該如何處理呢?
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--首先要關閉JOB計划
begin
  dbms_job.broken(JOB編號,true);
  commit;
end;
 
--檢查JOB有沒有正在運行,停止計划對它沒有影響
--獲得SID
select * from dba_jobs_running;
 
--獲得SID,serial#
select sid,serial#,lockwait,status,wait_time,state from v$session where sid='SID';
 
--殺掉進程
alter system kill session 'SID,serial#';
有時候,存儲過程甚至不能被編譯,那么有可能是存儲過程正在運行,或者其處理的表被鎖定。有以下語句可供參考:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--存儲過程無法編譯
SELECT V.OSUSER,  V.PROCESS, V.PROGRAM,v.MACHINE,V.TERMINAL,
V.MODULE,V.USERNAME,V.STATUS, V.SID,V.SERIAL#,
       'alter system kill session ''' || V.sid || ',' || V.SERIAL# || ''';' as KILL_SESSION,
       V.PADDR
  FROM V$SESSION V
 WHERE V.USERNAME LIKE '%用戶名%'
   AND V.STATUS in( 'INACTIVE','ACTIVE')
   and v.PROGRAM = 'plsqldev.exe';
 
 SELECT object_name, machine, s.sid, s.serial# ,s.status,
 'alter system kill session ''' || s.sid || ',' || s.SERIAL# || ''';' as KILL_SESSION  
FROM gv$locked_object l, dba_objects o, gv$session s 
WHERE l.object_id = o.object_id 
AND l.session_id = s.sid; 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM