11g_job執行帶參數的procedure

現有一個參數爲date類型的存儲:

create or replace procedure t_pro(t_var in date)
as
begin
     dbms_output.put_line(TO_CHAR(T_VAR,'YYYY'));
     --dbms_output.put_line(T_VAR);
end;
/
job的實現代碼爲:

begin
	dbms_scheduler.create_job(
		job_name => 'FFFF',
		job_type => 'STORED_PROCEDURE',
		job_action => 'T_PRO',
		number_of_arguments => 1, 
		repeat_interval => 'FREQ=DAILY;INTERVAL=3', 
	    enabled => FALSE
		); 
end;
/
其中參數 job_type => 'STORED_PROCEDURE' 表示該job執行的是一個存儲過程類型,參數 job_action => 'T_PRO' 表示執行的是哪一個存儲過程(說白了就是存儲的名字)以下爲官方文檔對該參數解釋:

The action is the name of the stored procedure. You have to specify the schema if the procedure resides in another schema than the job. If case sensitivity is needed, enclose the schema name and the store procedure name in double quotes. For example, job_action_action=>'"Schema"."Procedure"'.PL/SQL procedures with INOUT or OUT arguments are not supported as job_action when the job or program type is STORED_PROCEDURE.
官方文檔要求 用戶名.存儲名字 這樣寫!而且存儲過程中有 輸入輸出和輸出參數時,job_type的值都不能爲 STORED_PROCEDURE。當然沒有了job_type參數,job_acton也不被支持了!

參數 number_of_arguments => 1 代表該job的執行程序(本例就是T_PRO)的參數個數(T_PRO的個數爲 1)。該參數必須要設置!起官方文檔的解釋爲:This attribute specifies the number of arguments that the job expects. The range is 0-255, with the default being 0.

參數 repeat_interval => 'FREQ=DAILY;INTERVAL=3'表示每天的3點爲執行該job的時間!該參數怎麼設置請參考官方文檔

參數 enabled => FALSE 表示是否啓用該job。這裏要設置爲FALSE ,注意大小寫!

job定義完成後,就要給該job的參數設定值了:

begin
	DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE (           
		job_name => 'FFFF',                     
		argument_position => 1,                                                   
		argument_value => SYSDATE
		);   
end;
/
參數 argument_position => 1 表示的是 該job的參數的位置,如果job中參數有多個,寫爲2,3,4....依次遞增1。注意:如有多個參數需要制定需要這樣寫

begin
	DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE (           
		job_name => 'FFFF',                     
		argument_position => 1,                                                   
		argument_value => SYSDATE
		);   
		DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE (           
		job_name => 'FFFF',                     
		argument_position => 2,                                                   
		argument_value => val2
		);  
		DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE (           
		job_name => 'FFFF',                     
		argument_position => 3,                                                   
		argument_value => val3
		); 
	    ......
end;
/

參數 argument_value => SYSDATE 表示你要傳入的值的定義。該參數官網解釋爲:

argument_value

The new value to be set for the program argument. To set a non-VARCHAR value, use the SET_JOB_ANYDATA_VALUE procedure.

給參數設定一個新的值,要設定一個非字符的值,使用SET_JOB_ANYDATA_VALUE 存儲!.

SET_JOB_ARGUMENT_VALUE can be used to set arguments of lightweight jobs but only if the argument is of type VARCHAR2.

該存儲給輕量級job的參數設置一個值而且該參數的類型要爲 VARCHAR2!

官網上很明確的告訴我:job的參數設置,只支持varchar2類型的!,但是實驗下來卻證明能支持date類型參數!!(驗證過程持續了2個小時)

啓用job和執行job:

EXEC DBMS_SCHEDULER.ENABLE('FFFF');
EXEC DBMS_SCHEDULER.RUN_JOB('FFFF');
實際上job參數時可以支持date類型的輸入參數!!我機器版本爲

SQL> select VERSION from v$instance;

VERSION
-----------------
11.2.0.1.0









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章