ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 利用DBMS_SCHEDULER、DBMS_AQ、DBMS_ADADM实现基于时间和基于事件的自动执行任务

利用DBMS_SCHEDULER、DBMS_AQ、DBMS_ADADM实现基于时间和基于事件的自动执行任务

原创 Linux操作系统 作者:物理狂人 时间:2011-12-14 19:24:13 0 删除 编辑

一、创建基于时间的作业


1)创建表t1

SQL> create table t1 (id number(10));

表已创建。


2)创建存储过程tt

SQL> create procedure tt as

  2  begin

  3  insert into t1 values(2);

  4  commit;

  5  end;

  6  /

过程已创建。


3)创建程序use_tt

SQL>  begin

  2   dbms_scheduler.create_program(

  3   program_name=>'SCOTT.use_tt',

  4   program_action=>'SCOTT.TT',

  5   program_type=>'STORED_PROCEDURE',

  6   number_of_arguments=>0,

  7   comments=>'',

  8   enabled=>TRUE);

  9   end;

  10  /

PL/SQL 过程已成功完成。


4)创建计划use_tt_1

SQL> begin

  2  dbms_scheduler.create_schedule(

  3  repeat_interval=>'FREQ=SECONDLY;INTERVAL=5',

  4  start_date=>systimestamp at time zone '+6:00',

  5  schedule_name=>'"SCOTT"."USE_TT_1"');

  6  end;

  7  /

PL/SQL 过程已成功完成。


5)创建作业tt_job

SQL> begin

  2  dbms_scheduler.create_job(

  3  job_name=>'"SCOTT"."TT_JOB"',

  4  program_name=>'SCOTT.USE_TT',

  5  schedule_name=>'SCOTT.USE_TT_1',

  6  job_class=>'DEFAULT_JOB_CLASS',

  7  auto_drop=>FALSE,

  8  enabled=>TRUE);

  9  end;

 10  /

PL/SQL 过程已成功完成。


6)查看job信息

SQL> col job_name format a15;

SQL> col program_name format a15;

SQL> col schedule_name format a15;

SQL> select job_name, program_name, schedule_name from  user_scheduler_jobs;

JOB_NAME        PROGRAM_NAME    SCHEDULE_NAME

--------------- --------------- ---------------

TT_JOB          USE_TT          USE_TT_1

查看运行job的动态信息,发现被执行了140次

SQL>SELECT COUNT(1) FROM USER_SCHEDULER_JOB_RUN_DETAILS WHERE JOB_NAME='TT_JOB';

  COUNT(1)

----------

       140

查看t1表,发现不断有数据插入

SQL> select count(*) from t1;

  COUNT(*)

----------

       145


二、创建基于事件的作业


1)创建表event_t

SQL> create table event_t(event_ varchar2(100));

表已创建。


2)创建类型t_event_q,用于说明消息在队列中存放的格式

SQL> create or replace type t_event_q as object(

  2  object_owner varchar2(50),event_name varchar2(50));

  3  /

类型已创建。


3)创建队列表event_q

SQL>  begin

  2  dbms_aqadm.create_queue_table(

  3  queue_table=>'event_q',

  4  queue_payload_type=>'t_event_q',

  5  multiple_consumers=>true);

  6 end;

  7 /

PL/SQL 过程已成功完成。


4)创建队列e_q,并启动队列

SQL> begin

  2  dbms_aqadm.create_queue(

  3  queue_name=>'e_q',

  4  queue_table=>'event_q');

  5  end;

  6  /

PL/SQL 过程已成功完成。

SQL> exec dbms_aqadm.start_queue(queue_name=>'e_q');

PL/SQL 过程已成功完成。


5)创建存储过程t2

SQL>create or replace procedure t2 as

2 begin

3 insert into event_t values('event has recevie');

4 commit;

5 end;

6 /

过程已创建。


6)创建程序use_t2

SQL>  begin

  2   dbms_scheduler.create_program(

  3   program_name=>'SCOTT.use_t2',

  4   program_action=>'SCOTT.T2',

  5   program_type=>'STORED_PROCEDURE',

  6   number_of_arguments=>0,

  7   comments=>'',

  8   enabled=>TRUE);

  9   end;

  10  /

PL/SQL 过程已成功完成。


7)创建作业event_job

SQL> begin

2 dbms_scheduler.create_job(

3 job_name=>'"SCOTT"."EVENT_JOB"',

4 program_name=>'SCOTT.USE_T2',

5 event_condition=>'tab.user_data.object_owner=''SCOTT'' 

6 and tab.user_data.event_name=''give_me_an_event''',

7 queue_spec=>'SCOTT.E_Q',

8 job_class=>'DEFAULT_JOB_CLASS',

9 auto_drop=>FALSE,

10 enabled=>TRUE);

11  end;

12 /

PL/SQL 过程已成功完成。


8)发出事件

SQL>  declare

  2  aa dbms_aq.enqueue_options_t;

  3  bb dbms_aq.message_properties_t;

  4  cc raw(16);

  5  dd t_event_q;

  6  begin

  7  dd:=t_event_q('SCOTT','give_me_an_event');

  8  dbms_aq.enqueue(

  9  queue_name=>'e_q',

 10  enqueue_options=>aa,

 11  message_properties=>bb,

 12  payload=>dd,

 13  msgid=>cc);

 14  end;

 15  /

PL/SQL 过程已成功完成。


9)查看结果

SQL> commit;

提交完成。

SQL> select * from event_t;

EVENT_

----------------------------------------

event has recevie

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24104518/viewspace-713330/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-06-16

  • 博文量
    80
  • 访问量
    140535