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。
注:orai18n.jar这个文件,一定要用自己的WEBLOGIC下带的,否则有可能乱码问题不能解决。