oracle高级队列2

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

创建下行和上行队列表:

Sql代码 复制代码
  1. exec dbms_aqadm.create_queue_table(queue_table=>'sms_mt_tab', queue_payload_type=>'mt_struc');  
exec dbms_aqadm.create_queue_table(queue_table=>'sms_mt_tab', queue_payload_type=>'mt_struc');



默认:只有一个接收者

具体参数如下:

Sql代码 复制代码
  1. SQL> desc dbms_aqadm.create_queue_table   
  2.   
  3. Parameter Type Mode Default?    
  4.   
  5. ------------------ -------------- ---- --------    
  6.   
  7. QUEUE_TABLE VARCHAR2 IN    
  8.   
  9. QUEUE_PAYLOAD_TYPE VARCHAR2 IN    
  10.   
  11. STORAGE_CLAUSE VARCHAR2 IN Y    
  12.   
  13. SORT_LIST VARCHAR2 IN Y    
  14.   
  15. MULTIPLE_CONSUMERS BOOLEAN IN Y    
  16.   
  17. MESSAGE_GROUPING BINARY_INTEGER IN Y    
  18.   
  19. COMMENT VARCHAR2 IN Y    
  20.   
  21. AUTO_COMMIT BOOLEAN IN Y    
  22.   
  23. PRIMARY_INSTANCE BINARY_INTEGER IN Y    
  24.   
  25. SECONDARY_INSTANCE BINARY_INTEGER IN Y    
  26.   
  27. COMPATIBLE VARCHAR2 IN Y    
  28.   
  29. NON_REPUDIATION BINARY_INTEGER IN Y    
  30.   
  31. SECURE BOOLEAN IN Y   
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 '队列对象名(充当消息体的对象名称),以下同
Sql代码 复制代码
  1. dbms_aqadm.create_queue_table('WDZAQTABLE','WDZAQMSG');   
dbms_aqadm.create_queue_table('WDZAQTABLE','WDZAQMSG'); 

--创建具有排序功能的队列表
Sql代码 复制代码
  1. dbms_aqadm.create_queue_table('WDZSQRTAQTABLE','WDZAQMSG',sort_list => 'PRIORITY,enq_time');   
dbms_aqadm.create_queue_table('WDZSQRTAQTABLE','WDZAQMSG',sort_list => 'PRIORITY,enq_time'); 
3。消息分组参数 message_grouping 可以是 NONE,或 TRANSACTIONAL
Sql代码 复制代码
  1. -- message grouping   
  2. dbms_aqadm.TRANSACTIONAL CONSTANT BINARY_INTEGER := 1;   
  3. dbms_aqadm.NONE CONSTANT BINARY_INTEGER := 0;  
-- message grouping
dbms_aqadm.TRANSACTIONAL CONSTANT BINARY_INTEGER := 1;
dbms_aqadm.NONE CONSTANT BINARY_INTEGER := 0;
后者表示一个与事务相关的消息分成1组,在提取消息的时候可以当成一组相关消息来提取。例如:
Sql代码 复制代码
  1. --创建带带分组功能的消息队列表    
  2. dbms_aqadm.create_queue_table('WDZGROUPAQTABLE','WDZAQMSG',   
  3. sort_list => 'PRIORITY,enq_time',   
  4. message_grouping =>dbms_aqadm.TRANSACTIONAL/*dbms_aqadm.NONE*/ );  
