ITPub博客

首页 > 数据库 > Oracle > oracle高级队列在通信方面的应用设计(AQ高级队列设计说明二)

oracle高级队列在通信方面的应用设计(AQ高级队列设计说明二)

原创 Oracle 作者:itpub120 时间:2006-11-23 17:22:01 0 删除 编辑

5.2出队

create or replace procedure 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)
--数据包体
Is
/*
功能: 出队列,返回给java程序
日期:2006-09-20
write by hancy
*/

v_Dequeue_Options Dbms_Aq.Dequeue_Options_t;
v_Message_Properties Dbms_Aq.Message_Properties_t;
v_Message_Handle Raw(
16);
v_Body_queue Mt_Struc;
v_label Varchar2(
200);
v_body varchar2(
1000);
res_str varchar2(
20);
---写日志区域
vPid NUMBER:=
102;
vProName VARCHAR2(
50):='p102_mt_dequeue';
vProTip VARCHAR2(
255);
vErrorCode VARCHAR2(
20);
vErrorMsg VARCHAR2(
2000);
v_count Number;
Begin
--1 初始化
p_res_str:=
'-1' ;
--2 出队列设置属性
--???
--3 执行出队列操作
Select Count(
0) Into v_count From sms_mt_tab Where q_name=p_equeue_name ;
If v_count >
0 Then
dbms_aqadm.start_queue(p_equeue_name,enqueue=>true, dequeue=> true);
Dbms_Aq.Dequeue(Queue_Name => p_equeue_name,
Dequeue_Options => v_Dequeue_Options,
Message_Properties => v_Message_Properties,
Payload => v_Body_queue,
Msgid => v_Message_Handle);
-- 组和 label= 消息类型(CommandID)+运营商标识+地区标识(AreaID)+时间标识
-- 组合 body
--4 返回给java的包体
p103_change_label_body_str(v_Body_queue,res_str,v_label,v_body);
If res_str=
'0' Then
p_label :=v_label;
p_body :=v_body;
p_client_id:=v_Body_queue.CLIENT_ID;
--提交
Commit;
p_res_str:=
'0' ;
Else
p_res_str:=
'出队列后组串失败!' ;
End If;
Else
p_res_str:=
'队列里面没有数据,休息一下';
End If;
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 p102_mt_dequeue;

create or replace procedure 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
write by hancy
*/

Is
---写日志区域
vPid NUMBER:=
103;
vProName VARCHAR2(
50):='p103_change_label_body_str';
vProTip VARCHAR2(
255);
vErrorCode VARCHAR2(
20);
vErrorMsg VARCHAR2(
2000);
--label
v_label Varchar2(
50);
v_client_id Number;
v_date_str varchar2(
20);
--body
v_PRDID varchar2(
10);
v_CHANNELID varchar2(
10);
v_ActionID varchar2(
20);
v_Result varchar2(
20);
v_MSGID varchar2(
20);
v_Pk_total varchar2(
20);
v_Pk_Number varchar2(
20);
v_RegisteredDelivery varchar2(
20);
v_ServiceID varchar2(
20);
v_FeeUserType varchar2(
20);
v_FeeTerminalID varchar2(
35);
v_MsgFmt varchar2(
20);
v_FeeType varchar2(
20);
v_FeeCode varchar2(
20);
v_SrcID varchar2(
30);
v_DestID varchar2(
35);
v_LinkID varchar2(
20);
v_MTFlag varchar2(
20);
v_FixedCode varchar2(
20);
v_RepeatNum varchar2(
20);
v_InfoID varchar2(
20);
v_MsgContent varchar2(
150);
-------------------------------------
v_body varchar2(
2000);
begin
p_res_str:=
'-1';
v_Result :=
'';
v_MSGID :=
'';
v_Pk_total :=
'';
v_Pk_Number:=
'';
--label
Select to_char(Sysdate,
'YY-MM-DD HH:MM:SS') Into v_date_str From dual ;
If p_dequeue_body.CLIENT_ID>
150 Then
v_label:=
'022000000'||v_date_str;
Else
v_label:=
'021000000'||v_date_str;
End If;
--body
v_PRDID:=
'0000' ; v_CHANNELID:='0000'; v_ActionID:='0';
v_Result :=lpad(
' ',8,' ');
v_MSGID :=lpad(
' ',16,' ');
v_Pk_total :=lpad(
' ',1,' ');
v_Pk_Number:=lpad(
' ',1,' ');
--v_RegisteredDelivery
v_RegisteredDelivery:=lpad(p_dequeue_body.BEG_REPORT,
1,' ');
--v_ServiceID
v_ServiceID:=lpad(p_dequeue_body.SERVICE_ID,
10,' ');
--v_FeeUserType
v_FeeUserType:=
'0';
--v_FeeTerminalID
v_FeeTerminalID:=lpad(p_dequeue_body.FEE_MOBILENO,
32,' ');
--v_MsgFmt
v_MsgFmt:=lpad(p_dequeue_body.MSG_FMT,
2,' ');
--v_FeeType
v_FeeType:=lpad(p_dequeue_body.FEE_TYPE,
2,' ');
--v_FeeCode
v_FeeCode:=lpad(p_dequeue_body.FEE_VALUE,
6,' ');
--v_SrcID
v_SrcID:=lpad(p_dequeue_body.LONG_NO,
21,' ');
--v_DestID
v_DestID:=lpad(p_dequeue_body.DEST_MOBILENO,
32,' ');
--v_LinkID
v_LinkID:=lpad(
' ',20,' ');
--v_MTFlag varchar2(20);
v_MTFlag:=lpad(p_dequeue_body.MT_FLAG,
2,' ');
---v_FixedCode varchar2(20);
v_FixedCode:=lpad(
' ',6,' ');
--v_RepeatNum varchar2(20);
v_RepeatNum:=
'1';
--v_InfoID varchar2(20);
v_InfoID:=lpad(
' ',16,' ');
--v_MsgContent varchar2(150);
v_MsgContent:=p_dequeue_body.MT_CONTENT;

--add
v_body:=
(v_PRDID
||v_CHANNELID
||v_ActionID
||v_Result
||v_MSGID
||v_Pk_total
||v_Pk_Number
||v_RegisteredDelivery
||v_ServiceID
||v_FeeUserType
||v_FeeTerminalID
||v_MsgFmt
||v_FeeType
||v_FeeCode
||v_SrcID
||v_DestID
||v_LinkID
||v_MTFlag
||v_FixedCode
||v_RepeatNum
||v_InfoID
||v_MsgContent) ;
--to value
p_label:=v_label;
p_body:=v_body ;
--result
p_res_str:=
'0';
Exception
When Others Then
p_res_str:=Sqlerrm;
vProTip:=
'把出队列的字符串翻译异常!';
vErrorCode:=SQLCODE;
vErrorMsg:=SQLERRM;
p_pub_write_error_log(vPid,vProName,
'','',
vProTip,vErrorCode,vErrorMsg,
1);
Rollback;
end p103_change_label_body_str;

6 注意

1 权限问题

dbms_aq and dbms_aq_admin 包的execute权限授权给smpuser用户.

现象:否则编译不通过,

办法: 授权:

Grant aq_administrator_role To smpuser;

2 用户表空间限制问题

现象:入队操作一定数量的数据后报错:

ORA-00604: error occurred at recursive SQL level 1

ORA-01536: space quota exceeded for tablespace 'SMP_DB'

解决办法:

修改smpuser的限额:<> 修改为:<无限制>就搞定了!

[@more@]

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

请登录后发表评论 登录
全部评论
  • 博文量
    60
  • 访问量
    580372