广告
返回顶部
首页 > 资讯 > 数据库 >Oracle事件驱动的调度作业
  • 801
分享到

Oracle事件驱动的调度作业

2024-04-02 19:04:59 801人浏览 泡泡鱼
摘要

oracle调度作业最常见的用法是基于时间的调度,设置特定的时间调度规则,依据规则在特定的时间点触发作业程序执行,大部分的作业都是这种类型。除此之外,还可以搭建基于事件的调度作业,就是依据特定的事件来触

oracle调度作业最常见的用法是基于时间的调度,设置特定的时间调度规则,依据规则在特定的时间点触发作业程序执行,大部分的作业都是这种类型。除此之外,还可以搭建基于事件的调度作业,就是依据特定的事件来触发调度作业的执行。基于事件驱动的调度作业是运用Oracle消息队列机制来实现的,以下例子给出具体的用法。

 

创建一个用来测试的用户并授权,要给予创建作业和管理队列的权限

conn / as sysdba

create user u1 identified by u1;

grant connect, resource to u1;

grant create job to u1;

grant aq_administrator_role to u1;

 

连接到测试用户,创建一个用来验证执行结果的表

conn u1/u1

create table t1(c1 varchar2(20), input_time date);

 

定义一个记录消息信息的类型

create or replace type event_queue_type as object(event_name varchar2(30));

/

 

创建队列表用于记录消息,指定表名和消息的类型名

begin

  dbms_aqadm.create_queue_table(queue_table        => 'event_queue_table',

                                queue_payload_type => 'event_queue_type',

                                multiple_consumers => true);

end;

/

 

创建消息队列,指定队列名和队列表

begin

  dbms_aqadm.create_queue(queue_name  => 'event_queue',

                          queue_table => 'event_queue_table');

end;

/

 

启动队列

begin

  dbms_aqadm.start_queue(queue_name => 'event_queue');

end;

/

 

查看队列信息

col queue_table for a30

col user_comment for a30

select name, queue_table, qid, queue_type, enqueue_enabled, dequeue_enabled, user_comment from user_queues;

 

NAME                           QUEUE_TABLE                           QID QUEUE_TYPE           ENQUEUE_ENABLED DEQUEUE_ENABLED USER_COMMENT

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

AQ$_EVENT_QUEUE_TABLE_E        EVENT_QUEUE_TABLE                   76605 EXCEPTioN_QUEUE        NO              NO            exception queue

EVENT_QUEUE                    EVENT_QUEUE_TABLE                   76606 NORMAL_QUEUE           YES             YES          

 

为了维护队列,Oracle会创建多个表用于不同的消息存储,处于性能等多方面的考量,很多这样的表采用IOT(Index-Organized Table)结构

select table_name, tablespace_name, iot_name, iot_type from user_tables;

 

TABLE_NAME                     TABLESPACE_NAME                IOT_NAME                       IOT_TYPE

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

T1                             USERS                                                        

EVENT_QUEUE_TABLE              USERS                                                        

AQ$_EVENT_QUEUE_TABLE_S        USERS                                                        

AQ$_EVENT_QUEUE_TABLE_L        USERS                                                        

SYS_IOT_OVER_76597             USERS                          AQ$_EVENT_QUEUE_TABLE_G        IOT_OVERFLOW

AQ$_EVENT_QUEUE_TABLE_T                                                                      IOT

AQ$_EVENT_QUEUE_TABLE_H                                                                      IOT

AQ$_EVENT_QUEUE_TABLE_I                                                                      IOT

AQ$_EVENT_QUEUE_TABLE_G                                                                      IOT

 

创建调度作业,指定执行的动作、触发作业的事件

begin

  dbms_scheduler.create_job(job_name        => 'event_based_job',

                            job_type        => 'plsql_block',

                            job_action      => 'insert into t1 values(''test'', sysdate);commit;',

                            start_date      => systimestamp,

                            event_condition => 'tab.user_data.event_name = ''test_event''',

                            queue_spec      => 'event_queue',

                            enabled         => true);

end;

/

 

执行以下PL/SQL块,向队列中传递消息

declare

  my_enqueue_options    dbms_aq.enqueue_options_t;

  my_message_properties dbms_aq.message_properties_t;

  my_message_handle     raw(16);

  my_queue_msg          event_queue_type;

begin

  my_queue_msg := event_queue_type('test_event');

  dbms_aq.enqueue(queue_name         => 'event_queue',

                  enqueue_options    => my_enqueue_options,

                  message_properties => my_message_properties,

                  payload            => my_queue_msg,

                  msgid              => my_message_handle);

  commit;

end;

/

 

验证调度作业执行结果,测试表中已经插入了数据

select * from t1;

 

C1                   INPUT_TIME

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

test                 2018-02-07 13:12:00

 

查询调度作业执行历史

conn / as sysdba

col owner for a10

col job_name for a20

col status for a10

col run_duration for a20

select *

  from (select owner,

               job_name,

               status,

               to_char(actual_start_date, 'yyyy-mm-dd hh34:mi:ss') actual_start_date,

               run_duration

          from dba_scheduler_job_run_details

         where job_name = 'EVENT_BASED_JOB'

         order by actual_start_date desc)

 where rownum < 10;

 

OWNER      JOB_NAME             STATUS     ACTUAL_START_DATE   RUN_DURATION

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

U1         EVENT_BASED_JOB      SUCCEEDED  2018-02-07 13:12:00 +000 00:00:00

 

实验完毕删除测试用户及其所有对象

conn / as sysdba

drop user u1 cascade;

您可能感兴趣的文档:

--结束END--

本文标题: Oracle事件驱动的调度作业

本文链接: https://www.lsjlt.com/news/49122.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle事件驱动的调度作业
    Oracle调度作业最常见的用法是基于时间的调度,设置特定的时间调度规则,依据规则在特定的时间点触发作业程序执行,大部分的作业都是这种类型。除此之外,还可以搭建基于事件的调度作业,就是依据特定的事件来触...
    99+
    2022-10-18
  • Redis中事件驱动模型的作用是什么
    这篇文章给大家介绍Redis中事件驱动模型的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言Redis 是一个事件驱动的内存数据库,服务器需要处理两种类型的事件。文件事件时...
    99+
    2022-10-18
  • python 包中的sched 事件调度器的操作方法
    目录一、延迟运行事件二、重叠事件三、事件优先级四、取消事件五、其他方法一、延迟运行事件 在一个延迟或规定时间之后执行事件,需要采用enter()方法,参数如下:间隔时间 ( 具体值决...
    99+
    2022-11-10
  • 怎么处理Oracle调度作业引起的空间骤增问题
    这篇文章主要介绍“怎么处理Oracle调度作业引起的空间骤增问题”,在日常操作中,相信很多人在怎么处理Oracle调度作业引起的空间骤增问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作