--创建带带分组功能的消息队列表 
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
Sql代码 复制代码
  1. --创建多个接收者的消息队列表    
  2. dbms_aqadm.create_queue_table('WDZMUTIAQTABLE','WDZAQMSG',sort_list => 'PRIORITY,enq_time',   
  3. message_grouping =>dbms_aqadm.TRANSACTIONAL/*dbms_aqadm.NONE*/    
  4. ,multiple_consumers => 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删除队列表
Sql代码 复制代码
  1. Exec dbms_aqadm.drop_queue_table(queue_table => 'sms_mt_tab');   
  2. Exec dbms_aqadm.drop_queue_table(queue_table => 'sms_mo_tab');  
Exec dbms_aqadm.drop_queue_table(queue_table => 'sms_mt_tab');
Exec dbms_aqadm.drop_queue_table(queue_table => 'sms_mo_tab');

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

Sql代码 复制代码
  1. exec dbms_aqadm.create_queue(queue_name=>'sms_mt_queue', queue_table=>'sms_mt_tab');   
  2.   
  3.   
  4. exec dbms_aqadm.create_queue(queue_name=>'sms_mt_queue_exception', queue_table=>'sms_mt_tab',queue_type=>dbms_aqadm.EXCEPTION_QUEUE);   
  5.   
  6.   
  7. exec dbms_aqadm.create_queue(queue_name=>'sms_mt_queue_backup', queue_table=>'sms_mt_tab');  
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');



参数含义:
Sql代码 复制代码
  1. --参考 dbms_aqadm.create_queue   
  2. --创建队列, sms_mt_queue为队列的名称,' sms_mt_tab ' 队列表名   
  3. dbms_aqadm.create_queue('WDZQUEUE','WDZAQTABLE',queue_type => dbms_aqadm.NORMAL_QUEUE);   
  4. --参数queue_type 表示队列是否为正常队列还是异常队列,   
  5. --参数值为dbms_aqadm.NORMAL_QUEUE 或者dbms_aqadm.EXCEPTION_QUEUE   
  6.   
  7. --创建多用户队列, 'WDZQUEUE' 为队列的名称,'WDZAQTABLE' 队列表名   
  8. dbms_aqadm.create_queue('WDZMUTIQUEUE','WDZMUTIAQTABLE',   
  9. queue_type => dbms_aqadm.NORMAL_QUEUE);   
  10. --创建分组队列, 'WDZGROUPQUEUE' 为队列的名称,'WDZAQTABLE' 队列表名   
  11. dbms_aqadm.create_queue('WDZGROUPQUEUE''WDZAQTABLE',   
  12. queue_type => dbms_aqadm.NORMAL_QUEUE);  
--参考 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删除队列
代码如下:

Sql代码 复制代码
  1. Exec dbms_aqadm.drop_queue('sms_mt_queue');  
Exec dbms_aqadm.drop_queue('sms_mt_queue');

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

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

参考 dbms_aqadm.create_np_queue

Sql代码 复制代码
  1. dbms_aqadm. create_np_queue ('sms_mt_queue', multiple_consumers=>false);  
dbms_aqadm. create_np_queue ('sms_mt_queue', multiple_consumers=>false);


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

Sql代码 复制代码
  1. dbms_aqadm.start_queue('sms_mt_queue',enqueue=>true, dequeue=> true);  
dbms_aqadm.start_queue('sms_mt_queue',enqueue=>true, dequeue=> true);


C 停止队列

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

Sql代码 复制代码
  1. dbms_aqadm.stop_queue(sms_mt_queue ',enqueue=>false, dequeue=>true);  
dbms_aqadm.stop_queue(sms_mt_queue ',enqueue=>false, dequeue=>true);


5 队列操作
说明:

1 入队

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



Sql代码 复制代码
  1. p102_mt_dequeue   
  2. (   
  3. p_equeue_name In varchar2, --队列名单大写字母,主队列:SMS_MT_QUEUE 备份队列:SMS_MT_QUEUE_BACKUP   
  4. p_client_id Out Number, --短信内部网关   
  5. p_res_str Out varchar2, --返回值 0 成功 -2 队列为空其它失败   
  6. p_label out varchar2, --标签   
  7. p_body out varchar2) --数据包体  
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 数据格式转换
Sql代码 复制代码
  1. p103_change_label_body_str   
  2. (   
  3. p_dequeue_body In Mt_Struc,   
  4. p_res_str Out Varchar2,   
  5. p_label Out varchar2,   
  6. p_body Out varchar2   
  7. )/*   
  8. 功能:把出队列的字符串翻译成有规则的label,和body   
  9. 日期:2006-09-20   
  10. */  
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 测试入队

Sql代码 复制代码
  1. procedure P101_MT_ENQUEUE_TEST   
  2. (   
  3. p_equeue_name In varchar2,--队列名单大写字母,主队列:SMS_MT_QUEUE 备份队列:SMS_MT_QUEUE_BACKUP   
  4. p_res_str out Varchar2,   
  5. p_msg_id OUT Varchar2   
  6. )  
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入队

Sql代码 复制代码
  1. create or replace procedure P100_MT_ENQUEUE   
  2. (   
  3. p_equeue_name In varchar2, --队列名单大写字母,主队列:SMS_MT_QUEUE 备份队列:SMS_MT_QUEUE_BACKUP   
  4. p_body In t_outbox_push%Rowtype,--入参,记录类型,数据源头直接调用   
  5. p_level In Number:=3, --优先级别1-5,数值越小越快   
  6. p_delay In Number:=0, --入队延迟时间,单位:秒   
  7. p_res_str OUT VARCHAR2, --0 成功 其它失败   
  8. p_msg_id OUT Varchar2 --返回的msgid,主键   
  9. )/*   
  10. 功能:数据源头,push,的入队操作   
  11. */   
  12. Is  
  13. v_enqueue_options dbms_aq.enqueue_options_t;   
  14. v_message_properties dbms_aq.message_properties_t;   
  15. v_message_handle raw(16);   
  16. v_body mt_struc;---写日志区域   
  17. vPid NUMBER:=100;   
  18. vProName VARCHAR2(50):='P100_MT_ENQUEUE';   
  19. vProTip VARCHAR2(255);   
  20. vErrorCode VARCHAR2(20);   
  21. vErrorMsg VARCHAR2(2000);   
  22. Begin  
  23. --1初始化   
  24. p_res_str:='-1';   
  25.   
  26. --2 P_BODY 到 v_body 的转化 把一个字符串转化为一个结构体   
  27. v_body:=mt_struc(   
  28. p_body.OP_ID ,   
  29. p_body.DEST_MOBILENO ,   
  30. p_body.FEE_MOBILENO ,   
  31. p_body.LONG_NO ,   
  32. p_body.MT_CONTENT ,   
  33. p_body.SERVICE_ID ,   
  34. p_body.MT_FLAG ,   
  35. p_body.MSG_FMT ,   
  36. p_body.FEE_TYPE ,   
  37. p_body.FEE_VALUE ,   
  38. p_body.BEG_REPORT ,   
  39. p_body.CLIENT_ID ,   
  40. p_body.CLIENT_NAME ,   
  41. p_body.MT_TIME ,   
  42. p_body.MT_ID ,   
  43. p_body.PLAN_ID ,   
  44. p_body.PUSH_TYPE ,   
  45. p_body.SEND_DATE );   
  46. --4设置属性和参数---   
  47. --指定异常队列   
  48. v_message_properties.exception_queue:='SMS_MT_QUEUE_EXCEPTION';   
  49. --设置优先级别   
  50. v_message_properties.priority :=p_level;   
  51. --设置延时时间--秒   
  52. v_message_properties.delay :=p_delay;   
  53. --5 开始入队   
  54. dbms_aqadm.start_queue(p_equeue_name,enqueue=>true, dequeue=> true);   
  55. dbms_aq.enqueue(queue_name=>p_equeue_name,   
  56. enqueue_options=>v_enqueue_options,   
  57. message_properties=>v_message_properties,   
  58. payload=>v_body,   
  59. msgid=>v_message_handle);   
  60. P_MSG_ID:=v_message_handle ;   
  61. --6 commit   
  62. Commit;   
  63. p_res_str:='0';   
  64. Exception   
  65. When Others Then  
  66. p_res_str:='-100';   
  67. vProTip:='入队过程异常!';   
  68. vErrorCode:=Sqlcode;   
  69. vErrorMsg:=SQLERRM;   
  70. p_pub_write_error_log(vPid,vProName,'','',   
  71. vProTip,vErrorCode,vErrorMsg,1);   
  72. Rollback;   
  73. end P100_MT_ENQUEUE;   
  74.   
  75. create or replace procedure P101_MT_ENQUEUE_TEST   
  76. (   
  77. p_equeue_name In varchar2,--队列名单大写字母,主队列:SMS_MT_QUEUE 备份队列:SMS_MT_QUEUE_BACKUP   
  78. p_res_str out Varchar2,   
  79. p_msg_id OUT Varchar2   
  80. ) /*   
  81. 功能:测试入队   
  82. */   
  83. Is  
  84. Cursor cur_push Is  
  85. Select * From t_outbox_push;   
  86. v_row_push t_outbox_push%Rowtype;   
  87. v_exe_res varchar2(200);   
  88. v_message_handle raw(16);   
  89. begin  
  90. p_res_str:='-1';   
  91. Open cur_push;   
  92. Loop   
  93. Fetch cur_push Into v_row_push;   
  94. Exit When cur_push%Notfound;   
  95. P100_MT_ENQUEUE(p_equeue_name,v_row_push,3,0,v_exe_res,v_message_handle);   
  96. End Loop;   
  97. Close cur_push;   
  98. p_res_str:=v_exe_res;    
  99. p_msg_id:=v_message_handle;   
  100. Exception   
  101. When Others Then  
  102. p_res_str:=Sqlerrm;   
  103. Rollback;    
  104. end P101_MT_ENQUEUE_TEST; 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20945761/viewspace-586833/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/20945761/viewspace-586833/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值