2013-12-18 2 views
3

я нашел есть некоторые проблемы в Oracle 11g, чтобы получить имя таблицы из интерфейса (ResultSet.getMetaData().getTableName(int column));оракул 11g Resultset как получить имя таблицы

Он всегда показывает пустую строку.

Есть что-то неправильно для базы данных oracle или драйвера jdbc? Если проблема драйвера jdbc, могу ли я получить другой драйвер jdbc для решения этой проблемы?

Заранее благодарен!

+1

Можете ли вы показать код, интерфейс ResultSet не имеет getTableName http://download.java.net/jdk8/docs/ api/java/sql/ResultSet.html – SpringLearner

+0

oops, я повторно редактирую свой пост! – eingmarra

+1

'getTableName()' просто не реализован в драйвере JDBC Oracle. –

ответ

7

Согласно documentation это не поддерживается:

, но не реализует getSchemaName и getTableName методы, поскольку Oracle Database не делает эту посильную

Earlier Oracle drivers ли имеют эту функцию, но должен быть включен явно из-за его последствий для производительности. Насколько я могу судить по документации, это больше не доступно в более поздних драйверах.

+0

Огромное спасибо! Вы экономите меня много времени, чтобы разобраться ... Я думаю, что я должен пройти эту проблему. У меня недостаточно репутации, чтобы проголосовать за вас! Так жаль. – eingmarra

0

Вы могли бы использовать:

DatabaseMetaData metadata = currentConnection.getMetaData(); 
String[] names = {"TABLE"}; 
ResultSet tables = metadata.getTables(null,"%", "%", names); 
while (tables.next()) { 
    String tableName = tables.getString("TABLE_NAME"); 
    String tableSchema = tables.getString("TABLE_SCHEM"); 
} 
ResultSet columns = metadata.getColumns(null, "%", tableName, "%"); 
while (columns.next()) { 
    String columnName = columns.getString("COLUMN_NAME"); 
    String datatype = columns.getString("TYPE_NAME"); 
    int datasize = columns.getInt("COLUMN_SIZE"); 
    int nullable = columns.getInt("NULLABLE"); 
} 

Читать this для получения дополнительной информации.

+2

Это не замена 'ResultSetMetaData.getTableName()' - 'getTableName()' должна возвращать базовую таблицу столбца запроса. 'getTables()' не поможет вам узнать, к какой таблице принадлежит столбец запроса. –

+0

Согласовано.Но, как вы уже упоминали, 'getTableName()' просто не реализован в драйвере JDBC Oracle. Это неэффективно, но цикл через таблицы и их столбцы, вероятно, единственный способ сделать это. Я надеюсь, что у кого-то есть лучший способ сделать это. – atripathi

0

после того, как я столкнулся с этой специфической проблемой лицом к лицу несколько дней назад, я, наконец, придумал решение, которое выполняет эту работу. Конечно, это не красиво и ... ну ... ничего, но это работает.

В принципе, я проверить каждую таблицу в моей базе данных против столбцов в ResultSet.

Я надеюсь, что кто-то еще сможет это использовать. Принял меня за день, чтобы понять это прямо.

Примечание: Я использую CachedRowSet вместо ResultSet, который не требует от меня постоянного открытия соединения с базой данных.



private static String getTableNameByCols(ResultSetMetaData rsmd, DatabaseMetaData dbmd) throws SQLException{ 

    String errorString = "No matching table found for the given column Set"; 
    String ret = null, origColName, origDatatype, tableName; 
    String[] names = {"TABLE"}; 

    ResultSet tables = dbmd.getTables(null, username, "%", names); 

    // get all the columns out of the rsmd and put them into an Array 
    Integer numberOfColumns = rsmd.getColumnCount(); 
    String[] origColNames = new String[numberOfColumns+1]; 
    String[] origColTypeNames = new String[numberOfColumns+1]; 

    for (int i=1; i<numberOfColumns+1; i++){ 
     origColNames[i] = rsmd.getColumnName(i); 
     origColTypeNames[i] = rsmd.getColumnTypeName(i); 
    } 

    ResultSet columns = null; 
    while (tables.next()) { 

     tableName = tables.getString("TABLE_NAME"); 
     columns = dbmd.getColumns(null, null, tableName, null); 
     CachedRowSet crs = new CachedRowSetImpl(); 
     crs.populate(columns); 

     Integer tablesNumberOfColumns = crs.size(); 

     int i = 1; 

     if (numberOfColumns.intValue() == tablesNumberOfColumns.intValue()){ 

      while (crs.next()) { 

       origColName = origColNames[i]; 
       origDatatype = origColTypeNames[i]; 

       String colName = crs.getString(4); 
       String datatype = crs.getString(6); 
       //int datasize = columns.getInt("COLUMN_SIZE"); 
       //int nullable = columns.getInt("NULLABLE"); 
       if (origColName.equals(colName) && origDatatype.equals(datatype)){ 
        ret = tableName; 
       } else { 
        ret = null; 
       } 
       i += 1; 

      } // looked at all the columns 
      crs.close(); 

     }// same # of columns check over 

     if (ret != null) { 
      break; 
     } 

     columns.close();  
    } 

    verify(ret, errorString); 
    return ret; 
} 

Окружающий метод:

private static boolean updateLocalTable(ResultSet rs){ 

    ResultSetMetaData rsmd; 
    DatabaseMetaData dbmd; 
    String table_name; 
    boolean ret = false; 
    try { 
     rsmd = rs.getMetaData(); 
     dbmd = conn.getMetaData(); 
     table_name = getTableNameByCols(rsmd, dbmd); 

     /* ... do stuff with it ... */ 

    } catch (Exception e) { 
     print("kablooey! \n" + e.getStackTrace()); 
    } 

    return ret; 
} 
Смежные вопросы