在调用JAVA存储过程时出现如下错误:ORA-29532: Java 调用被未捕获的 Java 例外终止

sinboy 2004-03-14 11:53:04
JAVA源程序如下:
import java.net.Socket;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.PrintWriter;
import java.util.Properties;
import java.util.Enumeration;
import java.util.Calendar;
import java.util.ArrayList;

/**
* 当有新的车辆用户注册时,实时提交此车辆用户本月应付的包月信息费.
* 1。首先建立和通信平台的连接
* 2。从数据库中读取新注册车辆的包月信息
* 3。计算此车辆本月应付的实际包月费,计算方式为:(剩余天数/本月的天数)*包月费
* 4。把包月信息按照一定的协议格式进行组合,如:0028 0 F0 0001 13523533151 030 xy7
* 5。把组合之后的数据发送给通信平台
*/
public class Test9 {
private static final int YT_GPSFEE_1=60;
private static final int YT_GPSFEE_2=80;
private static final int YT_GPSFEE_3=150;

/**
* 通信平台的主机IP地址和端口号
*/
private static String commuHost=null;
private static int commuPort=0;
private static ArrayList bufferFee=new ArrayList(0);
public static void submitFee(String sim,String feeInfo) {
Socket client=null;
int fee=cint(feeInfo);
try{

if(sim!=null && sim.length()==11 && sim.substring(0,2).equals("13")){
if(fee>0){
commuHost="127.0.0.1";
commuPort=2002;

client = new Socket(commuHost, commuPort);

getGpsFee(sim,fee);
PrintWriter out = new PrintWriter(client.getOutputStream());

while (bufferFee.size() > 0) {
out.println( (String) bufferFee.remove(0));
out.flush();
}
out.close();
client.close();

}
}

}

catch(IOException e){e.printStackTrace();}

}

/**
* 把表示数字含义的字符串转你成整形
* @param str 要转换的字符串
* @return 如果是有意义的整数,则返回此整数值。否则,返回-1。
*/
public static int cint(String str) {
if (str != null)
try {
int i = new Integer(str).intValue();
return i;
}
catch (NumberFormatException e) {
e.printStackTrace();
}

return -1;
}

/**
* 从数据库中查找出GPS车辆的计费信息,然后进行处理,最后把处理后的数据暂存到
* 缓冲区bufferFee.
*/
public static void getGpsFee(String sim,int fee){

int factFee=0;//新注册用户本月实际要付的包月费
String svcType=null;//业务代码

int count=0;
Calendar cld=Calendar.getInstance();

//计算出此用户此月实际应该缴纳的费用

int days=0;
//计算当前天到月底的天数
days=cld.getActualMaximum(cld.DAY_OF_MONTH)-cld.get(cld.DAY_OF_MONTH);
if(days>0)
factFee = (int)(fee * ((float)days/31));

//设置业务代码
if(fee==YT_GPSFEE_1)
svcType="xy1";
else if(fee==YT_GPSFEE_2)
svcType="xy3";
else if(fee==YT_GPSFEE_3)
svcType="xy7";

addToBufferFee(bufferFee,sim,factFee,svcType);
}

/**
* 把计费数据按一定的协议格式进行组合.
* 消息体的内容填上资费,固定为3位。
* @param flag 标志位
* @param type 消息类型
* @param sim SIM卡号
* @param fee 资费
* @param svcType 业务代码
* @return 组合好的消息,格式为(实际当是国间没有空格): xxxx x xx 0001 13523533151 060 xy1
*/
private static String combineFeeMsg(String flag,String type,String sim,int fee,String svcType){
String msg=null;
String totalLen=null;
int ln=0;
if(flag!=null && type!=null && sim!=null && fee>0 && svcType!=null){
msg=flag+type+"0001"+sim;
if(fee<10)
msg+="00"+fee;
else if(fee<100)
msg+="0"+fee;
else if(fee<1000)
msg+=fee;
else
return null;
msg+=svcType;
ln=4+msg.length();
if(ln<10)
msg="000"+ln+msg;
else if(ln<100)
msg="00"+ln+msg;
else if(ln<1000)
msg="0"+ln+msg;
else if(ln<10000)
msg=ln+msg;
else
return null;

}
return msg;

}
/**
* 把从数据库中取出的SIM卡资费信息按照协议格式进行组合之后,放到缓冲区中。
* 每一条数据中所含的信息费不能超过30元.
* IF FEE是30的倍数 THEN
* 则此用户的信息费需要用N=FEE/30条短信息来提交,每条短信息所含的信息费为30;
* ELSE IF FEE是20的倍数 THEN
* 则此用户的信息费需要用N=FEE/20条短信息来提交,每条短信息所含的信息费为20;
* ELSE
* 则此用户的信息费需要用N=FEE/30+1条短信息来提交,前N-1条短信息所含的信息费为30,
* 最后一条所含的信息费为FEE%30;
* END
* @param buffer 暂存计费数据的缓冲区
* @param sim SIM卡号
* @param fee 每条计费数据包含的信息费
*/
public static void addToBufferFee(ArrayList buffer,String sim,int fee,String svcType){
if(buffer!=null && sim!=null && fee>0 && svcType!=null){
if(sim.length()==11){

if(fee>0){
int count=0;//短信息的条数
int lastFee=0;//最后一条短信息所含的信息费
String msg=null;
if((fee%30)==0){
count = fee / 30;

for(int i=0;i<count;i++){
msg = combineFeeMsg("1", "F0",sim, 30,svcType);
buffer.add(msg);
System.out.println("把从数据库中读取的计费信息暂存到BUFFER中:"+msg);
}
}
else if(fee%20==0){
count=fee/20;
for(int i=0;i<count;i++){
msg = combineFeeMsg("1", "F0",sim,20,svcType);
if(msg!=null)
buffer.add(msg);
System.out.println("把从数据库中读取的计费信息暂存到BUFFER中:"+msg);
}

}
else {
count=fee/30+1;
for(int i=0;i<count-1;i++){
msg = combineFeeMsg("1", "F0",sim, 30,svcType);
if(msg!=null)
buffer.add(msg);
System.out.println("把从数据库中读取的计费信息暂存到BUFFER中:"+msg);
}

msg=combineFeeMsg("1","F0",sim, fee%30,svcType);
if(msg!=null)
buffer.add(msg);
System.out.println("把从数据库中读取的计费信息暂存到BUFFER中:"+msg);

}

}
}
}

}

}

