当前位置:操作系统 > Unix/Linux >>

11g_job执行带参数的procedure

11g_job执行带参数的procedure
 
[plain] 
现有一个参数为date类型的存储:  
[sql] 
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的实现代码为:
[sql] 
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的参数设定值了:
 
[sql] 
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。注意:如有多个参数需要制定需要这样写
[sql] 
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:
 
[sql] 
EXEC DBMS_SCHEDULER.ENABLE('FFFF');  
EXEC DBMS_SCHEDULER.RUN_JOB('FFFF');  
实际上job参数时可以支持date类型的输入参数!!我机器版本为
[sql] 
SQL> select VERSION from v$instance;  
  
VERSION  
-----------------  
11.2.0.1.0  
 
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,