oracle scheduler(四)使用Events
来源:互联网 发布:知否小说全文免费阅读 编辑:程序博客网 时间:2024/05/30 07:12
四、使用Events
SCHEDULER 中有两种触发EVENT 的情况:
(1) Scheduler 触发的Events
(2) application 触发的Events
4.1 Scheduler抛出的Events
例如,修改前面创建的jobtest,启用raise_events 属性,执行语句如下:
sql> begin
dbms_scheduler.set_attribute('jobtest','raise_events',dbms_scheduler.job_all_events);
end;
/
触发Events 的有下列的类型,分别代表不同的操作:
(1)job_started:JOB 启动;
(2) job_succeeded:JOB 成功结束;
(3) job_failed:JOB 执行失败;
(4) job_broken:JOB 被置为BROKEN 状态;
(5) job_completed:JOB 达到最大运行次数,或者运行的结束日期;
(6) job_stopped:JOB 被STOP_JOB 过程置为停止执行的状态;
(7) job_sch_lim_reached:Job 的schedule 达到限定值;
(8) job_disabled:JOB 被置于DISABLE 状态;
(9) job_chain_stalled:运行于chain 的JOB 被置于CHAIN_STALLED 状态;
(10) job_all_events:含上述提到的所有类型;
(11)job_run_completed:由于Job 运行出错、成功结束或被手动停止。
例如,手动执行一次JOBTEST,看看是否向队列中记录信息,操作如下:
SQL> exec dbms_scheduler.run_job('JOBTEST');
PL/SQL procedure successfully completed.
执行下列脚本,出队数据:
SQL> set serveroutput on
SQL> DECLARE
l_dequeue_options DBMS_AQ.dequeue_options_t;
l_message_properties DBMS_AQ.message_properties_t;
l_message_handle RAW(16);
l_queue_msg sys.scheduler$_event_info;
BEGIN
l_dequeue_options.consumer_name := 'TEST';
DBMS_AQ.dequeue(queue_name =>'SYS.SCHEDULER$_EVENT_QUEUE',
dequeue_options => l_dequeue_options,
message_properties => l_message_properties,
payload => l_queue_msg,
msgid => l_message_handle);
COMMIT;
DBMS_OUTPUT.put_line('event_type : ' ||l_queue_msg.event_type);
DBMS_OUTPUT.put_line('object_owner : ' ||l_queue_msg.object_owner);
DBMS_OUTPUT.put_line('object_name : ' ||l_queue_msg.object_name);
DBMS_OUTPUT.put_line('event_timestamp: ' ||l_queue_msg.event_timestamp);
DBMS_OUTPUT.put_line('error_code : ' ||l_queue_msg.error_code);
DBMS_OUTPUT.put_line('event_status : ' ||l_queue_msg.event_status);
DBMS_OUTPUT.put_line('log_id : ' || l_queue_msg.log_id);
DBMS_OUTPUT.put_line('run_count : ' ||l_queue_msg.run_count);
DBMS_OUTPUT.put_line('failure_count : ' ||l_queue_msg.failure_count);
DBMS_OUTPUT.put_line('retry_count : ' ||l_queue_msg.retry_count);
END;
/
event_type : JOB_STARTED
object_owner : TEST
object_name : INSERT_TEST_TBL
event_timestamp: 25-AUG-09 12.49.29.558758 PM 08:00
error_code : 0
event_status : 1
log_id :
run_count : 1
failure_count : 0
retry_count : 0
PL/SQL procedure successfully completed.
4.2 Application抛出的Events
(1)queue_spec:指定外部应用抛出的events消息入队的队列名;
(2)event_condition:指定触发job启动的条件,这一参数的参数值在设置时应当基于事件消息的自身属性,因为事件消息在入队时,消息的属性都是由application定义的,因此在设置触发条件时,也应该根据这些属性值进行设置。
SQL> create or replace type Test_type1 asobject
2 (
3 event_type VARCHAR2(10),
4 object_owner VARCHAR2(30),
5 object_name VARCHAR2(30)
6 );
7 /
Type created.
SQL> begin
2 dbms_aqadm.create_queue_table(
3 queue_table => 'my_queue_tbl1',
4 queue_payload_type => 'Test_type1',
5 multiple_consumers => true);
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> begin
2 dbms_aqadm.create_queue(
3 queue_name => 'event_t1',
4 queue_table => 'my_queue_tbl1');
5 end;
6 /
PL/SQL procedure successfully completed.
准备工作完成,下面就来创建一个event 触发启动的job,创建脚本如下:
SQL> BEGIN
2 DBMS_SCHEDULER.CREATE_JOB (
3 job_name => 'EVENT_JOB_T1',
4 job_type => 'STORED_PROCEDURE',
5 job_action => 'SYSTEM.IT',
6 event_condition => 'tab.user_data.event_type =''OP_INSERT''',
7 queue_spec => 'EVENT_T1',
8 enabled => TRUE);
9 END;
10 /
PL/SQL procedure successfully completed.
上述脚本仅做演示,因此创建的job 仍然执行IT 过程。
SQL> exec dbms_aqadm.start_queue(queue_name=> 'event_t1',enqueue => true,dequeue=> true);
PL/SQL procedure successfully completed.
SQL> declare
v_Message Test_type1;
v_EnqueueOptions dbms_aq.enqueue_options_t;
v_MessageProperties dbms_aq.message_properties_t;
v_msg_handle raw(16);
begin
v_message := jss_type1('OP_SELECT', user, 'tmpObj');
dbms_aq.enqueue(queue_name => 'event_t1',
enqueue_options => v_enqueueOptions,
message_properties => v_messageproperties,
payload => v_message,
msgid => v_msg_handle);
commit;
end;
/
PL/SQL procedure successfully completed.
(3)查询队列表中的数据:
SQL> select user_data from my_queue_tbl1;
USER_DATA(EVENT_TYPE, OBJECT_OWNER, OBJECT_NAME)
---------------------------------------------------------
JSS_TYPE1('OP_SELECT', 'TEST', 'tmpObj')
(4)然后查询job
SQL> select to_char(created,'yyyy-mm-dd hh24:mi:ss')from jss_1;
TO_CHAR(CREATED,'YY
-------------------
2009-08-25 12:49:29
SQL> declare
v_Message jss_type1;
v_EnqueueOptions dbms_aq.enqueue_options_t;
v_MessageProperties dbms_aq.message_properties_t;
v_msg_handle raw(16);
begin
v_message := jss_type1('OP_INSERT', user, 'tmpObj');
dbms_aq.enqueue(queue_name => 'event_t1',
enqueue_options => v_enqueueOptions,
message_properties => v_messageproperties,
payload => v_message,
msgid => v_msg_handle);
commit;
end;
/
再次查看jss_1 表看看:
SQL> select to_char(created,'yyyy-mm-dd hh24:mi:ss')from jss_1;
TO_CHAR(CREATED,'YY
-------------------
2009-08-25 12:49:29
2009-08-25 13:21:21
多了一条记录,说明job 已经被自动触发。
转自:http://blog.csdn.net/tianlesoftware/article/details/4715218
0 0
- oracle scheduler(四)使用Events
- oracle scheduler(五)使用Chains
- oracle scheduler(六)使用J…
- oracle scheduler(七)使用W…
- oracle scheduler(二)创建…
- oracle scheduler(三)创建…
- oracle scheduler(一)创建…
- ORACLE Scheduler特性(7)Scheduler抛出的Events
- Oracle Scheduler Concepts(Programs Schedules Jobs Events Chains)
- 学习ORACLE Scheduler特性(8)Application抛出的Events
- 【Oracle】SCHEDULER使用详解
- Oracle Scheduler Jobs 基本使用
- Oracle Scheduler(一)——Jobs(基本使用)!
- ORACLE(四) 行列操作
- 使用Toad生成Oracle Scheduler Job DDL
- 数据库---Oracle Scheduler Jobs 基本使用
- ORACLE Scheduler特性(3)使用Programs
- ORACLE Scheduler特性(11)使用Job Classes
- 自动pga管理
- V$SESSION_LONGOPS
- oracle scheduler(二)创建…
- oracle scheduler(三)创建…
- PHP取得当前插入数据库中记录的id值
- oracle scheduler(四)使用Events
- oracle scheduler(五)使用Chains
- oracle scheduler(六)使用J…
- oracle scheduler(一)创建…
- oracle scheduler(七)使用W…
- Oracle的时区问题
- oracle time_zone
- 有15个人围成一圈,顺序排号。从第一个人开始报数(从1~3报数),凡报到3的人退出圈子,问最后留下的人 C#版
- Oracle 监听器Listener