Вопрос

Я использую тонкий драйвер Oracle JDBC (10.2.0.3) для подключения к базе данных Oracle 10g.Я хотел бы получить информацию о столбцах базы данных, поэтому я использую Результирующий набор данных.Самая важная информация, которая мне нужна, - это тип столбца и длина, поэтому я использую getColumnType Получить ColumnType, Получить точность, и Получить масштаб методы.

Это работает для простого запроса (select * from tablename) если тип столбца "простой", например VARCHAR2(50), NUMBER(5), NUMBER(6,2).Если у меня есть более сложный запрос (select count(*) from tablename) или запрос, основанный на представлении, которое содержит некоторые сложные вычисления, методы дают странные результаты, такие как:

  • getScale: -127
  • и то, и другое getPrecision и getScale равно 0
  • getPrecision: -1

Установка oracle.jdbc.J2EE13Compliant свойство подключения к true (как предложено несколькими веб-страницами) устраняет getScale=-127, но все равно возвращает результат 0/0.

Скорее всего, мне придется создать обходной путь для этих странных результатов, но сначала мне нужна хотя бы исчерпывающая документация о поведении Oracle ResultSetMetaData.Например, огромная таблица со значением getPrecision / getScale для всех типов SQL была бы отличной.Есть ли где-нибудь подобная документация?

Это было полезно?

Решение

Oracle не может возвращать тип, основанный на представлении или count(*) поскольку это не было явно заявлено.Ваше представление может возвращать любую точность или масштаб в зависимости от нижележащих таблиц представления.

Чтобы преодолеть это, вам нужно было бы привести тип в вашем запросе или представлении следующим образом:

select CAST (count(*) AS NUMBER(30))

Другие советы

Альтернативой является запрос user_tab_columns или all_tab_columns.

Шкала, равная 0, является приемлемой:число (5) совпадает с ЧИСЛОМ (5,0).

Однако точность должна быть целым числом от 1 до 38, когда она определена.Когда оно не определено, как в NUMBER, драйвер должен что-то вернуть, поскольку он не может вернуть null.В этом случае драйвер выбирает возврат 0.

Мне кажется, что нет исчерпывающей документации по ResultSetMetaData.Руководство и справочник разработчика Oracle® Database JDBC 10g Release 2 (10.2) и 11g Выпуск 2 (11.2) приведен пример с именем и типом столбца здесь, они не касаются других аспектов.

Кто-то был аналогичная проблема с PostgreSQL много лет назад, и он сделал патч.Возможно, Oracle использует здесь ту же кодовую базу.

Вы можете попробовать использовать ojdbc14_g.jar вместо ojdbc14.jar поскольку его классы были скомпилированы с помощью "javac -g" и содержат некоторую информацию об отслеживании.

Вы также можете попробовать новые драйверы.

Вы можете использовать rs.getBigDecimal(columnIndex) и из большого десятичного числа вы можете получить значения точности / масштаба конкретных столбцов.

Не прямой ответ на ваш вопрос, а обходной путь, о котором вы упомянули:

Если все, что вам нужно сделать, это проверить или сравнить схемы БД, то вместо ResultSetMetaData и запроса всех таблиц используйте Oracle schema information, как описано в Обратный инжиниринг модели данных.Я использовал его в своей утилите для экспорта такой информации в текст

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top