`
forever_8601
  • 浏览: 11768 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

相关推荐

    Java连接Oracle数据库的各种方法

    JDBC KPRB主要用于存储过程、触发器等数据库内的Java程序,直接使用当前的数据库会话。 SQLJ是另一种方法,它是一个预编译器,能够将Java源代码中的嵌入式SQL语句转换为Java代码。它的运行机制类似于Oracle的其他...

    JAVA SQLJ 开发指南

    预编译后的SQLJ程序运行速度更快,因为它们可以像Java方法一样被调用,而不是每次执行时都解析SQL。 3. **类型安全** SQLJ提供了类型安全的SQL操作。在编写SQLJ程序时,编译器会检查SQL语句的语法和类型,防止运行...

    oracle sqlj my test

    标题 "Oracle SQLJ My Test" 暗示了我们即将探讨的是有关Oracle数据库中的SQLJ技术,这是一种将Java与SQL结合起来的技术,用于处理数据库交互。SQLJ允许开发人员在Java程序中嵌入SQL语句,提供了更高效和类型安全的...

    oracle调用java程序

    【Oracle调用Java程序】是Oracle数据库中的一种高级特性,允许开发者使用Java语言编写存储过程、函数等数据库组件,以扩展数据库的功能。这种方式结合了Java的面向对象编程能力与Oracle数据库的强大数据处理能力。 ...

    sqlj oracle db2

    - **高级特性**:涵盖了SQLJ的一些高级用法,如存储过程调用、事务处理等。 - **示例代码**:提供了丰富的示例代码帮助理解SQLJ的具体用法。 #### 七、Oracle 8i SQLJ 编程实践 - **编写SQLJ代码**:指导如何在Java...

    DB2Java存储过程.pdf

    - **2.2.2 Java 在 DB2 中的实现**:具体讨论如何在 DB2 中使用 Java 创建和调用存储过程。 通过以上内容可以看出,《DB2 Java 存储过程》这本书全面地覆盖了 Java 与 DB2 结合的各个方面,包括 Java 在不同平台上...

    oracle调用webService

    在系统实现中,有时会有直接在数据库端利用触发器、存储过程等方式进行数据传递、分发的业务,而其中可能会涉及一些业务逻辑,为了处理这些业务逻辑,并简单起见,可以直接在触发器或存储过程中调用一些 Java 类或 ...

    java 存储过程使用方法介绍

    - **JSP、Servlets和Session Beans直接调用Java存储过程**:在Web应用中直接调用Java存储过程,实现业务逻辑的复用和优化。 - **共享业务逻辑**:在遗留系统与J2EE应用之间共享Java存储过程,促进不同系统的无缝集成...

    Java连接Oracle数据库的各种方法.doc

    本文主要探讨的是Java连接Oracle数据库的方法,包括JDBC和SQLJ,以及Oracle JDBC驱动的三种类型。 首先,Java与Oracle的接口使得在数据库中运行Java成为可能。Oracle8i引入了这一特性,允许开发者在应用程序中利用...

    Java Programming With Oracle Sqlj

    Java Programming With Oracle Sqlj。 &lt;br&gt;详细说明,介绍。通后学习如何用 SQLJ 取代 JDBC 开发模式。 例子说明: int v_id = 1; String v_name = null; float v_price = 0.0; PreparedStatement...

    java ee连接Oracle数据库的各种方法.doc

    Java EE 连接 Oracle 数据库有多种方法,其中包括 JDBC 和 SQLJ 两种方式。JDBC 提供了一个驱动接口,使得 Java 程序可以访问数据库,而 SQLJ 是一个 Java 预编译器,可以将内嵌的 SQL 语句转化为 Java 语句。 在 ...

    基于Oracle数据库的JDBC与SQLJ的研究.pdf

    SQLJ程序可以调用数据库存储过程,并且提供了更高级别的抽象,使得数据库操作更加简洁。Oracle公司对SQLJ提供了支持,使其成为Java开发者进行数据库编程的有力工具。 在使用JDBC访问Oracle数据库时,首先需要导入...

    Oracle9i中JAVA和PL_SQL的互操作方法.pdf

    5. 从JAVA程序中调用PL/SQL存储过程:开发者可以通过JDBC或SQLJ接口从JAVA程序中调用PL/SQL存储过程。例如,先在数据库中创建一个PL/SQL存储函数,然后通过JDBC调用这个存储函数。 在进行JAVA和PL/SQL互操作的过程...

    Java访问Oracle9i数据库的方法研究.pdf

    SQLJ 提供了类型安全性和性能优化,特别适合于复杂的数据库操作,如存储过程调用。 在 J2EE(Java 2 Platform, Enterprise Edition)环境中,Java 应用访问 Oracle9i 数据库的方式更加丰富。J2EE 定义了不同层次的...

    java连接oracle数据库的各种方法及java在数据库中的含义.doc

    Java 连接 Oracle 数据库的方法主要有 JDBC 和 SQLJ 两种方式。JDBC(Java Database Connectivity)是 Java 语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的能力。而 ...

    Oracle 9i SQLJ Developer’s Guide and Reference Release 2 (9.2)

    3. **预编译和优化**:Oracle 9i SQLJ支持预编译过程,将SQLJ源代码转换为Java字节码,然后在数据库中创建SQLJ对象,如存储过程和函数。这个过程可以提高执行效率,因为SQL语句在首次运行时已经被解析和优化。 4. *...

    oracle存储过程教程

    Oracle存储过程是数据库管理系统Oracle中的一个重要特性,它允许开发者创建一系列复杂的SQL和PL/SQL语句,形成可重用的程序单元。Oracle存储过程对于初学者来说,理解其基本概念和使用方法至关重要。 首先,我们要...

    Oracle8i Java Developer’s Guide Release 3 (8.1.7)

    3. Oracle8i 数据库编程:详细介绍 Oracle8i 数据库的编程技术,包括数据类型、SQL 语句、存储过程、触发器等。 4. Java 应用程序开发:指导开发者使用 Oracle8i 数据库开发 Java 应用程序,包括设计、实现和调试。...

Global site tag (gtag.js) - Google Analytics