【问题标题】:how to make dbms_scheduler.create_job configurable?如何使 dbms_scheduler.create_job 可配置?
【发布时间】:2019-07-22 04:07:54
【问题描述】:

我想让它可配置,而不是硬编码值 dbms_scheduler.create_job repaeat_interval。因此,我创建了一个新表,允许配置作业中的 repeat_interval。

下面的过程将列作为输入参数:

    PROCEDURE scheduled_job IS
      v_start_date swpurge_job_config.start_date%TYPE;
      v_freq       swpurge_job_config.freq%TYPE;
      v_byday      swpurge_job_config.byday%TYPE;
      v_byhour     swpurge_job_config.byhour%TYPE;
      v_byminute   swpurge_job_config.byminute%TYPE;
      v_bysecond   swpurge_job_config.bysecond%TYPE;
      v_end_date   swpurge_job_config.end_date%TYPE;
   BEGIN
      SELECT start_date
            ,freq
            ,byday
            ,byhour
            ,byminute
            ,bysecond
            ,end_date
        INTO v_start_date
            ,v_freq
            ,v_byday
            ,v_byhour
            ,v_byminute
            ,v_bysecond
            ,v_end_date
        FROM swpurge_job_config;
      dbms_scheduler.create_job(job_name        => 'Purge_MW_Log_Data'
                               ,job_type        => 'STORED_PROCEDURE'
                               ,job_action      => 'DBA_UTILS_OWNER.PURGE_TABLES'
                               ,start_date      => 'SYSTIMESTAMP'
                               ,repeat_interval => 'freq' || '=' ||
                                                   v_freq || '; ' ||
                                                   'byday' || '=' ||
                                                   v_byday || '; ' ||
                                                   'byhour' || '=' ||
                                                   v_byhour || '; ' ||
                                                   'byminute' || '=' ||
                                                   v_byminute || '; ' ||
                                                   'bysecond' || '=' ||
                                                   v_bysecond || ';'
                               ,end_date        => NULL
                               ,enabled         => TRUE
                               ,auto_drop       => FALSE
                               ,comments        => 'runs weekly and looks for partitions that needs to be purged');

   END scheduled_job;

不知道该怎么做。任何帮助表示赞赏。

错误消息:

ORA-01858:在需要数字的地方发现了一个非数字字符 ORA-06512:在“DBA_UTILS_OWNER.SWPURGE”,第 450 行 > “dbms_scheduler.create_job(job_name => 'Purge_MW_Log_Data'”

【问题讨论】:

  • 这是什么意思,“这是错误的”?在我看来很漂亮。
  • @Littlefoot 我收到 PLS-00306:调用“CREATE_JOB”时参数的数量或类型错误
  • 检查 JOB_ACTION。除非我错了,否则它必须用单引号括起来,所以它类似于job_action => chr(39) || job_config.job_action || chr(39)
  • @Littlefoot 还是同样的错误...
  • 很难说没有看到表定义。但是 create_job 的“启用”参数是 BOOLEAN 类型的,因为你的表中不能有 BOOLEAN 类型的列,我会怀疑。

标签: oracle plsql dbms-scheduler


【解决方案1】:
DECLARE
   PROCEDURE scheduled_job IS
      v_start_date swpurge_job_config.start_date%TYPE;
      v_freq       swpurge_job_config.freq%TYPE;
      v_byday      swpurge_job_config.byday%TYPE;
      v_byhour     swpurge_job_config.byhour%TYPE;
      v_byminute   swpurge_job_config.byminute%TYPE;
      v_bysecond   swpurge_job_config.bysecond%TYPE;
      --v_end_date   swpurge_job_config.end_date%TYPE;
   BEGIN
      SELECT start_date
            ,freq
            ,byday
            ,byhour
            ,byminute
            ,bysecond
           -- ,end_date
        INTO v_start_date
            ,v_freq
            ,v_byday
            ,v_byhour
            ,v_byminute
            ,v_bysecond
         --   ,v_end_date
        FROM swpurge_job_config;
      dbms_scheduler.create_job(job_name        => 'Purge_MW_Log_Data'
                               ,job_type        => 'STORED_PROCEDURE'
                               ,job_action      => 'OWNER.PROCEDURE'
                               ,start_date      => v_start_date
                               ,repeat_interval => 'freq' || '=' ||
                                                   v_freq || '; ' ||
                                                   'byday' || '=' ||
                                                   v_byday || '; ' ||
                                                   'byhour' || '=' ||
                                                   v_byhour || '; ' ||
                                                   'byminute' || '=' ||
                                                   v_byminute || '; ' ||
                                                   'bysecond' || '=' ||
                                                   v_bysecond || ';'
                               ,end_date        => NULL
                               ,enabled         => TRUE
                               ,auto_drop       => FALSE
                               ,comments        => 'something');

   END scheduled_job;

BEGIN

   scheduled_job();
END;
/

问题是 start_date 周围的单引号。另一个需要注意的重要事情是 v_end_date 不允许在 dbms_scheduler 中作为参数解析(不知道为什么),但这对我来说已经足够了。

【讨论】:

    猜你喜欢
    • 2010-12-18
    • 2015-06-15
    • 2014-05-05
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2016-06-04
    相关资源
    最近更新 更多