Oracle Advanced Queuing 触发器入列和异步通知消息出列
1. 官方文档:
https://docs.oracle.com/database/121/ADQUE/aq_opers.htm
2. 授权用户操作dbms_aq/dbms_aqadm 的权限
grant execute on dbms_aq to C##CS_DEV;
grant execute on dbms_aqadm to C##CS_DEV;
3. 创建payload_type
create or replace TYPE client_queue_payload_type AS OBJECT
(
client_id number(9),
method varchar2(20)
);
4. 创建并启动队列
begin
--创建队列表
dbms_aqadm.create_queue_table(queue_table => 'client_queue_table',
queue_payload_type => 'client_queue_payload_type',
multiple_consumers => false);
--创建队列
DBMS_AQADM.CREATE_QUEUE(queue_name => 'client_queue',
queue_table => 'client_queue_table');
--启动队列
DBMS_AQADM.START_QUEUE(queue_name => 'client_queue');
end;
5. 创建触发器进行入列
create or replace trigger trigger_client
after insert or update or delete on client
for each row
declare
r_enqueue_options dbms_aq.enqueue_options_t;
r_message_properties dbms_aq.message_properties_t;
v_message_handle RAW(16);
o_payload client_queue_payload_type;
v_client_id number(9);
v_method varchar2(20);
begin
if inserting then
v_client_id := :new.client_id;
v_method := 'I';
elsif deleting then
v_client_id := :old.client_id;
v_method := 'D';
elsif updating then
v_client_id := :new.client_id;
v_method := 'U';
end if;
o_payload := client_queue_payload_type(v_client_id, v_method);
dbms_aq.enqueue(queue_name => 'client_queue',
enqueue_options => r_enqueue_options,
message_properties => r_message_properties,
payload => o_payload,
msgid => v_message_handle);
end trigger_client;
6. 创建异步通知callback存储过程
create or replace procedure client_queue_callback_pro(context RAW,
reginfo sys.aq$_reg_info,
descr sys.aq$_descriptor,
payload RAW,
payloadl NUMBER) is
r_dequeue_options dbms_aq.dequeue_options_t;
r_message_properties dbms_aq.message_properties_t;
v_message_handle RAW(16);
o_payload client_queue_payload_type;
begin
r_dequeue_options.msgid := descr.msg_id;
r_dequeue_options.consumer_name := descr.consumer_name;
dbms_aq.dequeue(queue_name => descr.queue_name,
dequeue_options => r_dequeue_options,
message_properties => r_message_properties,
payload => o_payload,
msgid => v_message_handle);
insert into client_log
(client_id, method, deal_date)
values
(o_payload.client_id, o_payload.method, sysdate);
end client_queue_callback_pro;
7. 注册异步通知
declare
reginfo sys.aq$_reg_info;
reg_list sys.aq$_reg_info_list;
begin
reginfo := sys.aq$_reg_info('client_queue',
DBMS_AQ.NAMESPACE_AQ,
'plsql://client_queue_callback_pro?PR=0',
HEXTORAW('FF'));
reg_list := sys.aq$_reg_info_list(reginfo);
dbms_aq.register(reg_list => reg_list, reg_count => 1);
-- dbms_aq.unregister(reg_list => reg_list, reg_count => 1);
end;
8. 测试
插入操作:
insert into client
(client_id, name, sex, age)
values
('2', 'Lily', 'F', 25);
修改操作:
update client a set a.name = 'Lily Liu' where client_id = '2';
删除操作:
delete from client a where a.client_id='2';
9. 清空消息队列
https://docs.oracle.com/database/121/ADQUE/aq_admin.htm#ADQUE0812
DECLARE
v_options sys.dbms_aqadm.aq$_purge_options_t;
BEGIN
SYS.DBMS_AQADM.STOP_QUEUE(QUEUE_NAME => 'client_queue');
dbms_aqadm.purge_queue_table('client_queue_table', NULL, v_options);
SYS.DBMS_AQADM.START_QUEUE(QUEUE_NAME => 'client_queue');
END;
/
Oracle Advanced Queuing 触发器入列和异步通知消息出列相关推荐
- Java支付宝APP支付-验证异步通知消息
上一章已经讲述了支付宝如何生成支付订单,这一章讲述一下支付宝生成订单之后,异步通知接口的开发. 这里先讲一下啥叫支付宝异步通知:对于App支付产生的交易,支付宝会根据原始支付API中传入的异步通知地址 ...
- Oracle一张表写多个触发器,详解oracle中通过触发器记录每个语句影响总行数
详解oracle中通过触发器记录每个语句影响总行数 需求产生: 业务系统中,有一步"抽数"流程,就是把一些数据从其它服务器同步到本库的目标表.这个过程有可能 多人同时抽数,互相影响 ...
- Oracle Advanced Queue (DBMS_AQ/DMBS_AQADM)
扯在前面 Oracle通过AQ (Oracle Streams Advanced Queuing)来提供"进程间" (或者跨会话 -- inter-session) 通信的功能.关 ...
- Oracle 快速入门 触发器游标
目录 一.触发器 1.什么是触发器(概念)? 2.创建触发器语法(史上最难的oracle语法,没有之一) 3. 触发器组成三部分: 4. 前触发与后触的原理图 5. 在级联表中创建触发器案例 二.程序 ...
- oracle 表列 自增,ORACLE表建立自增列
create tablespace studentDB datafile 'E:\datafiles_1.dbf' size 10m; create user Huang_Ying_Bo identi ...
- oracle中创建触发器
从csdn上面看到一个如何创建触发器的问题,感觉自己很有必要保存学习,特写下来: 条件: 现有A.B两张表 A: 工号 姓名 密码 性别 年龄 ... B: 工号 姓名 密码 当对A表中的" ...
- Oracle中的触发器
Oracle中的触发器 触发器 触发器(tigger)是在事件发生时隐式地自动运行的 PL/SQL 程序块,不能接收参数,不能被调用,就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行. ...
- Oracle中的触发器(trigger)
1.触发器的定义 数据库触发器是一个与表相关联.存储PL/SQL语句的"东西".每当一个特定的数据操作语句(insert.update.delete)在指定的表上发出时,Orac ...
- oracle设计自增列,oracle中实现自增列
oracle中实现自增列 1.创建学生表: CREATE TABLE student ( xh number primary key, Name varchar2(10) not null); 2. ...
最新文章
- IOS使用正则表达式去掉html中的标签元素,获得纯文本
- P1488 肥猫的游戏
- Python全栈工程师(字符串/序列)
- java学习之类型转换与越界
- 循环执行次数 n(n+1)/2
- 中国凉亭行业市场供需与战略研究报告
- 我的cocos2d-x集成sharesdk之旅(转)
- Ansys Maxwell三相变压器制作方法教程
- c语言实验报告问题错误分析,C语言实验报告(三)
- 牛顿法求函数零点和极值点
- lisp 天正标高_天正AutoCAD技巧看你知多少
- python把两张图片合成一张_怎么合成图片-利用Python将两张图片合成为一张图
- 关于新加坡的身份证与电话号码验证
- 【机器学习算法】线性回归算法
- 03 野火imxull开发板添加 正点原子lcd 支持
- java报错root cause_[Filtered request failed.] with root cause java.io.OptionalDataException
- 使用计算机时应先按,计算机应用基础试卷及答案
- ArcGIS API for JavaScript根据两个点坐标在地图上画线
- MQTT3-常见的MQTT服务器介绍
- Praat脚本-009 | 提取时长和基频