Что возвращает набор результатов Oracle для столбцов NUMBER?

Что, если столбец имеет тип NUMBER, и я вызываю getBoolean() по ResultSet? Что он возвращает?

В javadoc для интерфейса не указан тип NUMBER.

java.sql.ResultSet

Если назначенный столбец имеет тип данных CHAR или VARCHAR и содержит «0» или имеет тип данных BIT, TINYINT, SMALLINT, INTEGER или BIGINT и содержит 0, возвращается значение false. Если назначенный столбец имеет тип данных CHAR или VARCHAR и содержит «1» или имеет тип данных BIT, TINYINT, SMALLINT, INTEGER или BIGINT и содержит 1, возвращается значение true.

Документация по расширению Oracle не подробно описывает

Ява 8

Версия драйвера JDBC com.oracle.database.jdbc:ojdbc6:11.2.0.4

База данных Oracle 11g Enterprise Edition, выпуск 11.2.0.3.0 — 64-битная производственная версия

УПД

В этом дело? IDE по какой-то причине не загружает исходники, так что я думаю, это все, что мы можем сделать. Я не понимаю, что делает этот код

// oracle.jdbc.driver.NumberCommonAccessor#getBoolean
    boolean getBoolean(int var1) throws SQLException {
        boolean var2 = false;
        if (this.rowSpaceIndicator == null) {
            SQLException var6 = DatabaseError.createSqlException(this.getConnectionDuringExceptionHandling(), 21);
            var6.fillInStackTrace();
            throw var6;
        } else {
            if (this.rowSpaceIndicator[this.indicatorIndex + var1] != -1) {
                byte[] var3 = this.rowSpaceByte;
                int var4 = this.columnIndex + this.byteLength * var1 + 1;
                byte var5 = var3[var4 - 1];
                var2 = var5 != 1 || var3[var4] != -128;
            }

            return var2;
        }
    }

🤔 А знаете ли вы, что...
Java поддерживает множество протоколов, включая HTTP, FTP и многое другое.


55
2

Ответы:

Решено

Из Oracle 19 Руководство разработчика JDBC: 11 Доступ к данным Oracle и манипулирование ими

getBoolean

Поскольку не существует BOOLEAN типа базы данных, при использовании getBoolean всегда происходит преобразование типа данных. Метод getBoolean поддерживается только для числовых столбцов. При применении к этим столбцам getBoolean интерпретирует любое нулевое значение как false, а любое другое значение как true. При применении к столбцу любого другого типа getBoolean вызывает исключение java.lang.NumberFormatException.

Примечание. Версия Oracle 11g «Руководства разработчика JDBC» для Oracle, похоже, больше не существует, а ссылки на нее в оставшейся документации Oracle 11g не работают, поэтому документированное поведение такой старой, неподдерживаемой версии продукта найти сложно (невозможно?). Лучшим способом может быть тестирование поведения с помощью вашего драйвера (а затем добавление интеграционного теста в ваш набор тестов, чтобы вы могли отслеживать любые изменения в поведении при обновлении драйверов). В противном случае обновите базу данных до современной поддерживаемой версии.


Для справки: спецификация JDBC 4.3 (Приложение B.6) перечисляет следующие типы JDBC, поддерживаемые для getBoolean().

 TINYINT, SMALLINT, INTEGER,
 BIGINT, REAL, FLOAT, DOUBLE,
 DECIMAL, NUMERIC, BIT,
 BOOLEAN, CHAR, VARCHAR,
 LONGVARCHAR

Обратите внимание, что здесь указан NUMERIC, а не NUMBER. В javadoc для java.sql.Types говорится, что NUMERIC:

Константа в языке программирования Java, иногда называемая кодом типа, которая идентифицирует общий тип SQL NUMERIC.

Когда я просматриваю различные руководства по SQL и т. д., я вижу NUMERIC, а не NUMBER в большинстве диалектов SQL. Исключением является то, что синтаксис Oracle SQL поддерживает как NUMERIC (ANSI-совместимый), так и NUMBER.


Так что же это значит? Ну, если предположить, что:

  • NUMBER в Oracle является синонимом NUMERIC, а
  • Oracle добросовестно реализует спецификацию JDBC 4.3,

тогда мы можем сделать вывод, что NUMBER поддерживается для getBoolean().


Однако я остаюсь при своем предыдущем комментарии. Учитывая «свободные» операторы в javadocs для getBoolean(), возможно, было бы неплохо избегать их использования для столбцов Oracle NUMBER.

Почему?

Чтобы никто, прочитавший ваш код, не оказался в этой кроличьей норе!


Интересные вопросы для изучения

Обновление Spring boot 3 — java.lang.NoSuchMethodErrorПочему ApplicationProperties имеет значение null во время @PostConstruct в моем приложении Vaadin Spring Boot?Устаревшие методы Java не отображаются зачеркиванием в коде Visual StudioВозможно ли удаление мертвого кода из двоичных файлов опубликованных артефактов? Будет ли это мешать разрешению зависимостей нижестоящего уровня?Учитывая список и диапазон, найдите сумму на основе нового списка за меньшее времяФильтрация строк по номеру строки и разделению по столбцам и бизнес-логикеСоздание пакета PL/SQL, содержащего функцию, которая возвращает неработающую таблицуДиалект JPA данных Spring boot 3.3 для базы данных Oracle 21cОшибка ORA-01422, возникающая при выполнении хранимой процедуры из задачи сценария SSIS, однако она выполняется успешно при запуске из SQL DeveloperORA-22922: несуществующее значение LOB в Oracle 18c при получении значений CLOB из скалярного подзапроса