我创建了一个 oracle 程序来重新安排在给定时间内未完成的作业:
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 的讨论。实际上这里的问题是我使用链接数据库创建了物化视图,但有时查询在与
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;