|
Re: 原创: DBMS_SCHEDULER 中度解析: part 2
最初由 LoveWinter 发布
[B]3. 创建程序 (program)
什么是程序? 我的理解就是准备计划需要的元数据(metadata),它
包括以下部分:
程序名;
程序中用到的参数: 例如程序的类型,以及具体操作的描述
来看一个例子
begin
dbms_scheduler.create_program(
program_name=> 'DAILY_BACKUP_SH',
program_type=> 'EXECUTABLE',
program_action=> '/home/oracle/script/daily_backup.sh');
end;
/
这个例子将会创建一个名为"DAILY_BACKUP_SH"的程序,类型是可执行的shell脚本,脚本的名称是“/home/oracle/script/daily_backup.sh”
Q1: 程序和作业相比,有什么区别呢?
A1: 程序其实是可以与作业分离的,因此不同的用户可以在不同的时间段去重用它.而一个作业是属于特定的用户的;
另外,将程序与作业分离,也就激活了一个新的程序库(Program Library),利用程序库,用户可以很自由地选择特定的程序在特定的时间段运行,以及自由的配置程序执行时的参数.
Q2: 能否解释一下 create_program与create_job的关系?
A2: 首先,你应该知道创建程序并不是一个计划的必须组成部分,一个计划可以没有程序,但是必须有一个已经定义好的作业;
另外,program_action这个参数也是可选的,假如程序的类型是pl/sql 块,你完全可以在创建作业时来指定它.
上面已经提到了,程序和作业可以是分离的,这样一个程序的具体执行(ACTION) 就可以灵活地确定。它既可以只运行一次,也可以在多个不同的作业中来重用这个执行. 这样一来,在修改针对一个作业的计划时就非常灵活,你不需要重新创建pl/sql块.
Q3: 运行 create_program需要什么权限 ?
A3: 要保证create_program能够顺利执行,你同样需要CREATE JOB这个系统权限. 如果一个用户拥有了create any job这个权限,它就可以创建属主为任何用户的程序(SYS用户除外)
与创建作业一样,一个程序建立完毕,缺省的状态也是非激活的,当然你可以在创建程序时,显式的设置enabled参数为true来
激活它.
Q4: 能否介绍一下create_program这个过程的各个参数?
更多的例子?
A4:
program_name: 指定程序的名称;
program_type: 目前只支持下面三种:
STORED_PROCEDURE
PLSQL_BLOCK
EXECUTABLE
program_action: (有长度限制,因为类型是varchar2)
存储过程的名称;
具体的pl/sql代码
操作系统脚本名称
来看一个使用pl/sql块的例子
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name => 'LEO.UPDATE_STATS',
program_type => 'PLSQL_BLOCK',
program_action => 'DECLARE
sUsername varchar2(30);
cursor cur is select username from dba_users
where username not in ('SYS','SYSTEM','SYSMAN','DBSNMP')
and account_status='OPEN' and substr(username,1,5)<>'MGMT_' ;
BEGIN
OPEN cur;
FETCH cur into sUsername;
WHILE cur%Found
LOOP
DBMS_STATS.GATHER_SCHEMA_STATS (sUsername);
FETCH cur into sUsername;
END LOOP;
close cur;
END;');
END;
/
上面这个例子创建一个名为"UPDATE_STATS"的程序,它的类型是PL/SQL 块,完成更新非系统用户的统计信息的工作。在这个基础上你可以定制一个合理的计划,来定期执行这个程序.
4. 配置程序的参数
先来看一个例子
begin
dbms_scheduler.create_program(
program_name=> 'LEO.UPDATE_STATS_2',
program_action=> 'LEO.UPDATE_SCHEMA_STATUS');
program_type=> 'STORED_PROCEDURE',
number_of_arguments => 1,
enabled => TRUE);
dbms_scheduler.define_program_argument(
program_name=> 'UPDATE_STATS_2',
argument_name => 'SCHEMA_NAME',
argument_position => 1,
argument_type => 'varchar2',
default_value => 'HR');
end;
/
这个例程是不是很像上面的那个例子呢? 对,它们的区别只是
在这个例子中,程序的类型是存储过程,而不是pl/sql块.
解释:
使用define_program_argument这个过程来定义一个程序所需要的参数. 有两点说明一下:
1) 程序如果使用了参数,就必须事先指定,这样才能在程序被job使用时生效;
2) 定义程序的参数不会改变程序的激活属性。也就是说,如果一个程序是没有激活的状态,运行了define_program_argument过程不会自动激活这个程序.
关于权限:
缺省情况下只有program的owner才能修改创建的程序,如果用户被授予了alter 权限 或者 create any job权限,就可以修改属主为另一个用户的程序.
5. 创建计划(Schedule)
其实,如果你已经了解了怎样创建作业和程序,就等于已经掌握怎样创建计划了。你需要做的附加工作只是指定计划的开始时间,结束时间,重复频率等等.
来看一个例子
begin
dbms_scheduler.create_job(
job_name=> 'leo.UPDATE_STATS_JOB',
program_name=> 'leo.UPDATE_STATS_2',
start_date=>'2005-06-20 11:00.00.000000 PM +8:00',
repeat_interval=>'FREQ=MONTHLY;INTERVAL=1',
end_date=>'2006-06-20 11:00.00.000000 PM +8:00',
comments=>'Monthly statistics collection job');
end;
/
start_date和end_date这两个参数需要说明一下: 它们的数据类型
是timestamp,因此需要精确的指定时间和时区. 时间格式继承的是NLS_DATE_FORMAT这个初始化参数的值.
下一部分介绍:
1) 配置作业的参数;
2) 创建/使用/管理作业,程序,计划所需要的系统权限. [/B]
[PHP]
SQL> EDIT
已写入 file afiedt.buf
1 begin
2 dbms_scheduler.create_program(
3 program_name=> 'STORED_PROCEDURE_TEST',
4 program_action=> 'PROC_TEST',
5 program_type=> 'STORED_PROCEDURE',
6 number_of_arguments => 1,
7 enabled => TRUE);
8 COMMIT;
9 dbms_scheduler.define_program_argument(
10 program_name=> 'STORED_PROCEDURE_TEST',
11 argument_name => 'P_NAME',
12 argument_position => 1,
13 argument_type => 'VARCHAR2',
14 default_value => 'TEST');
15* end;
SQL> /
begin
*
第 1 行出现错误:
ORA-27456: 程序 "XYS.STORED_PROCEDURE_TEST" 的参数并未全部定义
ORA-06512: 在 "SYS.DBMS_ISCHED", line 5
ORA-06512: 在 "SYS.DBMS_SCHEDULER", line 30
ORA-06512: 在 line 2
/
[/PHP]
参照你上面的例子创建一个program,type是stored_procedure,使用了一个参数,怎么也过不去,不知道什么原因,不加参数没有问题! |
|