Oracle Java JDBC ошибка

1

Я просто упростил свой код, чтобы любой мог воспроизвести проблему. Данные базы данных:

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
    Ошибка не в JDBC, похоже, в вашем драйвере Oracle.
  • 0
    Просто чтобы убедиться, что я понимаю, если в таблице MY_COLLECTION есть любое количество записей, кроме 10920, все работает правильно?
Показать ещё 1 комментарий
Теги:
jdbc

1 ответ

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 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();
} 
  • 0
    Значение Types.ARRAY и OracleTypes.ARRAY одинаково. И оно не работает.
  • 0
    Возможно, вы захотите убедиться, что используемый вами файл ojdbc * jar совместим с вашей версией ORACLE. Я добавил URL выше ..
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню