如何创建基本的高级队列之三:Push 模式(绑定存储过程,自动调用)
------------------------------------------------------------------
1、创建callback 存储过程 (这个存储过程是用来处理事务的callback, 使用特定的接口,不能修改参数名称 ,否则调用失败)
--该代码一定要在接收方数据库执行
--个人感觉这里的配置方法不够灵活的,有些参数是多余的,但又不能删除,希望ORACLE能进行改进
------------------------------------------------------------------
-- callback 存储过程
create or replace procedure plsqlnotif
(
context raw,
reginfo sys.aq$_reg_info,
descr sys.aq$_descriptor,
payload raw,
payloadl number
) as
l_opt DBMS_AQ.dequeue_options_t;
l_prop DBMS_AQ.message_properties_t;
l_msgid raw(16);
l_payload evt_msg_typ;
begin
--从自动通知的描述参数可以得到consumer name等信息
-- 获取订阅者和MSG_ID
l_opt.msgid := descr.msg_id;
l_opt.consumer_name := descr.consumer_name;
--出列
DBMS_AQ.DEQUEUE(queue_name => descr.queue_name,
dequeue_options => l_opt,
message_properties => l_prop,
payload => l_payload,
msgid => l_msgid);
--自定义代码
SQL CODE;
commit;
end;
/
------------------------------------------------------------------
--2、对sp进行注册,绑定了 queue/subscriber/callback 的关系
--该代码一定要在接收方数据库执行
------------------------------------------------------------------
---- 注册通知
declare
l_q varchar2(30) := 'WMS_APP.Q_BILL_TRANSFER'; --Queue
l_pm varchar2(10) := 'WMS_APP'; --订阅者
l_sp varchar2(30) := 'WMS_APP.Q_SP_TEST'; --存储过程
l_reginfolist sys.aq$_reg_info_list;
begin
l_reginfolist := sys.aq$_reg_info_list(sys.aq$_reg_info('PHS.Q_BILL_TRANSFER:PHS',
DBMS_AQ.NAMESPACE_AQ,
'plsql://PHS.Q_SP_TEST',
null));
dbms_aq.register(l_reginfolist, 1);
end;