我只是简化了我的代码,这样任何人都可以重现这个问题。数据库数据为:
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。
提前谢谢。琼恩
发布于 2014-06-04 23:54:27
检查以确保您使用的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 Release 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
尝试使用OracleTypes.ARRAY而不是Types.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();
} https://stackoverflow.com/questions/24041904
复制相似问题