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;
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博客 ” ,链接:https://blog.itpub.net/8109090/viewspace-879433/ ,如需转载,请注明出处,否则将追究法律责任。