一、回顾

  调度分基于时间的调度和基于事件的调度。

  稍微复习一下前面的只是请浏览:《ORACLE调度之基于时间的调度(一)【weber出品】

二、知识补充

  1、队列:一种数据结构,就像一根管道一样,进程一个个的塞进去,然后一个个的出来,讲究的是先进先出。

  2、高级队列:

  a、高级队列管理是Oracle数据库的一个特性,它提供消息队列管理功能。这是一个非常可靠、安全和可伸缩的消息管理系统,因为它使用与其他基于Oracle技术的应用程序相同的数据库特性。

  b、高级队列管理的一个很大优点是它可以通过PL/SQL、Java或C来访问,这样你就可以把来自一个Java servlet的消息入队列和使PL/SQL存储过程中的相同消息出队列。 
  c、高级队列管理的另一个优点是你可以利用这一软件通过Oracle Net Services (SQL*Net)、HTTP(S)和SMTP,在远程节点之间传播消息。高级队列甚至可以通过消息网关与非Oracle的消息管理系
  统(如IBM MQSeries)相集成。 
  d、Oracle高级队列管理提供了单消费者队列和多消费者队列。单消费者队列只面向单一的接收者。多消费者队列可以被多个接收者使用。当把消息放入多消费者队列时,应用程序的程序员必须显式地在消息属性中指定这些接收者,或者建立决定每条消息的接收者的基于规则的订阅过程。

三、基于事件的调度

创建测试用表

conn hr/hr

create table event_job_test(id number,createdatae date);

alter table event_job_test add constraint pk_event_job_test primary key(id);

create sequence seq_event_job_test;

创建一个类型:

create or replace type t_event_queue as object(object_owner varchar2(),event_name varchar2());

创建一个队列表,该队列包含的字段就是我们刚才创建的类型t_event_queue所包含的属性。

conn /as sysdba
grant execute on dbms_aqadm to hr;
conn hr/hr begin
dbms_aqadm.create_queue_table(
queue_table=>'event_queue_tab',
queue_payload_type=>'t_event_queue',
multiple_consumers=>true);
end;
/

创建一个队列,并将该队列与前面创建的队列表关联

begin
dbms_aqadm.create_queue(
queue_name=>'event_queue',
queue_table=>'event_queue_tab');
end;
/

启动队列

begin
dbms_aqadm.start_queue(queue_name=>'event_queue');
end;
/

创建一个基于事件的任务

conn /as sysdba

