如何创建基本的高级队列之三: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;

posted @ 2013-01-08 15:50  blue-sword  阅读(121)  评论(0编辑  收藏  举报