特定の時間内に完了しないジョブを再スケジュールするオラクル手順を作成しました。
create or replace procedure kill_stuck_jobs
as
begin
for x in (
select j.sid,
s.spid,
s.serial#,
j.log_user,
j.job,
j.broken,
j.failures,
j.last_date,
j.this_date,
j.next_date,
j.next_date - j.last_date interval,
j.what
from
(select
djr.SID,
dj.LOG_USER,
dj.JOB,
dj.BROKEN,
dj.FAILURES,
dj.LAST_DATE,
dj.LAST_SEC,
dj.THIS_DATE, dj.THIS_SEC,
dj.NEXT_DATE, dj.NEXT_SEC, dj.INTERVAL, dj.WHAT
from dba_jobs dj, dba_jobs_running djr
where dj.job = djr.job ) j,
(select p.spid, s.sid, s.serial#
from v$process p, v$session s
where p.addr = s.paddr ) s
where j.sid = s.sid and
j.next_date+15/1440 < sysdate
) loop
EXEC DBMS_JOB.BROKEN(x.job,TRUE);
execute immediate 'alter system disconnect session '''|| x.sid|| ',' || x.serial# || ''' immediate';
EXEC DBMS_JOB.BROKEN(x.job,FALSE);
dbms_output.put_line( 'Alter session done' );
end loop;
end;
しかし、この手順はエラーでコンパイルされます:
PLS-00103: Encountered the symbol "DBMS_JOB" when expecting one of the following:
:= . ( @ % ;
The symbol ":=" was substituted for "DBMS_JOB" to continue.
ここで、dbms_job と dbms_scheduler_job について説明しました。実際、ここでの問題は、リンクされた db を使用して具体化されたビューを作成したことですが、
SQL*Net more data from dblink
. 上記の手順を使用して、具体化されたビューの作成中に作成されたジョブを強制終了しました。次を使用してセッションを強制終了しています。create or replace procedure kill_stuck_refresh as begin for x in ( select username, osuser, sid, serial#, seconds_in_wait, event, state, wait_class from v$session where username is not null and seconds_in_wait > 600 and event = 'SQL*Net more data from dblink' ) loop execute immediate 'alter system disconnect session '''|| x.sid || ',' || x.serial# || ''' immediate'; dbms_output.put_line( 'Alter session done' ); end loop; end; -- end of kill_stuck_refresh;