oracle 11g resultSet如何获取表名

时间:2013-12-18 09:05:40

标签: java sql jdbc oracle11g

我发现Oracle 11g中存在从界面(ResultSet.getMetaData().getTableName(int column));获取表名的问题

它总是显示空字符串。

oracle数据库或jdbc驱动程序有什么问题吗?如果jdbc驱动程序有问题,我可以使用另一个jdbc驱动程序来解决此问题吗?

提前致谢!

4 个答案:

答案 0 :(得分:8)

根据documentation,不支持:

  

但没有实现getSchemaNamegetTableName方法,因为Oracle数据库不能使这个可行

Earlier Oracle drivers确实有此功能,但由于其性能影响,需要明确启用它。据我所知,从文档中可以看出,在最近的驱动程序中已不再可用。

答案 1 :(得分:0)

答案 2 :(得分: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了解详情。

答案 3 :(得分: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;
}