Oracle java jdbc bug

时间:2014-06-04 15:45:08

标签: java oracle jdbc

我只是简化了我的代码,所以任何人都可以重现这个问题。数据库数据是:

CREATE OR REPLACE TYPE HBD."MY_OBJECT" AS OBJECT
(
VALUE VARCHAR2(1)
)
/

CREATE OR REPLACE TYPE HBD."MY_COLLECTION" AS TABLE OF MY_OBJECT
/

CREATE OR REPLACE PACKAGE HBD.MY_PACKAGE
IS
   --Obtener detalle de un contrato
   PROCEDURE MY_STORED_PROCEDURE (
      out_value OUT NOCOPY HBD.MY_COLLECTION
   );
END MY_PACKAGE;
/

CREATE OR REPLACE PACKAGE BODY HBD.MY_PACKAGE
IS
   --Obtener detalle de un contrato
   PROCEDURE MY_STORED_PROCEDURE (
      out_value OUT NOCOPY HBD.MY_COLLECTION
   )
   IS
   BEGIN
      out_value := MY_COLLECTION();
      FOR i IN 1..10920 LOOP
        out_value.EXTEND;
        out_value (i) := NEW MY_OBJECT ('A');
      END LOOP;
   END;
END MY_PACKAGE;
/

我的java代码是:

public static void main(String[] args) throws SQLException,
        MalformedObjectNameException, NullPointerException,
        AttributeNotFoundException, InstanceNotFoundException,
        MBeanException, ReflectionException {

    System.out.println("Start");

    Connection connection = DriverManager.getConnection(
            "XXX", "YYY", "ZZZ");

    String PROCEDURE = "{call MY_PACKAGE.MY_STORED_PROCEDURE(?)}";

    CallableStatement cs = connection.prepareCall(PROCEDURE);
    cs.registerOutParameter(1, Types.ARRAY, "MY_COLLECTION");
    cs.execute();
    Array array = cs.getArray(1);
    if (array == null) {
        System.out.println("array == null");
    } else {
        System.out.println("array != null");
    }
    cs.close();
    connection.close();
    System.out.println("End");
}

正如您在存储过程中看到的那样,有一个10920.如果我将此值更改为任何其他值。代码的输出将导致:array!= null。使用10920,输出为:array == null。

提前致谢。 琼

1 个答案:

答案 0 :(得分:0)

检查以确保您使用的ojdbc * .jar文件与您的版本兼容 ORACLE:

classes12.jar - 适用于Java 1.2和1.3 ojdbc14.jar - 适用于Java 1.4和1.5 ojdbc5.jar - 适用于Java 1.5 ojdbc6.jar - 适用于Java 1.6

http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

Oracle Database 11g第2版(11.2.0.3)JDBC驱动程序

下载ojdbc5.jar(2,095,932字节) - 用于JDK 1.5的类。 它包含JDBC驱动程序类,但Oracle中支持NLS的类除外 对象和集合类型。 下载ojdbc5_g.jar(3,426,203字节) - 与ojdbc5.jar相同,但 这些类是用" javac -g"编译的。并包含跟踪代码。

下载ojdbc6.jar(2,714,189字节) - 用于JDK 1.6的类。 它包含JDBC驱动程序类,但Oracle中的NLS支持类除外 对象和集合类型。 下载ojdbc6_g.jar(4,463,274字节) - Sa

而不是Types.ARRAY尝试使用OracleTypes.ARRAY

import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;

cs.registerOutParameter(6, OracleTypes.STRUCT, "OHSI_CABECERA_CONTRATO");
cs.registerOutParameter(7, OracleTypes.ARRAY, "CHSI_HABITACION");
cs.registerOutParameter(8, OracleTypes.ARRAY, "CHSI_TARIFAS");
cs.registerOutParameter(9, OracleTypes.ARRAY, "CHSI_COMISION_WEB");
cs.registerOutParameter(10, OracleTypes.ARRAY, "CHSI_GRATUIDAD");
cs.registerOutParameter(11, OracleTypes.ARRAY, "CHSI_ESTANCIA_MINIMA");

执行后,使用此代码检查并访问数组

ARRAY array = (ARRAY) cs.getArray(1);
if (array != null && array.length() > 0) {
rs = array.getResultSet();
}