BEGIN
sys.dbms_scheduler.create_job(
job_name => '"HR"."EVENT_BASE_JOB"',
job_type => 'PLSQL_BLOCK',
job_action => 'begin
insert into hr.event_job_test values(seq_event_job_test.nextval,sysdate);
commit;
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;

向队列中插入消息

没插入之前,查询表,发现没数据。

conn hr/hr

select * from event_job_test;

向队列里插入消息

conn /as sysdba

grant execute on dbms_aq to hr;

conn hr/hr

declare
l_enqueue_options dbms_aq.enqueue_options_t;
l_message_properties dbms_aq.message_properties_t;
l_message_handle raw();
l_queue_msg t_event_queue;
begin
l_queue_msg := t_event_queue('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; select * from event_job_test;

删除作业:

begin
dbms_scheduler.drop_job(job_name => '"HR"."EVENT_BASE_JOB"', force => true);
end;

创建基于事件的调度加载数据

创建测试用表

conn scott/tiger

create table t as select * from emp where =;

vi /u01/load.ctl

load data
infile '/u01/data.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
truncate
into table t
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO) vi /u01/load.sh #!/bin/bash
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2/db_1
export ORACLE_SID=orcl
$ORACLE_HOME/bin/sqlldr scott/tiger control=/u01/load.ctl log=/u01/load.log

保存退出

chmod +x /u01/load.sh

将emp中的数据转储到/u01/data.txt中:

set trims on
spool /u01/data.txt select
EMPNO||','||
ENAME||','||
JOB||','||
MGR||','||
HIREDATE||','||
SAL||','||
COMM||','||
DEPTNO from emp; spool off

创建一个类型:

sqlplus scott/tiger

create or replace type t_event_queue as object
(
object_owner varchar2(),
object_name varchar2(),
event_type varchar2(),
event_timestamp number()
);
/

创建一个队列表,该队列包含的字段就是我们刚才创建的类型t_event_queue所包含的属性。

conn /as sysdba

grant execute on dbms_aqadm to scott;

conn scott/tiger

begin
dbms_aqadm.create_queue_table(
queue_table=>'event_queue_tab',
queue_payload_type=>'t_event_queue',
multiple_consumers=>true);
end;
/

创建一个队列,并将该队列与前面创建的队列表关联

begin
dbms_aqadm.create_queue(
queue_name=>'event_queue',
queue_table=>'event_queue_tab');
end;
/

启动队列

begin
dbms_aqadm.start_queue(queue_name=>'event_queue');
end;
/

创建一个基于事件的任务

conn /as sysdba

BEGIN
sys.dbms_scheduler.create_job(job_name => '"SYS"."PERFORM_DATA_LOAD"', --属主必须是sys
job_type => 'EXECUTABLE',
job_action => '/u01/load.sh',
event_condition => 'tab.user_data.object_owner = ''SCOTT''
and tab.user_data.object_name = ''DATA.TXT''
and tab.user_data.event_type = ''FILE_ARRIVAL''
and tab.user_data.event_timestamp < ',--创建一个作业,如果成批装入的数据文件在上午 9:00 之前到达文件系统,则运行此作业
queue_spec => 'SCOTT.EVENT_QUEUE',
start_date => systimestamp at time zone
'+8:00',
job_class => 'DEFAULT_JOB_CLASS',
auto_drop => FALSE,
enabled => TRUE);
END; /

向队列中插入消息

conn scott/tiger

select * from t;

向队列里插入消息

conn /as sysdba

grant execute on dbms_aq to scott;

conn scott/tiger

declare
l_enqueue_options dbms_aq.enqueue_options_t;
l_message_properties dbms_aq.message_properties_t;
l_message_handle raw();
l_queue_msg t_event_queue;
begin
l_queue_msg := t_event_queue('SCOTT', 'DATA.TXT', 'FILE_ARRIVAL',);
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; / select * from t;

删除作业:

conn /as sysdba

begin
dbms_scheduler.drop_job(job_name => '"SYS"."PERFORM_DATA_LOAD"', force => true);
end;
/

总结一下oracle db里用job调度shell的注意点:

1、shell脚本里开头要加#!/bin/bash等指定使用的shell类型
2、所有相关环境变量都得在shell里明确指定
3、如果要写入文件必需使用绝对路径
4、使用sys用户建立job

ORACLE调度之基于事件的调度(二)【weber出品】的更多相关文章

  1. ORACLE调度之基于时间的调度(一)【weber出品】

    一.调度的概述 这里我看到一篇对调度的概述觉得描述的比我好,但仅限于概述部分,其他部分我觉得我讲的比他好,于是发生以下事情: ************************华丽的转载******** ...

  2. ORACLE触发器的管理与实际应用【weber出品】

    一.INSTEAD OF触发器 对于简单的视图可以执行INSERT,UPDATE和DELETE操作,但是对于复杂视图,不允许直接执行INSERT,UPDATE,DELETE操作,当视图出现以下任何一种 ...

  3. ORACLE SQL单行函数(三)【weber出品必属精品】

    16.L:代表本地货币符,这个和区域有关.这个时候我们想来显示一下人民币的符号:¥ $ vi .bash_profile ---写入如下内容: export NLS_LANG='SIMPLIFIED ...

  4. ORACLE之SQL语句内部解析过程【weber出品】

    一.客户端通过监听连接到数据库,数据库开启一个server process进程来接收客户端传过来的sql. 1.这条sql语句从来都没有被执行过.(硬解析) 2.这条sql语句被执行过.(软解析) 二 ...

  5. ORACLE SQL单行函数(一)【weber出品必属精品】

    1.SUBSTR:求父串中的子串 SUBSTR('HelloWorld',1,5) 1:代表子串的起始位置,如果为正,正数,如果为负,倒数 5:代表字串的终止位置,只能向右数,可以省略,如果省略就是数 ...

  6. 二、基于事件的异步编程模式(EAP)

    一.引言 在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式--APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题--不支持对异步操作的取消和没有提供对进 ...

  7. 异步编程(二)基于事件的异步编程模式 (EAP)

    一.引言 在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式——APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题——不支持对异步操作的取消和没有提供对进 ...

  8. Linux CFS调度器之task_tick_fair处理周期性调度器--Linux进程的管理与调度(二十九)

    1. CFS如何处理周期性调度器 周期性调度器的工作由scheduler_tick函数完成(定义在kernel/sched/core.c, line 2910), 在scheduler_tick中周期 ...

  9. 一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库 RxJava,相当好

    https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndroid RX (Reactive Extensions,响 ...

随机推荐

  1. Unity3d场景合并

    Unity3d场景合并 一.Unity3d场景合并,有一次的情况是这样的,就是我们是每个人都在开发,每个人有不同的场景,那么合并的时候,有些会出问题,那么我有一个好的方案,就是首先弄一个公共的资源库, ...

  2. Delphi中ADO异步执行方式

    当ADO开始处理数据后,应用程序必须等到ADO处理完毕之后才可以继续执行.但是除了同步执行方式之外,ADO也提供了异步执行的方式,允许当ADO处理时,应用程序仍然能够先继续执行.而当ADO处理数据完毕 ...

  3. Java实现二叉树的构建与遍历

    转载:http://ocaicai.iteye.com/blog/1047397 目录: 1.把一个数组的值赋值给一颗二叉树 2.具体代码 1.树的构建方法 2.具体代码 package tree; ...

  4. 【POJ】3283 Card Hands

    字典树. #include <iostream> #include <cstdio> #include <cstring> #include <string& ...

  5. 【POJ】1204 Word Puzzles

    这道题目各种wa.首先是错了一个坐标,居然没测出来.然后是剪枝错误.搜索pen时就返回,可能还存在串pen*. #include <cstdio> #include <cstring ...

  6. [LeetCode#55, 45]Jump Game, Jump Game II

    The problem: Given an array of non-negative integers, you are initially positioned at the first inde ...

  7. hdu-1890-Robotic Sort splay区间翻转

    题意: 依次找第i大的数下标pos[i],然后将区间[i,pos[i]]翻转 分析: splay树区间翻转 // File Name: ACM/HDU/1890.cpp // Author: Zlbi ...

  8. Maximum Subarray——LeetCode

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  9. 使用Vagrant machine

    使用Vagrant 查看Vagrant状态 vagrant status SSH vagrant ssh 共享文件 在vagrantfile中添加共享文件配置 Vagrant.configure(2) ...

  10. scipy安装失败

    pip install scipy安装失败 可以从uci网站下载wheel安装包然后执行pip install xx.whl进行安装 http://www.lfd.uci.edu/~gohlke/py ...