示例2:创建一个任务(STORED_PROCEDURE)
在这个demo中,我使用了带参数的procedure,一种情况是使用默认值,另外一种情况是使用新设置的值。下面看具体的示例过程。
第一步:创建一个日志表和相应的procedure
SQL> create table sch_demo_log
2 ( arg_1 number,
3 arg_2 varchar2(32),
4 deal_date date
5 );
表已创建。
SQL> create or replace procedure proc_sch(arg_1 in number ,
2 arg_2 in varchar2)
3 is
4 begin
5 insert into sch_demo_log values(arg_1,arg_2,sysdate);
6 commit;
7 end;
8 /
过程已创建。
第二步:创建一个调度程序并设置对应procedure中参数的default value
SQL> begin
2 DBMS_SCHEDULER.CREATE_PROGRAM(
3 program_name => 'TEST_PROG',
4 program_action => 'PROC_SCH',
5 program_type => 'STORED_PROCEDURE',
6 number_of_arguments => 2,
7 comments => 'sch test by STORED_PROCEDURE with argument',
8 enabled => false);
9 end;
10 /
PL/SQL 过程已成功完成。
SQL>
SQL> begin
2 DBMS_SCHEDULER.define_program_argument(
3 program_name => 'TEST_PROG',
4 argument_position => 1,
5 argument_type => 'number',
6 default_value => 100);
7
8 DBMS_SCHEDULER.define_program_argument(
9 program_name => 'TEST_PROG',
10 argument_position => 2,
11 argument_type => 'VARCHAR2',
12 default_value => 'Thomaszhang Test');
13 END;
14 /
PL/SQL 过程已成功完成。
第三步:创建一个调度表(计划)
在本demo中,每2分钟运行一次
SQL> begin
2 DBMS_SCHEDULER.create_schedule(
3 repeat_interval => 'FREQ=MINUTELY;INTERVAL=2',
4 start_date => sysdate,
5 comments => 'test',
6 schedule_name => 'TEST_SCH');
7 end;
8 /
PL/SQL 过程已成功完成。
第四步:创建一个job
SQL> begin
2 DBMS_SCHEDULER.create_job(
3 job_name => 'TEST_JOB',
4 program_name => 'TEST_PROG',
5 schedule_name => 'TEST_SCH',
6 job_class => 'DEFAULT_JOB_CLASS',
7 comments => 'arg test',
8 auto_drop => false,
9 enabled => false);
10 end;
11 /
PL/SQL 过程已成功完成。
SQL> exec DBMS_SCHEDULER.enable('TEST_PROG');
PL/SQL 过程已成功完成。
SQL> exec DBMS_SCHEDULER.enable('TEST_JOB');
PL/SQL 过程已成功完成。
第五步:检查运行情况,查看一下日志表记录情况
SQL> select * from sch_demo_log;
未选定行
--还没有到调度时间,稍等一下。。。
SQL> select * from sch_demo_log;
ARG_1 ARG_2 DEAL_DATE
---------- ------------------------ -------------------
100 Thomaszhang Test 2007-11-12 14:35:59
可以看到,这个时候,sch_demo_log记录的前2个字段,使用了我们前面define的缺省值.下面我set一个新的job参数看看
第六步:设置不同的job参数
SQL> begin
2 DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
3 job_name => 'TEST_JOB',
4 argument_position => 1,
5 argument_value => 200);
6
7 DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
8 job_name => 'TEST_JOB',
9 argument_position => 2,
10 argument_value => 'set new value first');
11 end;
12 /
PL/SQL 过程已成功完成。
SQL> select * from sch_demo_log;
ARG_1 ARG_2 DEAL_DATE
---------- ------------------------ -------------------
100 Thomaszhang Test 2007-11-12 14:35:59
200 set new value first 2007-11-12 14:37:59可以看到,这个时候,记录的日志变成了新的参数。这个demo 说明,根据我们的需要,可以设置不同的运行期参数。SQL> begin
2 DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
3 job_name => 'TEST_JOB',
4 argument_position => 1,
5 argument_value => 300);
6
7 DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
8 job_name => 'TEST_JOB',
9 argument_position => 2,
10 argument_value => 'set new value second');
11 end;
12 /
PL/SQL 过程已成功完成。再换一个看看:
SQL> select * from sch_demo_log;
ARG_1 ARG_2 DEAL_DATE
---------- ----------------------- -------------------
100 Thomaszhang Test 2007-11-12 14:35:59
200 set new value first 2007-11-12 14:37:59
300 set new value second 2007-11-12 14:39:59
清除通过set_job_argument_value设置的参数:SQL> begin
2 DBMS_SCHEDULER.reset_job_argument_value('TEST_JOB',1);
3 DBMS_SCHEDULER.reset_job_argument_value('TEST_JOB',2);
4 end;
5 /
PL/SQL 过程已成功完成。
SQL> select * from sch_demo_log;
ARG_1 ARG_2 DEAL_DATE
---------- ------------------------ -------------------
100 Thomaszhang Test 2007-11-12 14:35:59
200 set new value first 2007-11-12 14:37:59
300 set new value second 2007-11-12 14:39:59
100 Thomaszhang Test 2007-11-12 14:41:59可以看到又恢复到了我们前面定义的默认值。这个值,可以通过dba_scheduler_program_args视图看到。SQL> begin
2 DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
3 job_name => 'TEST_JOB',
4 argument_position => 1,
5 argument_value => 400);
6
7 DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
8 job_name => 'TEST_JOB',
9 argument_position => 2,
10 argument_value => 'set new value third');
11 end;
12 /
PL/SQL 过程已成功完成。
SQL> select * from sch_demo_log;
ARG_1 ARG_2 DEAL_DATE
---------- ---------------------- -------------------
100 Thomaszhang Test 2007-11-12 14:35:59
200 set new value first 2007-11-12 14:37:59
300 set new value second 2007-11-12 14:39:59
100 Thomaszhang Test 2007-11-12 14:41:59
400 set new value third 2007-11-12 14:43:59
SQL> begin
2 DBMS_SCHEDULER.reset_job_argument_value('TEST_JOB',1);
3 DBMS_SCHEDULER.reset_job_argument_value('TEST_JOB',2);
4 end;
5 /
PL/SQL 过程已成功完成。
SQL> select * from sch_demo_log;
ARG_1 ARG_2 DEAL_DATE
---------- ----------------------- -------------------
100 Thomaszhang Test 2007-11-12 14:35:59
200 set new value first 2007-11-12 14:37:59
300 set new value second 2007-11-12 14:39:59
100 Thomaszhang Test 2007-11-12 14:41:59
400 set new value third 2007-11-12 14:43:59
100 Thomaszhang Test 2007-11-12 14:45:59
已选择6行。