oracle高階佇列在通訊方面的應用設計(AQ高階佇列設計說明二)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle高階佇列在通訊方面的應用設計(AQ高階佇列設計說明一)Oracle佇列
- Oracle 高階佇列(AQ Advanced Queueing)Oracle佇列
- RabbitMQ 高階 - 死信佇列MQ佇列
- 訊息佇列設計佇列
- RabbitMQ學習(三)之 “訊息佇列高階使用”MQ佇列
- RabbitMQ高階之訊息限流與延時佇列MQ佇列
- 訊息佇列設計精要佇列
- 高可用延遲佇列設計與實現佇列
- 流高階佇列使用者手冊佇列
- Linkedlist的應用場景:設計佇列、設計棧佇列
- 訊息佇列系列一:訊息佇列應用佇列
- 如何設計一個訊息佇列?佇列
- C++高階應用_設計模式C++設計模式
- Oracle 高階程式設計 01 ~Oracle程式設計
- ios-UI高階 GCD佇列組合成圖片iOSUIGC佇列
- 流高階佇列使用者手冊總結佇列
- 二、如何保證訊息佇列的高可用?佇列
- 進階高階IoT架構-教你如何簡單實現一個訊息佇列架構佇列
- unix環境高階程式設計(下)-高階IO和程式間通訊篇程式設計
- 架構文摘:訊息佇列設計精要架構佇列
- 系統程式設計——IPC訊息佇列程式設計佇列
- Java高階:條件佇列與同步器Synchronizer的原理+AQS的應用Java佇列AQS
- 高效能佇列設計佇列
- 訊息佇列(二)佇列
- 訊息佇列二佇列
- 中國移動蘇州研發中心訊息佇列高可用設計之談 | SOFAStack 使用者說佇列AST
- Redis 應用-非同步訊息佇列與延時佇列Redis非同步佇列
- Linux系統程式設計之程式間通訊方式:訊息佇列Linux程式設計佇列
- 如何設計一個牛逼的訊息佇列?佇列
- [.net 物件導向程式設計進階] (3) 正規表示式 (二) 高階應用物件程式設計
- 【極客班】Swift高階程式設計二Swift程式設計
- javascript高階程式設計第二章JavaScript程式設計
- RabbitMQ 高可用之映象佇列MQ佇列
- ACM金牌選手講解LeetCode演算法《棧和佇列的高階應用》ACMLeetCode演算法佇列
- Java併發程式設計:阻塞佇列Java程式設計佇列
- Java併發程式設計——阻塞佇列Java程式設計佇列
- 面試官:RabbitMQ過期時間設定、死信佇列、延時佇列怎麼設計?面試MQ佇列
- 程式間通訊--訊息佇列佇列