3

是否可以將命名參數傳遞給dbms_scheduler作業,類型爲'stored_procedure'?我已經試過這樣:爲Oracle 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: Argument names are not supported for jobs without a program. ORA-06512: at "SYS.DBMS_ISCHED", line 207 ORA-06512: at "SYS.DBMS_SCHEDULER", line 602 ORA-06512: at line 2

我成功地用argument_position設置中設置的參數值與set_job_argument_value。但是可能會出現這種情況,我需要運行存儲過程,我只需要設置某些參數,但這不可行。有沒有辦法將命名參數傳遞給調度程序作業引起的存儲過程?

+0

[通過調度作業將參數傳遞給Oracle存儲過程]的可能的複製(http://stackoverflow.com/questions/9179775/passing-arguments-to-oracle-stored-procedure-through-scheduler-job ) – Vadzim

回答

4

作爲錯誤狀態,首先創建一個程序,然後是該作業。

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'); 
    ... 
+0

按照您提供的提示創建我的測試示例。但我仍然不知道如何設置命名參數stored_procedure。由於define_program_argument只能根據文檔傳遞argument_position。我開始認爲它不能這樣完成,我需要爲SP調用建立某種動態字符串? – skujins

+1

@Skuja [define PROGRAM argument](http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sched.htm#i1011161)採用參數名稱(不是真正的參數名稱,但可以be)+實際位置。定義JOB參數只需要位置(或名稱,如果你想..有兩個重載的API),這應該回到程序參數的位置/名稱。 – DazzaL