javac Test9.java
然后把CLASS加载到数据库中:
loadjava -user sinboy/sinboy D:\Test.class

SQL>conn sinboy/sinboy

SQL> create or replace procedure Test9(sim varchar2,fee varchar2)
2 as language java name
3 'Test9.submitFee(java.lang.String,java.lang.String)';
4 /
过程已创建。

SQL> create or replace trigger trg
2 after update on test for each row
3 begin
4 test9(:new.sim,:new.feeInfo);
5 end;
6 /
触发器已创建

SQL> desc test;
名称 是否为空? 类型
----------------------------------------- -------- -------------
ID NUMBER
LOGINDATE DATE
SIM CHAR(11)
FEEINFO NUMBER

SQL> update test set sim='13523533151';
update test set sim='13523533151'
*
ERROR 位于第 1 行:
ORA-29532: Java 调用被未捕获的 Java 例外终止:
java.security.AccessControlException: the Permission (java.net.SocketPermission
127.0.0.1:2002 connect,resolve) has not been granted to SINBOY. The PL/SQL to
grant this is dbms_java.grant_permission( 'SINBOY',
'SYS:java.net.SocketPermission', '127.0.0.1:2002', 'connect,resolve' )
ORA-06512: 在"SINBOY.TEST9", line 0
ORA-06512: 在"SINBOY.TRG", line 2
ORA-04088: 触发器 'SINBOY.TRG' 执行过程中出错
...全文
1655 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaochonghua 2004-03-15
  • 打赏
  • 举报
回复
数据库用户SINBOY的权限不够!

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