学习oracle10g的schedule

这几天看了看oracle10g的新特性之一,scheduler 中文叫调度程序.[@more@]

调度程序在9i中叫做job,在10g中也叫作job,不过10g对job进行了细分,并增强了一些功能.
在10g中,job由2部分组成:schedule和program.对应的中文是:
job 作业
schedule 计划
program 程序
以上3者都是作为独立的对象创建的.
schedule 定义job的运行时间(包括开始时间,结束时间,运行时间间隔等),说白了就是job什么时候执行.
program 定义job每次运行的程序,说白了是job每次都干什么.

创建job的时候可以指定job的schedule和program,或者只指定2者之一,或是都不指定.如果都不指定,就相当于9i的job了,自定义运行时间和运行任务.下面是一些例子:

0 先创建一个shell脚本,用作job的program.这里也说明10g的一个新特性,支持os命令.

[oracle@vm4 ~]$ vi send_mail.sh
[oracle@vm4 ~]$ more send_mail.sh
mail -s "10g scheduler" haochunpeng@aaa.com <10G scheduler
EOF
[oracle@vm4 ~]$


1 创建一个program,调用第0步创建的shell脚本:
C:>sqlplus system/oracle@vm4

SQL*Plus: Release 9.2.0.1.0 - Production on 星期一 10月 17 18:39:01 2005

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning and Data Mining options

SQL> begin
2 dbms_scheduler.create_program
3 ( program_name => 'TEST_SH',
4 program_type => 'EXECUTABLE',
5 program_action => '/tmp/send_mail.sh',
6 enabled => TRUE,
7 comments => 'test shell script'
8 );
9 end;
10 /

PL/SQL 过程已成功完成。

2 创建一个schedule,每1小时执行1次:

SQL> begin
2 dbms_scheduler.create_schedule
3 (
4 schedule_name => 'SCHEDULE_1_HOUR',
5 repeat_interval => 'FREQ=HOURLY; INTERVAL=1',
6 comments => 'every 1 hour'
7 );
8 end;
9 /

PL/SQL 过程已成功完成。

3 创建一个job,使用第1 2步创建的program和schedule:

SQL> begin
2 dbms_scheduler.create_job
3 ( job_name => 'test_job',
4 program_name => 'TEST_SH',
5 schedule_name=> 'SCHEDULE_1_HOUR',
6 comments => 'test job',
7 enabled => TRUE
8 );
9 end;
10 /

PL/SQL 过程已成功完成。

4 运行jobSQL> exec dbms_scheduler.run_job('test_job');

PL/SQL 过程已成功完成。

这里注意oracle是以os的nobody身份运行job的.如果program的脚本,nobody没有权限执行的话.那么job会运行失败的.
这里就有个例子,供参考:http://www.itpub.net/438459.html

5 创建没有程序的作业SQL> begin
2 dbms_scheduler.create_job
3 ( job_name => 'test_job_without_program',
4 schedule_name => 'SCHEDULE_1_HOUR',
5 job_type => 'EXECUTABLE',
6 job_action => '/tmp/aaa.sh',
7 enabled => TRUE,
8 comments => 'job without program'
9 );
10 end;
11 /

PL/SQL 过程已成功完成。

6 创建没有计划的作业
SQL> begin
2 dbms_scheduler.create_job
3 ( job_name => 'test_job_without_schedule',
4 program_name => 'TEST_SH',
5 start_date => to_timestamp('2005-10-18 17:10:00','yyyy-mm-dd hh24:mi:s
s'),
6 repeat_interval => 'FREQ=HOURLY;INTERVAL=1',
7 end_date => to_timestamp('2005-10-21 17:30:00','yyyy-mm-dd hh24:mi:s
s'),
8 comments => 'job without schedule'
9 );
10 end;
11 /

PL/SQL 过程已成功完成。

7 创建没有计划和程序的作业SQL> begin
2 dbms_scheduler.create_job
3 ( job_name => 'test_job_without_schee_and_pro',
4 .
SQL> begin
2 dbms_scheduler.create_job
3 ( job_name => 'test_job_without_sche_and_pro',
4 job_type => 'EXECUTABLE',
5 job_action => '/tmp/aaa.sh',
6 start_date => to_timestamp('2005-10-18 17:15:00','yyyy-mm-dd hh24:mi:s
s'),
7 repeat_interval => 'FREQ=HOURLY;INTERVAL=1',
8 end_date => to_timestamp('2005-10-21 18:40:00','yyyy-mm-dd hh24:mi:s
s'),
9 enabled => TRUE,
10 comments => 'job without program and schedule'
11 );
12 end;
13 /

PL/SQL 过程已成功完成。

8 其它:
查看job运行情况:
select * from user_scheduler_job_run_details

查看schedule的运行周期:
SQL> set serveroutput on size 999999
SQL> declare
2 l_start_date timestamp;
3 l_next_date timestamp;
4 l_return_date timestamp;
5 begin
6 l_start_date := trunc(systimestamp);
7 l_return_date := l_start_date;
8 for ctr in 1 .. 10 loop
9 dbms_scheduler.evaluate_calendar_string(
10 'FREQ=HOURLY;INTERVAL=1',
11 l_start_date,l_return_date,l_next_date
12 );
13 dbms_output.put_line('next time is: '||
14 to_char(l_next_date,'yyyy-mm-dd hh24:mi:ss')
15 );
16 l_return_date := l_next_date;
17 end loop;
18 end;
19 /
next time is: 2005-10-18 01:00:00
next time is: 2005-10-18 02:00:00
next time is: 2005-10-18 03:00:00
next time is: 2005-10-18 04:00:00
next time is: 2005-10-18 05:00:00
next time is: 2005-10-18 06:00:00
next time is: 2005-10-18 07:00:00
next time is: 2005-10-18 08:00:00
next time is: 2005-10-18 09:00:00
next time is: 2005-10-18 10:00:00

PL/SQL 过程已成功完成。

SQL>

10g的scheduler还能够与资源计划结合,但我想用到的并不太多,所以那部分先不弄了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值