Oracle:使用dbms_scheduler限制块执行时间

pkln4tw6  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(116)

我有一个很好的想法,但它不工作:)
我想限制pl/sql块的执行时间,但我没有找到简单的解决方案。
所以我决定把它放在一个工作中,并观察它的状态。
下面是我得到的块为dbms_lock.sleep(5),没有时间限制(当块没有超过限制时)

declare 
  sJob varchar2(100) := 'limit_test1';
  bRunning number;
begin
  log('create job');
  dbms_scheduler.create_job(sJob, 'PLSQL_BLOCK', 
    'begin log(''start job''); dbms_lock.sleep(5); log(''finish job''); end;', 
    start_date => systimestamp, enabled => true);
  log('start loop');
  loop
    bRunning := 0;
    for rec in (select 1 from user_scheduler_running_jobs t where t.job_name = sJob) loop
      bRunning := 1;
    end loop;
    log('bRunning = '||bRunning);
    exit when bRunning = 0; -- **or time limit routine**
    dbms_lock.sleep(1);
  end loop;
end;

字符串
我希望像这样的原木

create job
start job
start loop
bRunning = 1
bRunning = 1
bRunning = 1
finish job
bRunning = 0


但我明白

create job
start loop
bRunning = 0
start job
finish job


也许我需要使用另一个字典视图或sleep

n7taea2i

n7taea2i1#

工作不会马上开始。作业控制器必须轮询并找到可运行的作业,然后启动它们。这可能需要几秒钟。你走的是正确的道路,你只需要使用user_scheduler_jobs而不是user_scheduler_running_jobs。确保您的作业配置为自动删除(这可能是默认设置,没有定义间隔,但最好将auto_drop => TRUE显式添加到参数中)。
作业在创建后会立即显示在视图中,因此在开始轮询之前不需要等待。一旦作业完成,它将从视图中消失。

相关问题