示例2:創(chuàng)建一個任務(STORED_PROCEDURE)
在這個demo中,我使用了帶參數(shù)的procedure,一種情況是使用默認值,另外一種情況是使用新設置的值。下面看具體的示例過程。
第一步:創(chuàng)建一個日志表和相應的procedure
SQL> create table sch_demo_log
2 ( arg_1 number,
3 arg_2 varchar2(32),
4 deal_date date
5 );
表已創(chuàng)建。
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 /
過程已創(chuàng)建。
第二步:創(chuàng)建一個調(diào)度程序并設置對應procedure中參數(shù)的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 過程已成功完成。
第三步:創(chuàng)建一個調(diào)度表(計劃)
在本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 過程已成功完成。
第四步:創(chuàng)建一個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;
未選定行
--還沒有到調(diào)度時間,稍等一下。。。
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參數(shù)看看
第六步:設置不同的job參數(shù)
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可以看到,這個時候,記錄的日志變成了新的參數(shù)。這個demo 說明,根據(jù)我們的需要,可以設置不同的運行期參數(shù)。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設置的參數(shù):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行。