Oracle ResultSetMetaData getPrecision / getScale - PullRequest
3 голосов
/ 11 сентября 2009

Я использую тонкий драйвер Oracle JDBC (10.2.0.3) для подключения к базе данных Oracle 10g. Я хотел бы получить информацию о столбцах базы данных, поэтому я использую ResultSetMetaData . Наиболее важная информация, которая мне нужна, - это тип столбца и его длина, поэтому я использую методы getColumnType , getPrecision и getScale .

Работает для простого запроса (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 была бы отличной. Где-нибудь есть такая документация?

Ответы [ 6 ]

1 голос
/ 13 марта 2014

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

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

select CAST (count(*) AS NUMBER(30))
1 голос
/ 27 ноября 2012

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

1 голос
/ 16 сентября 2009

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

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

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

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

1 голос
/ 11 сентября 2009

Допустима шкала 0: НОМЕР (5) совпадает с НОМЕРОМ (5,0)

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

1 голос
/ 11 сентября 2009

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

0 голосов
/ 11 сентября 2009

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

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

...