【问题标题】:dbms_scheduler fails to create job when created within a stored procedure在存储过程中创建时,dbms_scheduler 无法创建作业
【发布时间】:2017-01-31 10:00:35
【问题描述】:

在执行一些逻辑后,我试图在存储过程中创建一个 dbms_scheduler 作业。我的程序代码如下。问题是调度程序代码没有运行,并且该过程在创建作业时没有抛出任何异常。当作为匿名块独立运行时,该作业创建良好。这是完成我想做的事情的正确方法吗?

create or replace procedure PROC_INS_TEST AS
     v_success varchar2(255) := '1';
     v_job_name varchar2(255);
    BEGIN

      SELECT 'TEST' || dbms_scheduler.generate_job_name into v_job_name
      FROM DUAL;  

      INSERT INTO T_TEMP_STAGING--log table
      (job_id, process_name) VALUES (1, 'TEST');
         Commit;
          v_success := '1';

       BEGIN
          sys.dbms_scheduler.create_job (
            job_name        => v_job_name,
            job_type        => 'PLSQL_BLOCK',
            job_action      => 'BEGIN PROC_TEST_SCHEDULER; END;',
            --start_date      => sysdate,
            --repeat_interval => 'freq=hourly; byminute=0; bysecond=0;',
            enabled         => TRUE);

        END;
        dbms_output.put_line(v_success);


    EXCEPTION
        WHEN OTHERS THEN        
          v_success = '0';
          ROLLBACK;
          RETURN;
    END PROC_INS_TEST;

【问题讨论】:

  • 当你用when others 捕获它抛出的任何东西时,你怎么知道它没有抛出异常?您是否看到只能为 1 的 dbms_output 结果,或者没有出现 - 表明您进入了异常处理程序?无论如何,您创建工作的权限是通过角色授予还是直接授予您的用户?
  • 糟糕,我只是没有输出异常。我看到这是权限不足的问题。它是通过角色授予的。授予用户适当的权限后,它工作正常。谢谢亚历克斯普尔。
  • 让异常传播几乎总是更好,而不是使用when others 并尝试自己显示异常;首先,调用者可能没有启用dbms_output;如果它实际上成功了,那么调用它的 PL/SQL 块就不能再高了。
  • 为什么在过程中使用 create_job 而不是创建永久作业并使用 run_job?
  • 我想获得唯一的作业名称,因为可能会运行多个实例。识别可能失败的工作很容易。

标签: oracle plsql oracle11g dbms-scheduler


【解决方案1】:

您似乎忘记包含单独的异常块来捕获来自 create_job 的异常:

    begin
        sys.dbms_scheduler.create_job (
        job_name        => v_job_name,
        job_type        => 'PLSQL_BLOCK',
        job_action      => 'BEGIN PROC_TEST_SCHEDULER; END;',
        enabled         => TRUE);
    exception when other than
        dbms_output.put_line('Job ' || job_name || ' cannot be created! ' || SQLERRM);
        raise;
    end;

【讨论】:

    猜你喜欢
    • 2014-11-24
    • 2018-02-01
    • 2015-01-08
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多