1

いくつかのロジックを実行した後、ストアド プロシージャ内で 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;
4

1 に答える 1

2

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;
于 2016-09-25T14:04:46.123 に答える