通过Oracle Schedule-Job执行Oracle Schedule-Program

时间:2017-03-24 07:10:01

标签: sql database oracle plsql

我知道为了在数据库表上安排任何操作,我必须形成一个调度链,即一个链接调度(DBMS_SCHEDULER.CREATE_SCHEDULE)和一个程序(DBMS_SCHEDULER.CREATE_PROGRAM)的作业(DBMS_SCHEDULER.CREATE_JOB) 。但是,如果我想通过PROGRAM和链接的JOB完成相同的任务呢?可能吗 ?我试过,当我检查程序日志时,它显示我:

   RUNS      FAILS
======================
    10        10

这意味着JOB已经执行了10次(以5秒的间隔运行)并且它已经失败了相同的次数。

以下是有关JOB和PROGRAM的代码:

PROGRAM-CODE :
=================

BEGIN
SYS.DBMS_SCHEDULER.CREATE_PROGRAM
(
  program_name         => 'HR.INSERT_PROG'
 ,program_type         => 'PLSQL_BLOCK'
 ,program_action       => 'insert into sch_test values (s1.nextval,s2.nextval)'
 ,number_of_arguments  => 0
 ,enabled              => TRUE
 ,comments             => NULL
);
END;


JOB-CODE :
==========

BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB
(
   job_name        => 'HR.JOB1'
  ,schedule_name   => 'HR.INSERT_SCH'
  ,program_name    => 'HR.INSERT_PROG'
  ,comments        => NULL
);
END;

相关的表永远不会被填充。如果有人能告诉我,我在这里做错了什么?如果没有附表,这是不是可以实现?

1 个答案:

答案 0 :(得分:2)

您不必创建单独的PROGRAM和SCHEDULE,您可以将所有内容放在一个JOB中:

DBMS_SCHEDULER.CREATE_JOB
(
   job_name        => 'HR.JOB1'
  ,start_date      => LOCALTIMETAMP
  ,repeat_interval => 'FREQ=SECONDLY;INTERVAL=5'
  ,end_date        => NULL
  ,job_class       => 'DEFAULT_JOB_CLASS'
  ,job_type        => 'PLSQL_BLOCK'
  ,job_action      => 'insert into sch_test values (s1.nextval,s2.nextval);'
  ,enabled         => TRUE
);

命名的计划对象和命名的程序对象仅在您有多个以复杂的组合和依赖关系运行时才有用。