oracle高階佇列在通訊方面的應用設計(AQ高階佇列設計說明二)

itpub120發表於2006-11-23

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章