oracle高级队列二

建立队列表
队列表是队列的集合,代码如下:

创建下行和上行队列表:

exec dbms_aqadm.create_queue_table(queue_table=>'sms_mt_tab', queue_payload_type=>'mt_struc');



默认:只有一个接收者

具体参数如下:

SQL> desc dbms_aqadm.create_queue_table

Parameter Type Mode Default?

------------------ -------------- ---- --------

QUEUE_TABLE VARCHAR2 IN

QUEUE_PAYLOAD_TYPE VARCHAR2 IN

STORAGE_CLAUSE VARCHAR2 IN Y

SORT_LIST VARCHAR2 IN Y

MULTIPLE_CONSUMERS BOOLEAN IN Y

MESSAGE_GROUPING BINARY_INTEGER IN Y

COMMENT VARCHAR2 IN Y

AUTO_COMMIT BOOLEAN IN Y

PRIMARY_INSTANCE BINARY_INTEGER IN Y

SECONDARY_INSTANCE BINARY_INTEGER IN Y

COMPATIBLE VARCHAR2 IN Y

NON_REPUDIATION BINARY_INTEGER IN Y

SECURE BOOLEAN IN Y


参考dbms_aqadm.create_queue_table
1.存储参数storage_clause 可以是 MAXTRANS,LOB等
2.sort_list 可以是PRIORITY,enq_time这2个参数或者其中一个。具体可以察看对应的 队列表的数据结构。例如下面的例子
--创建队列表,‘sms_aq_tab’ 队列表名,' sms_aq_tab '队列对象名(充当消息体的对象名称),以下同
dbms_aqadm.create_queue_table('WDZAQTABLE','WDZAQMSG'); 

--创建具有排序功能的队列表
dbms_aqadm.create_queue_table('WDZSQRTAQTABLE','WDZAQMSG',sort_list => 'PRIORITY,enq_time'); 
3。消息分组参数 message_grouping 可以是 NONE,或 TRANSACTIONAL
-- message grouping
dbms_aqadm.TRANSACTIONAL CONSTANT BINARY_INTEGER := 1;
dbms_aqadm.NONE CONSTANT BINARY_INTEGER := 0;
后者表示一个与事务相关的消息分成1组,在提取消息的时候可以当成一组相关消息来提取。例如:
--创建带带分组功能的消息队列表 
dbms_aqadm.create_queue_table('WDZGROUPAQTABLE','WDZAQMSG',
sort_list => 'PRIORITY,enq_time',
message_grouping =>dbms_aqadm.TRANSACTIONAL/*dbms_aqadm.NONE*/ );

4.multiple_consumers表示消息接受者是否为多个用户。默认是只有1个接收者。如果要多个用户可以接受消息,需要设置=true
--创建多个接收者的消息队列表 
dbms_aqadm.create_queue_table('WDZMUTIAQTABLE','WDZAQMSG',sort_list => 'PRIORITY,enq_time',
message_grouping =>dbms_aqadm.TRANSACTIONAL/*dbms_aqadm.NONE*/
,multiple_consumers => true);

4.2删除队列表
Exec dbms_aqadm.drop_queue_table(queue_table => 'sms_mt_tab');
Exec dbms_aqadm.drop_queue_table(queue_table => 'sms_mo_tab');

4.3建立队列
建立队列代码如下:

exec dbms_aqadm.create_queue(queue_name=>'sms_mt_queue', queue_table=>'sms_mt_tab');


exec dbms_aqadm.create_queue(queue_name=>'sms_mt_queue_exception', queue_table=>'sms_mt_tab',queue_type=>dbms_aqadm.EXCEPTION_QUEUE);


exec dbms_aqadm.create_queue(queue_name=>'sms_mt_queue_backup', queue_table=>'sms_mt_tab');



参数含义:
--参考 dbms_aqadm.create_queue
--创建队列, sms_mt_queue为队列的名称,' sms_mt_tab ' 队列表名
dbms_aqadm.create_queue('WDZQUEUE','WDZAQTABLE',queue_type => dbms_aqadm.NORMAL_QUEUE);
--参数queue_type 表示队列是否为正常队列还是异常队列,
--参数值为dbms_aqadm.NORMAL_QUEUE 或者dbms_aqadm.EXCEPTION_QUEUE

--创建多用户队列, 'WDZQUEUE' 为队列的名称,'WDZAQTABLE' 队列表名
dbms_aqadm.create_queue('WDZMUTIQUEUE','WDZMUTIAQTABLE',
queue_type => dbms_aqadm.NORMAL_QUEUE);
--创建分组队列, 'WDZGROUPQUEUE' 为队列的名称,'WDZAQTABLE' 队列表名
dbms_aqadm.create_queue('WDZGROUPQUEUE', 'WDZAQTABLE',
queue_type => dbms_aqadm.NORMAL_QUEUE);

4.4删除队列
代码如下:

Exec dbms_aqadm.drop_queue('sms_mt_queue');

4.5队列参数调整
A 创建非持久队列

非持久队列 顾名思义就是没有永久保存到数据的队列,队列只存在于系统的内存中。

参考 dbms_aqadm.create_np_queue

dbms_aqadm. create_np_queue ('sms_mt_queue', multiple_consumers=>false);


B 启动一个队列,' sms_mt_queue ' 为队列的名称

dbms_aqadm.start_queue('sms_mt_queue',enqueue=>true, dequeue=> true);


C 停止队列

参数的意思参考启动一个队列

