【问题标题】:Reschedule a Oracle Job重新安排 Oracle 作业
【发布时间】:2016-06-04 11:54:28
【问题描述】:

Oracle 作业每天运行两次,时间间隔如下

FREQ = DAILY; BYHOUR = 6,12; BYMINUTE = 30

现在我需要重新安排作业在上午 8 点和下午 12:30 运行。我不能不打扰已经运行的 12:30 时间表。

【问题讨论】:

    标签: oracle scheduler


    【解决方案1】:

    查询作业是否正在运行:

    select owner , job_name , running_instance, session_id from all_scheduler_running_jobs
    order by owner , job_name 
    

    并将您的时间间隔更改为:

    FREQ=DAILY;BYHOUR=8,12;BYMINUTE=0,30;BYSETPOS=1,4
    

    SETPOS 的工作方式如下:

    ╔═══╦══════╦════════╗
    ║ P ║ Hour ║ Minute ║
    ╠═══╬══════╬════════╣
    ║ 1 ║    8 ║     00 ║
    ║ 2 ║    8 ║     30 ║
    ║ 3 ║   12 ║     00 ║
    ║ 4 ║   12 ║     30 ║
    ╚═══╩══════╩════════╝
    

    【讨论】:

    • 这将导致作业每天运行 4 次:上午 8 点、上午 8:30、下午 12 点和下午 12:30,这听起来不像是 OP 想要的。跨度>
    • @KrisJohnston 感谢您的评论!你说的对。我忘了包括BYSETPOS=1,4
    • 有趣...我没有意识到您可以按小时、按分钟等分配职位...我认为唯一的方法是使用多个时间表(如我的回答)。我必须记住这一点。
    • @KrisJohnston 它不适用于某些旧版本的 Oracle。
    【解决方案2】:

    如果您尝试通过:FREQ=DAILY;BYHOUR=8,12;BYMINUTE=0,30;BYSECOND=0 执行此操作,您的作业将每天运行 4 次(上午 8 点、上午 8 点 30 分、下午 12 点和下午 12 点 30 分),这听起来不像您想要的。

    我认为这样做的唯一方法是创建两个时间表:

    begin
      dbms_scheduler.create_schedule (
        schedule_name => 'EIGHT_AM',
        repeat_interval => 'FREQ=DAILY;BYHOUR=8;BYMINUTE=0;BYSECOND=0');
    
      dbms_scheduler.create_schedule (
        schedule_name => 'TWELVE_THIRTY_PM',
        repeat_interval => 'FREQ=DAILY;BYHOUR=12;BYMINUTE=30;BYSECOND=0');
    end;
    

    然后将两个计划分配给调度程序作业:

    exec dbms_scheduler.set_attribute('SCHEMA.MYJOB','REPEAT_INTERVAL','EIGHT_AM,TWELVE_THIRTY_PM');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多