2013-08-31 7 views
3

Метод getColumns() в метаданных возвращает пустой ResultSet для синонимов (для таблиц и представлений он правильно возвращает список столбцов).DatabaseMetaData.getColumns возвращает пустой ResultSet для синонимов

Это происходит в Oracle 11g Express и используется последний драйвер JDBC Oracle (11.2.3).

Это происходит и для других SQL-серверов?

Любая помощь/идеи для решения этой проблемы приветствуются.

+0

Вы вызываете resultetmetadataobject.getColumns() в результатах или снаружи? – SpringLearner

+0

openConnection.getMetaData(), а затем metaData.getColumn (...) – ic3

+0

Он не должен давать пустой набор результатов, если доступна схема. Проведите свой код здесь. Что вы передаете как аргументы getColumns() – Prabhaker

ответ

9

По умолчанию драйверы Oracle не возвращает информацию о синонимов в getColumns(). Это описано в руководстве Oracle 11g JDBC разработчика под Performance Extensions:

Соображения для getColumns

По умолчанию метод getColumns не извлекает информацию о столбцах, если указан синоним. Чтобы включить поиск информации, если указан синоним, вы должны вызвать метод setIncludeSynonyms на связи следующим образом:

((oracle.jdbc.driver.OracleConnection)conn).setIncludeSynonyms(true) 

Это заставит все последующие getColumns метод вызывает на связь, чтобы включить синонимы. Это похоже на setRemarksReporting. Кроме того, вы можете установить свойство соединения includeSynonyms. Это похоже на свойство соединения remarksReporting.

Однако имейте в виду, что если значение includeSynonyms истинно, тогда имя объекта, возвращаемого в столбце table_name, будет именем синонима, если существует синоним. Это верно, даже если вы передадите имя таблицы getColumns.

Обратите внимание, что этот последний пункт очень важен, чтобы иметь в виду!

+0

работает как шарм, приветствия – ic3

+0

Это тоже касается Oracle 12c тоже? Кажется, это не работает! –

+0

@BPavanKumar Честно говоря, я не знаю. Я не так сильно использую Oracle. –

1

использовать этот способ

PreparedStatement pt=coneection.preparestatement("select * from table_name"); 
Resultset rs=pt.executeQuery(); 
ResultsetMetaData rsmd=rs.getMetaData(); 
System.out.println(rsmd.getColumnName(coulmn_number)); 
System.out.println(rsmd.getColumnType(column_number)); 

Другой способ

PreparedStatement pt=coneection.preparestatement("select * from table_name"); 
    Resultset rs=pt.executeQuery(); 
    ResultsetMetaData rsmd=pt.getMetaData(); 
    System.out.println(rsmd.getColumnName(coulmn_number)); 
    System.out.println(rsmd.getColumnType(column_number)); 
+0

спасибо, но как насчет COLUMN_SIZE, DECIMAL_DIGITS? – ic3

Смежные вопросы