4

タイプが「stored_procedure」のdbms_schedulerジョブの名前付き引数をに渡すことは可能ですか?私はこの方法を試しました:

-- 1) example dummy procdure
CREATE OR REPLACE PROCEDURE my_test_proc (
 param1 IN NVARCHAR2,
 param2 IN NUMBER,
 param3 IN NUMBER
) IS
BEGIN
-- ...
END;

-- 2)Example dummy job:
BEGIN    
    dbms_scheduler.create_job(
        job_name => 'my_test_job'
        ,job_type => 'STORED_PROCEDURE'
        ,job_action => 'my_test_proc'
        ,start_date => sysdate
        ,number_of_arguments => 3
        ,enabled => FALSE
        ,auto_drop =>FALSE
    );
END;
-- 3)Set named param value:
BEGIN  
    dbms_scheduler.set_job_argument_value(
        job_name => 'my_test_job'
        ,argument_name => 'param1' 
        ,argument_value => 'some value'
    );
END;  

次のエラーが発生します:ORA

-27484:引数名は、プログラムのないジョブではサポートされていません。ORA-06512:「SYS.DBMS_ISCHED」の207行目ORA-06512:「SYS.DBMS_SCHEDULER」の602行目ORA-06512:2行目

引数_position設定を使用して、set_job_argument_valueでパラメーター値を正常に設定しました。ただし、特定のパラメーターのみを設定する必要があるストアドプロシージャを実行する必要があり、これが機能しない場合があります。スケジューラジョブによって実行されるストアドプロシージャに名前付き引数を渡す方法はありますか?

4

2 に答える 2

8

エラーが示すように、最初にプログラムを作成し、次にその上でジョブを作成します。

dbms_scheduler.create_program(program_name        => 'YOUR_PROGRAM',
                              program_type        => 'STORED_PROCEDURE',                                                          
                              program_action      => 'my_test_proc', 
                              number_of_arguments => 2,
                              enabled             => false,
                              comments            => 'Comments you want');

dbms_scheduler.define_program_argument(program_name      => 'YOUR_PROGRAM',
                                       argument_name     => 'param1',
                                       argument_position => 1,
                                       argument_type     => 'VARCHAR2',
                                       default_value     => '');
    ..etc, do for all 3.                                         

dbms_scheduler.enable (name => 'YOUR_PROGRAM');


dbms_scheduler.create_job(job_name        => 'my_test_job',
                          program_name    => 'YOUR_PROGRAM',
                          start_date      => systimestamp,
                          end_date        => null,
                          ...

dbms_scheduler.set_job_argument_value(job_name          => 'my_test_job',
                                      argument_position => 1,
                                      argument_value    => 'value');
  ...
于 2013-01-22T09:55:38.890 に答える