我只是简化了我的代码,所以任何人都可以重现这个问题。数据库数据是:
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。
提前致谢。 琼
答案 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();
}