SQLJ乱码,JAVA调用存储过程获取ORACLE自定义类型的值乱码_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > SQLJ乱码,JAVA调用存储过程获取ORACLE自定义类型的值乱码

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

 2013/8/10 18:58:10  forever_8601  程序员俱乐部  我要评论(0)
  • 摘要:SQLJ技术的使用本文不进行相关介绍,如果是想要学习的朋友可以在网上搜索一下,很多资料都有介绍。本文主要是说明已使用SQLJ技术的应用,由于数据编码设置为GBK后程序中获取的数据乱码的解决方案。情况说明:数据库的字符集编码设置为:ZHS16GBK应用程序调用数据库中的存储过程,注册的出参为ORACLE自定义的TYPE或OBJECT类型,存诸过程调用后,获取出参中的数据时,数据库中定义为VARCHAR2类型的数据都为乱码,但数值型是正常的。以上情况,包括使用SQLJ或直接使用oracle.sql
  • 标签:ORA Java 过程 SQL 存储过程 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下带的,否则有可能乱码问题不能解决。
发表评论
用户名: 匿名