【问题标题】:Creating DBMS_SCHEDULER job for oracle为 oracle 创建 DBMS_SCHEDULER 作业
【发布时间】:2014-11-24 17:03:23
【问题描述】:

试图创建工作但无法编译它让我给出这个错误。 oracle论坛上有一个问题,它说我必须创建程序来包装它。 this?有什么解决方法

 -- Created on 30.09.2014 by ALI.ORHAN 
    declare
      -- Local variables here
      i integer;
    begin
      -- Test statements here
      dbms_scheduler.create_job(job_name        => 'blabla'
                               ,job_type        => 'STORED_PROCEDURE'
                               ,job_action      => 'dingdongprocedure;'
                               ,start_date      => '30-OCT-14 10.00.00 PM'
                               ,end_date        => '15-JULY-08'
                               ,repeat_interval => 'FREQ=WEEKLY BYDAY=TUE,FRI BYHOUR=10,13'
                               ,enable          => 'TRUE'
                               ,comments        => 'SUPREME COMMENT');
    end;

在我从 PL/SQL Developer UI 创建作业后,我发现我的语法错误,新代码如下;

  1. 我使用 sys.dbms_scheduler.create_job 而不是 dbms_scheduler.create_job。我不知道差异,但这不是重要的改变。
  2. 我使用 to_date 来定义 start_date,作为一个新手,我发现这种做法更好。
  3. 重要我将 job_class 参数添加到“DBMS_JOB$”。 DBMS_JOB 是 Oracle RDBMS 的内置作业类。因此,您可以使用此查询找到所有工作:

    select * from  ALL_SCHEDULER_JOBS WHERE JOB_CLASS='DBMS_JOB$'
    
  4. 重要我的间隔是错误的,你应该输入;在所有参数之间,如

    repeat_interval => freq=weekly;byhour=10, 13
    
  5. 我的第一个作业代码有另一个语法错误,我使用 enable 而不是 enabled
  6. 我将 auto_drop 设置为 false。我猜这个参数是用来在完成工作时放弃工作的。我的意思是,如果您创建一个从今天到下周每天都会发生变化的工作。在结束时间到达之后,这个工作就被放弃了。如果我错了,请纠正我。

    sys.dbms_scheduler.create_job(job_name        => 'BOMBASTICJOB'
                             ,job_type        => 'STORED_PROCEDURE'
                             ,job_action      => 'dingdongprocedure'
                             ,start_date      => to_date('30-09-2014 00:00:00' 
                                                              , 'dd-mm-yyyy hh24:mi:ss')
                             ,end_date        => to_date(null)
                             ,job_class       => 'DBMS_JOB$'
                             ,repeat_interval => 'Freq=Weekly; ByDay=Tue, Fri; ByHour=10, 13'
                              ,enabled          => true
                              ,auto_drop       => false
                              ,comments         => '');
    

【问题讨论】:

    标签: oracle plsql dbms-scheduler


    【解决方案1】:

    我在 12.1.0.1.0。您可以在一个简单的匿名块中创建作业:

    SQL> BEGIN
      2    DBMS_SCHEDULER.DROP_JOB (JOB_NAME => 'test_full_job_definition');
      3  END;
      4  /
    
    PL/SQL procedure successfully completed.
    
    SQL>
    SQL> BEGIN
      2    DBMS_SCHEDULER.create_job (
      3      job_name        => 'test_full_job_definition',
      4      job_type        => 'PLSQL_BLOCK',
      5      job_action      => 'BEGIN my_job_procedure; END;',
      6      start_date      => SYSTIMESTAMP,
      7      repeat_interval => 'freq=hourly; byminute=0; bysecond=0;',
      8      end_date        => NULL,
      9      enabled         => TRUE,
     10      comments        => 'Job defined entirely by the CREATE JOB procedure.');
     11  END;
     12  /
    
    PL/SQL procedure successfully completed.
    
    SQL>
    SQL> SELECT JOB_NAME, ENABLED FROM DBA_SCHEDULER_JOBS where job_name ='TEST_FULL_JOB_DEFINITION'
      2  /
    
    JOB_NAME                                 ENABL
    ---------------------------------------- -----
    TEST_FULL_JOB_DEFINITION                 TRUE
    
    SQL>
    

    更多例子here

    【讨论】:

    • 我编辑了我的答案。不需要匿名块。我们可以用作业调用过程。
    • @AliArdaOrhan 这是需要在匿名块中创建的工作。作业本身不需要任何 PL/SQL 块,它只是调度存储过程。
    猜你喜欢
    • 2018-02-17
    • 2018-02-01
    • 2021-01-21
    • 2016-10-09
    • 2017-02-22
    • 1970-01-01
    • 2017-01-31
    • 2012-01-20
    • 2021-10-31
    相关资源
    最近更新 更多