设为首页 收藏本站
查看: 763|回复: 0

[经验分享] Oracle任务调度之基于事件的任务调度(原创 )

[复制链接]
YunVN网友  发表于 2016-8-15 06:44:51 |阅读模式
  基于事件的Oracle JOB概述
  Oracle的任务调度不仅可以基于时间进行调度,也可以根据事件来触发。关于Oracle基于时间的调度管理可以参看http://czmmiao.iyunv.com/blog/1003505
  在Oracle的调度管理器里,使用高级队列(Advanced Queue)来触发事件。也就是说,可以通过应用程序向某个队列发送一个事件,从而触发某个任务执行。要创建基于事件的队列需要两个额外的信息,事件所在的队列名称以及任务触发的条件。一旦条件为真,则启动任务。在创建基于事件的Oracle JOB中会涉及到一些高级队列的知识,本文不做讨论。有兴趣的朋友可以自行查看资料
  实验环境
  创建一个测试用表
  SQL>conn hr/hr;
  Connected.
  SQL> create table event_job_test(id number constraint event_job_test_pk primary key,createdate date);
Table created.
创建序列以生成该表的主键
SQL> create sequence event_job_test_seq;
Sequence created.

  创建类型以存放队列里的消息格式

  SQL> create or replace type event_job_test_t as object(
  2  object_owner varchar2(50),event_name varchar2(50));
  3  /
Type created.

  创建队列表,该队列包含刚刚创建的类型event_job_test_t所包含的属性,也就是object_owner和object_name。
  SQL> begin
  2   dbms_aqadm.create_queue_table(
  3     queue_table=>'event_queue_tab',
  4     queue_payload_type=>'event_job_test_t',
  5     multiple_consumers=>true);
  6  end;
  7  /
PL/SQL procedure successfully completed.

  创建一个队列,并将该队列于前面创建的队列表关联。
SQL> begin
  2   dbms_aqadm.create_queue(
  3     queue_name=>'event_queue',
  4     queue_table=>'event_queue_tab');
  5  end;
  6  /
PL/SQL procedure successfully completed.

  启动该队列
SQL> begin
  2   dbms_aqadm.start_queue(queue_name=>'event_queue');
  3  end;
  4  /
PL/SQL procedure successfully completed.

创建基于事件的任务
  1、创建Program
   DSC0000.jpg
  
2、创建Schedule
   DSC0001.jpg
  其中tab.user_data.object_owner=‘’HR‘’和tab.user_data.event_name=‘’give_me_an_event‘'为两个单引号。表示该任务启动的条件为当队列出现消息,的object_owner属性为HR。event_name属性为give_me_an_event时就启动任务。
  该JOB的SQL如下

  BEGIN
sys.dbms_scheduler.create_job(
job_name => '"HR"."EVENT_BASED_JOB"',
job_type => 'PLSQL_BLOCK',
job_action => 'begin
   insert into event_job_test
     values(event_job_test_seq.nextval,sysdate);
end;',
event_condition => 'tab.user_data.object_owner=‘’HR‘’and
tab.user_data.event_name=‘’give_me_an_event‘’',
queue_spec => 'HR.EVENT_QUEUE',
start_date => systimestamp at time zone '+8:00',
job_class => 'DEFAULT_JOB_CLASS',
auto_drop => FALSE,
enabled => TRUE);
END;

  用如下方式启动任务
  declare
  l_enqueue_options dbms_aq.enqueue_options_t
  l_message_properties dbms_aq.message_properties_t
  l_message_handle raw(16)
  l_queue_msg event_job_test_t
 begin
  l_queue_msg := event_job_test_t('HR','give_me_an_event')
  dbms_aq.enqueue(
   queue_name=>'event_queue',
   enqueue_options=>l_enqueue_options,
   message_properties=>l_message_properties,
   payload=>l_queue_msg,
   msgid=>l_message_handle)
 commit
end;
/


  执行完毕后在测试表中检查结果如下
  SQL> select * from event_job_test ;

        ID CREATEDATE
---------- ------------------
         1 14-APR-11

删除所有创建的高级队列以及相关对象
  先删除基于事件的任务
  SQL> exec dbms_scheduler.drop_job('event_based_job');
PL/SQL procedure successfully completed.

停止队列
SQL> exec dbms_aqadm.stop_queue(queue_name=>'event_queue');
PL/SQL procedure successfully completed.

删除队列
SQL> exec dbms_aqadm.drop_queue(queue_name=>'event_queue');
PL/SQL procedure successfully completed.

删除队列表
SQL> exec dbms_aqadm.drop_queue_table(queue_table=>'event_queue_tab');
PL/SQL procedure successfully completed.

参考至:《教你成为10g OCP》韩思捷著
  本文原创,转载请注明出处、作者
  如有错误,欢迎指正
  邮箱:czmcj@163.com

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-257778-1-1.html 上篇帖子: Oracle 表空间的增删改查等操作 下篇帖子: Oracle 10g flashback table 索引名带来的变化
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表