'While Statement' 职位 运行 甲骨文

'While Statement' for jobs running oracle

我有一个游标来获取处于 运行 或 SCHEDULED

状态的游标数据
CURSOR cursorJobStatus IS
     SELECT d.job_name, d.state
       FROM dba_scheduler_jobs d
       WHERE REGEXP_LIKE(d.job_name, '^(P_|S_|B_)')
         AND d.state IN ('RUNNING','SCHEDULED'); 

如何在 'cursorJobStatus' 中存在数据时执行循环,也就是说,只要有 'jobs' 处于 运行 或 SCHEDULED 状态?

我试过这个 'for' 但它不起作用,因为只根据它找到的记录进入 'for' 而不是一直询问游标的状态

FOR lrtJobStatus IN cursorJobStatus LOOP
   BEGIN
     DBMS_LOCK.SLEEP(5);           
   EXCEPTION
     WHEN NO_DATA_FOUND THEN                    
       EXIT;                  
   END;
   EXIT WHEN cursorJobStatus%NOTFOUND;
END LOOP;

感谢您的帮助!

也许是这样的:

declare
   l_job_running pls_integer;
begin
   loop
      begin
         select 1
           into l_job_running
           from dual
          where exists (select 1
                   from dba_scheduler_jobs d
                  where regexp_like(d.job_name, '^(P_|S_|B_)')
                    and d.state in ('RUNNING', 'SCHEDULED'));
      exception
         when no_data_found then
            l_job_running := 0;
      end;

      exit when l_job_running = 0;

      dbms_lock.sleep(5);

   end loop;
end;

尝试创建一个匿名块,它将检查当前作业 运行 并将继续执行直到有作业正在执行。我想你也可以用同样的方法实现你的 objective。

set serveroutput on;
declare
var1 number default '1';
begin
loop
dbms_output.put_line('inside the loop');
select count(*) into var1 from dba_jobs_running;
exit when var1=0;
dbms_output.put_line('job/jobs are executing');
end loop;
dbms_output.put_line('anonymous block completes');
end;