梦幻之旅

DEBUG - 天道酬勤

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  671 随笔 :: 6 文章 :: 256 评论 :: 0 Trackbacks
示例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行。

posted on 2011-09-14 13:16 HUIKK 阅读(727) 评论(0)  编辑  收藏 所属分类: DataBase

只有注册用户登录后才能发表评论。


网站导航: