4

我正在努力做到这一点:

declare
  Contador number;

begin
 ATUALIZAR_VAL_MAT_PENDENTES(Contador);

 if Contador = 0 then
  dbms_scheduler.disable('JOB_ATUALIZAR_VAL_MAT_PEND');
  end if;
end;

当计数器返回零时,它将禁用这个 JOB。但是,我得到:

"ORA-27478: o 作业 "SPEDO.JOB_ATUALIZAR_VAL_MAT_PEND" está em execução"

最后一位的意思是“它正在执行”

所以,我认为这是因为作业正在运行并且它不能自行关闭。

我认为另一种方法可能是更改结束日期,但我似乎找不到执行此操作的语法。

任何人都可以帮忙吗?这是可以实现的吗?

4

2 回答 2

3

感谢@Shankar 的帮助。这就是我设法完成我想做的事情的方式:

declare
  Contador number;

begin
 ATUALIZAR_VAL_MAT_PENDENTES(Contador);

 if Contador = 0 then
   dbms_scheduler.set_attribute('JOB_ATUALIZAR_VAL_MAT_PEND', 'end_date', systimestamp + 1);
  end if;
end;

我已经想到了这一点,但是当智能感知弹出说“值”参数是“布尔值”时,我什至没有尝试将日期传递给它。现在它工作正常,但我认为我必须补充一点:

如果您尝试将结束日期设置为提前一小时或几分钟,这将不起作用。您需要实际更改日期,否则它会给您 ORA-27483:“string.string”的 END_DATE 无效。

于 2015-01-06T20:16:33.673 回答
0

我想你可以做两件事,

  1. 强制停止作业,然后禁用它。
declare
  Contador number;    
begin
 ATUALIZAR_VAL_MAT_PENDENTES(Contador);

 if Contador = 0 then
  DBMS_SCHEDULER.stop_JOB (job_name => 'JOB_ATUALIZAR_VAL_MAT_PEND',force=>true);
  dbms_scheduler.disable('JOB_ATUALIZAR_VAL_MAT_PEND');
  end if;
end;
  1. 检查作业完成,然后禁用。
SELECT status FROM USER_SCHEDULER_JOB_LOG
WHERE job_name = 'JOB_ATUALIZAR_VAL_MAT_PEND' and operation = 'RUN' ORDER BY log_date desc
offset 0 rows fetch next 1 row only; -- This will give you the latest run's status

将其存储到一个变量中(比如 status_),然后像下面这样检查,

declare
  Contador number;

begin
 ATUALIZAR_VAL_MAT_PENDENTES(Contador);

 if Contador = 0 and status_ ="Succeeded" then
  DBMS_SCHEDULER.stop_JOB (job_name => 'JOB_ATUALIZAR_VAL_MAT_PEND',force=>true);
  dbms_scheduler.disable('JOB_ATUALIZAR_VAL_MAT_PEND');
  end if;
end;
于 2015-01-06T18:04:09.543 回答