Oracle ResultSet Metadata Получить точность/getScale
Вопрос
Я использую тонкий драйвер 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, как описано в Обратный инжиниринг модели данных.Я использовал его в своей утилите для экспорта такой информации в текст