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 触发器入列和异步通知消息出列相关推荐

  1. Java支付宝APP支付-验证异步通知消息

    上一章已经讲述了支付宝如何生成支付订单,这一章讲述一下支付宝生成订单之后,异步通知接口的开发. 这里先讲一下啥叫支付宝异步通知:对于App支付产生的交易,支付宝会根据原始支付API中传入的异步通知地址 ...

  2. Oracle一张表写多个触发器,详解oracle中通过触发器记录每个语句影响总行数

    详解oracle中通过触发器记录每个语句影响总行数 需求产生: 业务系统中,有一步"抽数"流程,就是把一些数据从其它服务器同步到本库的目标表.这个过程有可能 多人同时抽数,互相影响 ...

  3. Oracle Advanced Queue (DBMS_AQ/DMBS_AQADM)

    扯在前面 Oracle通过AQ (Oracle Streams Advanced Queuing)来提供"进程间" (或者跨会话 -- inter-session) 通信的功能.关 ...

  4. Oracle 快速入门 触发器游标

    目录 一.触发器 1.什么是触发器(概念)? 2.创建触发器语法(史上最难的oracle语法,没有之一) 3. 触发器组成三部分: 4. 前触发与后触的原理图 5. 在级联表中创建触发器案例 二.程序 ...

  5. oracle 表列 自增,ORACLE表建立自增列

    create tablespace studentDB datafile 'E:\datafiles_1.dbf' size 10m; create user Huang_Ying_Bo identi ...

  6. oracle中创建触发器

    从csdn上面看到一个如何创建触发器的问题,感觉自己很有必要保存学习,特写下来: 条件: 现有A.B两张表 A: 工号 姓名 密码 性别 年龄 ... B: 工号 姓名 密码 当对A表中的" ...

  7. Oracle中的触发器

    Oracle中的触发器 触发器 触发器(tigger)是在事件发生时隐式地自动运行的 PL/SQL 程序块,不能接收参数,不能被调用,就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行. ...

  8. Oracle中的触发器(trigger)

    1.触发器的定义  数据库触发器是一个与表相关联.存储PL/SQL语句的"东西".每当一个特定的数据操作语句(insert.update.delete)在指定的表上发出时,Orac ...

  9. oracle设计自增列,oracle中实现自增列

    oracle中实现自增列 1.创建学生表: CREATE TABLE student ( xh number primary key, Name varchar2(10) not null); 2. ...

最新文章

  1. IOS使用正则表达式去掉html中的标签元素,获得纯文本
  2. P1488 肥猫的游戏
  3. Python全栈工程师(字符串/序列)
  4. java学习之类型转换与越界
  5. 循环执行次数 n(n+1)/2
  6. 中国凉亭行业市场供需与战略研究报告
  7. 我的cocos2d-x集成sharesdk之旅(转)
  8. Ansys Maxwell三相变压器制作方法教程
  9. c语言实验报告问题错误分析,C语言实验报告(三)
  10. 牛顿法求函数零点和极值点
  11. lisp 天正标高_天正AutoCAD技巧看你知多少
  12. python把两张图片合成一张_怎么合成图片-利用Python将两张图片合成为一张图
  13. 关于新加坡的身份证与电话号码验证
  14. 【机器学习算法】线性回归算法
  15. 03 野火imxull开发板添加 正点原子lcd 支持
  16. java报错root cause_[Filtered request failed.] with root cause java.io.OptionalDataException
  17. 使用计算机时应先按,计算机应用基础试卷及答案
  18. ArcGIS API for JavaScript根据两个点坐标在地图上画线
  19. MQTT3-常见的MQTT服务器介绍
  20. Praat脚本-009 | 提取时长和基频

热门文章

  1. JAVA“三大护法”—JVM、JRE、JDK
  2. 第十九章、主機名稱控制者: DNS 伺服器
  3. SIMD 单指令,多数据
  4. JavaMeStudio工作室正式开张,专业开发手机软件!
  5. Java黑马程序员:文字版格斗游戏
  6. 手机上哪款闹钟提醒APP好
  7. 从项目管理角度看马谡失街亭
  8. Python习题解答:将学生的各科考试成绩保存为csv文件格式
  9. excel数据的导出
  10. “逐渐失效”的摩尔定律