新年要有新气象!
原创: DBMS_SCHEDULER 中度解析: part 1
查看( 7046 ) /
评论( 45 )
TAG:
-
xzh2000
发布于2005-06-15 09:55:31
-
up一下
-
husthxd
发布于2005-06-15 11:51:57
-

-
fks123发布于2005-06-19 17:47:15
-
好,期待下一部分
-
LoveWinter
发布于2005-06-21 23:03:26
-
原创: DBMS_SCHEDULER 中度解析: part 2
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) 创建/使用/管理作业,程序,计划所需要的系统权限.
-
LoveWinter
发布于2005-06-23 21:07:15
-
天太热,没有心情继续发
北京这一周简直快要热疯了,因此我原来计划两周内发完
这个系列的计划又要延后了.等全部整理完毕,我会做
成一个完整的doc或者pdf文件.
-
LoveWinter
发布于2005-07-03 18:19:26
-
一些补充
1.在10G R2 中, 如果用dbms_scheduler创建的job的类型为executable, 需要create external job 权限。
2. 在使用create_job或者create_schedule前,请先检查
NLS_DATE_LANGUAGE, NLS_DATE_FORMAT,
NLS_TIMESTAMP_FORMAT, NLS_TIMESTAMP_TZ_FORMAT
等参数的值, 通过alter session 命令来修改
例如:
SQL> select * from nls_session_parameters;
alter session set NLS_DATE_LANGUAGE='AMERICAN';
alter session set NLS_DATE_FORMAT='dd-mm-yyyy hh24:mi:ss';
alter session set NLS_TIMESTAMP_TZ_FORMAT='dd-mm-yyyy HH:MI:SS.FF AM TZR'
begin
dbms_scheduler.create_job(
job_name=> 'zip_emlog',
job_type=> 'EXECUTABLE',
job_action =>'/home/leo/zip_log.sh',
enabled=>true,
start_date=>'03-07-2005 9:30:00 PM + 8:00',
repeat_interval=>'FREQ=MINUTELY;INTERVAL=30',
end_date=>'31-07-2005 9:30:00 PM + 8:00',
comments=>'Get a latest em log copy and compress it every 30 minutes');
end;
/
-
sinomis发布于2005-07-06 13:21:48
-
顶
-
xjg发布于2005-07-08 15:00:11
-
UP
要是什么时候ORACLE能同时发布中文文档就好了.
-
西门吹牛发布于2005-08-12 10:47:12
-
好文章
-
starhot
发布于2005-08-30 14:24:37
-
近来正在翻阅Oracle 安装CD中附带的Document感觉资源很丰富的
-
stenny
发布于2006-01-05 16:16:35
-
up 一个
-
huangyb发布于2006-01-13 17:52:38
-
支持原创!!
期盼LoveWinter版主的part III
-
常继百发布于2006-02-11 22:40:13
-
知识积累得确实是不错得
-
okone96发布于2006-03-30 09:00:55
-
QUOTE:
最初由 xjg 发布
特别期待
[B]UP
要是什么时候ORACLE能同时发布中文文档就好了. [/B]
-
zhangfengh
发布于2006-05-16 10:01:48
-
顶一下,很好的总结
-
vecentli
发布于2006-05-30 10:51:58
-
把10G admin guide翻译过来就够用拉。。

-
tom027发布于2006-07-27 09:40:27
-
不错
-
cooler
发布于2006-07-28 16:11:21
-
很好,学习
-
forumlion发布于2006-07-28 17:32:24
-
这个东西代替了cron,但需要了解的东西太多,oracle够牛的
-
forumlion发布于2006-07-28 17:33:24
-
在新特性中业有,据说有中文版
QUOTE:
最初由 vecentli 发布
[B]把10G admin guide翻译过来就够用拉。。
[/B]
-
ppiao发布于2006-08-14 22:33:14
-
good
-
cainiao2
发布于2006-08-29 23:05:16
-
up
-
aben_xml
发布于2006-09-12 12:07:02
-
支持一下
-
robixiao发布于2006-09-30 11:24:29
-
UP
-
robixiao发布于2006-09-30 11:24:41
-
路过,学习
-
leetaedong发布于2006-10-04 18:05:04
-

-
mis_wub发布于2006-12-07 16:45:54
-
要學的東西也太多了
-
cainiao2
发布于2006-12-08 10:09:14
-
感谢!
-
myfriend2010
发布于2006-12-09 16:17:11
-
good!
-
cainiao2
发布于2006-12-11 08:35:47
-
支持!
标题搜索
日历
|
|||||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
| 1 | |||||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | |||
| 9 | 10 | 11 | 12 | 13 | 14 | 15 | |||
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | |||
| 23 | 24 | 25 | 26 | 27 | 28 | 29 | |||
| 30 | |||||||||
我的存档
数据统计
- 访问量: 431
- 日志数: 4
- 建立时间: 2008-01-08
- 更新时间: 2008-01-08
