Oracle 在存储过程中创建作业时,dbms_计划程序无法创建作业

Oracle 在存储过程中创建作业时,dbms_计划程序无法创建作业,oracle,plsql,oracle11g,dbms-scheduler,Oracle,Plsql,Oracle11g,Dbms Scheduler,我试图在执行一些逻辑后在存储过程中创建一个dbms_调度程序作业。我的程序代码如下。问题是调度程序代码没有运行,并且在创建作业时过程没有引发任何异常。当作为匿名块独立运行时,该作业创建良好。这是实现我想做的事情的正确方式吗 create or replace procedure PROC_INS_TEST AS v_success varchar2(255) := '1'; v_job_name varchar2(255); BEGIN SELECT '

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

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;

您似乎忘记了包含单独的异常块来捕获来自create_作业的异常:

    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;

当您捕获它与其他人一起抛出的任何异常时,您如何知道它不会抛出异常?您是否看到了只能为1的
dbms\u输出
结果,或者该结果没有出现-表明您进入了异常处理程序?无论如何,您创建作业的权限是通过角色授予的还是直接授予您的用户的?哎呀,我只是没有输出异常。我认为这是特权问题。它是通过角色授予的。将适当的权限授予用户后,其工作正常。感谢Alex Poole。让异常传播几乎总是更好的,而不是在别人时使用
,并尝试自己显示异常;首先,调用方可能没有启用
dbms\u输出
;如果调用它的PL/SQL块实际成功了,它将不会被调用。为什么在过程中使用create\u job而不是创建永久性job并使用run\u job?我希望获得唯一的job名称,因为可能会有多个实例在运行。识别可能失败的工作很容易。