Я просто упростил свой код, чтобы любой мог воспроизвести проблему. Данные базы данных:
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.
Заранее спасибо. Джоан
Убедитесь, что файл 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 bytes) - Классы для использования с JDK 1.5. Он содержит классы драйверов JDBC, за исключением классов поддержки NLS в типах объектов Oracle и коллекции. Скачайте ojdbc5_g.jar(3,426,203 bytes) - То же, что и ojdbc5.jar, за исключением того, что классы были скомпилированы с помощью javac -g и содержат код отслеживания.
Загрузить ojdbc6.jar(2,714,189 bytes) - Классы для использования с JDK 1.6. Он содержит классы драйвера JDBC, за исключением классов поддержки NLS в типах объектов Oracle и коллекции. Загрузить 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();
}