SQLJ乱码,JAVA调用存储过程获取ORACLE自定义类型的值乱码

SQLJ技术的使用本文不进行相关介绍,如果是想要学习的朋友可以在网上搜索一下,很多资料都有介绍。

本文主要是说明已使用SQLJ技术的应用,由于数据编码设置为GBK后程序中获取的数据乱码的解决方案。

情况说明:
数据库的字符集编码设置为:ZHS16GBK
应用程序调用数据库中的存储过程,注册的出参为ORACLE自定义的TYPE或OBJECT类型,存诸过程调用后,获取出参中的数据时,数据库中定义为VARCHAR2类型的数据都为乱码,但数值型是正常的。

以上情况,包括使用SQLJ或直接使用oracle.sql.STRUCT进行获取,获取方式代码片段如下:
JdbcTemplate jdbcTemplate = getJdbcTemplate();
OracleCallableStatement proc = null;
Connection conn = null;
String adjustFlag = "";
CharacterSet dbCharset = CharacterSet.make(CharacterSet.ZHS16GBK_CHARSET);//用于进行转码
try {
conn = jdbcTemplate.getDataSource().getConnection();
proc = (OracleCallableStatement)conn
.prepareCall("{ call MyProc(?, ?, ?, ?, ?, ?, ?) }"); // 调用存储过程

proc.registerOutParameter(6, Types.VARCHAR); // 注册输出参数,就是返回值,成功标志.
proc.registerOutParameter(7, OracleTypes.ARRAY, "ARR_REPLAN"); // 注册输出参数,就是返回值,类型为数组

proc.setString(1,grPropPlanAdjDto.getCertiNo());
proc.setBigDecimal(2,new BigDecimal(grPropPlanAdjDto.getDangerUnitNo().doubleValue()));
proc.setString(3,grPropPlanAdjDto.getReRiskCode());
proc.setString(4,grPropPlanAdjDto.getRiskCode());
proc.setDate(5,new java.sql.Date(grPropPlanAdjDto.getStartDate().getTime()));

proc.execute(); // 执行

adjustFlag = proc.getString(6); // 接收返回值
Array arrReplan = proc.getArray(7); // 接收返回值
Object[] objArr = (Object[])arrReplan.getArray();
for(Object obj : objArr) {

STRUCT s = (STRUCT)obj;
for(int i=0; i<s.getAttributes().length; i++){
CHAR value = new CHAR(String.valueOf(s.getAttributes()[i]).getBytes(), dbCharset);
System.out.println("===="+s.getAttributes()[i]);
System.out.println("===="+value);
}
for(int i=0; i<s.getOracleAttributes().length; i++){
CHAR value = new CHAR(s.getOracleAttributes()[i], dbCharset);
System.out.println("===="+s.getOracleAttributes()[i]);
System.out.println("===="+value);
}
}

}
finally {
if(proc!=null){
try{
proc.close();
}catch(Exception e){

}
}

if(conn != null){
try {
conn.close();
}
catch(SQLException e) {

}
}
}

return null;
}
乱码解决方法:
取%WEBLOGIC_HOME%\wlserver_10.3\server\ext\jdbc\oracle\11g目录下的orai18n.jar,然后放到weblogic使用的JDK的jre/lib/ext目录下,或者修改weblogic的启动脚本,把这个jar添加到classpath中。如果添加此jar包后,启动报错说明原有的JDBC驱动jar包的版本太低,需要换成ojdbc6.jar,同样在与orai18n.jar的目录中,WEBLOGIC也提供了ojdbc6.jar文件,复制出来,与orai18n.jar放到一起,确保WEBLOGIC启动时,加载到此JAR。

[color=red]注:orai18n.jar这个文件,一定要用自己的WEBLOGIC下带的,否则有可能乱码问题不能解决。[/color]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值