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