dbms_aqadm.stop_queue(sms_mt_queue ',enqueue=>false, dequeue=>true);


5 队列操作
说明:

1 入队

P100_MT_ENQUEUE
(
p_equeue_name In varchar2, --队列名单大写字母,主队列:SMS_MT_QUEUE 备份队列:SMS_MT_QUEUE_BACKUP
p_body In t_outbox_push%Rowtype,--入参,记录类型,数据源头直接调用
p_level In Number:=3, --优先级别1-5,数值越小越快
p_delay In Number:=0, --入队延迟时间,单位:秒
p_res_str OUT VARCHAR2, --0 成功 其它失败
p_msg_id OUT Varchar2 --返回的msgid,主键
)
2 出队列


p102_mt_dequeue
(
p_equeue_name In varchar2, --队列名单大写字母,主队列:SMS_MT_QUEUE 备份队列:SMS_MT_QUEUE_BACKUP
p_client_id Out Number, --短信内部网关
p_res_str Out varchar2, --返回值 0 成功 -2 队列为空其它失败
p_label out varchar2, --标签
p_body out varchar2) --数据包体


3 数据格式转换
p103_change_label_body_str
(
p_dequeue_body In Mt_Struc,
p_res_str Out Varchar2,
p_label Out varchar2,
p_body Out varchar2
)/*
功能:把出队列的字符串翻译成有规则的label,和body
日期:2006-09-20
*/
4 测试入队

procedure P101_MT_ENQUEUE_TEST
(
p_equeue_name In varchar2,--队列名单大写字母,主队列:SMS_MT_QUEUE 备份队列:SMS_MT_QUEUE_BACKUP
p_res_str out Varchar2,
p_msg_id OUT Varchar2
)

5.1入队

create or replace procedure P100_MT_ENQUEUE
(
p_equeue_name In varchar2, --队列名单大写字母,主队列:SMS_MT_QUEUE 备份队列:SMS_MT_QUEUE_BACKUP
p_body In t_outbox_push%Rowtype,--入参,记录类型,数据源头直接调用
p_level In Number:=3, --优先级别1-5,数值越小越快
p_delay In Number:=0, --入队延迟时间,单位:秒
p_res_str OUT VARCHAR2, --0 成功 其它失败
p_msg_id OUT Varchar2 --返回的msgid,主键
)/*
功能:数据源头,push,的入队操作
*/
Is
v_enqueue_options dbms_aq.enqueue_options_t;
v_message_properties dbms_aq.message_properties_t;
v_message_handle raw(16);
v_body mt_struc;---写日志区域
vPid NUMBER:=100;
vProName VARCHAR2(50):='P100_MT_ENQUEUE';
vProTip VARCHAR2(255);
vErrorCode VARCHAR2(20);
vErrorMsg VARCHAR2(2000);
Begin
--1初始化
p_res_str:='-1';

--2 P_BODY 到 v_body 的转化 把一个字符串转化为一个结构体
v_body:=mt_struc(
p_body.OP_ID ,
p_body.DEST_MOBILENO ,
p_body.FEE_MOBILENO ,
p_body.LONG_NO ,
p_body.MT_CONTENT ,
p_body.SERVICE_ID ,
p_body.MT_FLAG ,
p_body.MSG_FMT ,
p_body.FEE_TYPE ,
p_body.FEE_VALUE ,
p_body.BEG_REPORT ,
p_body.CLIENT_ID ,
p_body.CLIENT_NAME ,
p_body.MT_TIME ,
p_body.MT_ID ,
p_body.PLAN_ID ,
p_body.PUSH_TYPE ,
p_body.SEND_DATE );
--4设置属性和参数---
--指定异常队列
v_message_properties.exception_queue:='SMS_MT_QUEUE_EXCEPTION';
--设置优先级别
v_message_properties.priority :=p_level;
--设置延时时间--秒
v_message_properties.delay :=p_delay;
--5 开始入队
dbms_aqadm.start_queue(p_equeue_name,enqueue=>true, dequeue=> true);
dbms_aq.enqueue(queue_name=>p_equeue_name,
enqueue_options=>v_enqueue_options,
message_properties=>v_message_properties,
payload=>v_body,
msgid=>v_message_handle);
P_MSG_ID:=v_message_handle ;
--6 commit
Commit;
p_res_str:='0';
Exception
When Others Then
p_res_str:='-100';
vProTip:='入队过程异常!';
vErrorCode:=Sqlcode;
vErrorMsg:=SQLERRM;
p_pub_write_error_log(vPid,vProName,'','',
vProTip,vErrorCode,vErrorMsg,1);
Rollback;
end P100_MT_ENQUEUE;

create or replace procedure P101_MT_ENQUEUE_TEST
(
p_equeue_name In varchar2,--队列名单大写字母,主队列:SMS_MT_QUEUE 备份队列:SMS_MT_QUEUE_BACKUP
p_res_str out Varchar2,
p_msg_id OUT Varchar2
) /*
功能:测试入队
*/
Is
Cursor cur_push Is
Select * From t_outbox_push;
v_row_push t_outbox_push%Rowtype;
v_exe_res varchar2(200);
v_message_handle raw(16);
begin
p_res_str:='-1';
Open cur_push;
Loop
Fetch cur_push Into v_row_push;
Exit When cur_push%Notfound;
P100_MT_ENQUEUE(p_equeue_name,v_row_push,3,0,v_exe_res,v_message_handle);
End Loop;
Close cur_push;
p_res_str:=v_exe_res;
p_msg_id:=v_message_handle;
Exception
When Others Then
p_res_str:=Sqlerrm;
Rollback;
end P101_MT_ENQUEUE_TEST;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值