首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

2013-08-11 
SQLJ乱码,JAVA调用存储过程获取ORACLE自定义类型的值乱码SQLJ技术的使用本文不进行相关介绍,如果是想要学

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下带的,否则有可能乱码问题不能解决。

热点排行