有没有办法让Oracle Job自身禁用?

时间:2015-01-06 17:51:26

标签: oracle plsql dbms-scheduler

我正试图让这件事发生:

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 job”SPEDO.JOB_ATUALIZAR_VAL_MAT_PEND“estáemexecução”

最后一位表示“正在执行”

所以,我认为这是因为工作正在运行而且无法自行关闭。

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

有人可以帮忙吗?这可以实现吗?

2 个答案:

答案 0 :(得分:1)

感谢@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无效。

答案 1 :(得分:0)

我猜你可以做两件事,

  1. 强制停止作业,然后将其禁用。
  2. 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. 检查作业是否完成,然后禁用。
    2. 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;