2016-09-22 78 views
0

我试图在执行某些逻辑后在存储过程中创建dbms_scheduler作业。我的程序代码如下。问题在于调度程序代码未运行,并且该过程在创建作业时未引发任何异常。当作为一个匿名块独立运行时,这项工作很好。这是完成我想要做的事情的正确方法吗?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; 
+2

你怎么知道当你一无所获,它确实有它扔不抛出异常'当别人'?你是否看到'dbms_output'结果,它只能是1,或者没有出现 - 表明你进入了异常处理程序?无论如何,您是否允许通过角色或直接向您的用户创建工作? –

+0

糟糕,我只是没有输出异常。我看到这是不足的特权问题。它是通过角色授予的。它在向用户授予适当的权限后工作正常。感谢Alex Poole。 – DG3

+0

让异常传播几乎总是更好,而不是使用'when others'并试图自己显示异常;一开始调用者可能没有启用'dbms_output';并且如果它实际上成功,则从中调用的PL/SQL块不能很高。 –

回答

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;