Java oracle 11g结果集如何获取表名

Java oracle 11g结果集如何获取表名,java,sql,jdbc,oracle11g,Java,Sql,Jdbc,Oracle11g,我发现在从接口(ResultSet.getMetaData().getTableName(int column))获取表名的Oracle11g中存在一些问题 它总是显示空字符串 oracle数据库或jdbc驱动程序是否有问题?如果是jdbc驱动程序的问题,我可以用另一个jdbc驱动程序来解决这个问题吗 提前谢谢 请查看您可以使用的以下内容: DatabaseMetaData metadata = currentConnection.getMetaData(); String[] names =

我发现在从接口
(ResultSet.getMetaData().getTableName(int column))获取表名的
Oracle11g
中存在一些问题

它总是显示空字符串

oracle数据库或jdbc驱动程序是否有问题?如果是jdbc驱动程序的问题,我可以用另一个jdbc驱动程序来解决这个问题吗


提前谢谢

请查看您可以使用的以下内容:

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");
}
请阅读以了解更多信息。

根据不支持此选项:

但是没有实现
getSchemaName
getTableName
方法,因为Oracle数据库无法实现这一点


确实有此功能,但由于其性能影响,需要显式启用它。从文档中我可以看出,这在最近的驱动程序中不再可用。

在几天前遇到这个特定的问题后,我终于想出了一个解决方案。当然它既不漂亮也不。。。好。。。什么都可以,但它是有效的

基本上,我根据结果集中的列检查数据库中的每个表

我希望其他人能用这个。我花了大约一天的时间才弄清楚

注意:我使用CachedRowSet而不是ResultSet,这不需要我一直保持数据库连接打开




可以显示代码吗,ResultSet界面没有getTableName oops,我重新编辑我的帖子
getTableName()
只是没有在Oracle JDBC驱动程序中实现。如果可能的话,显示完整的代码?我似乎走到了死胡同。谢谢你的帮助!顺便说一下,我喜欢mysql!似乎无能为力,我使用getCatalogName(int列)进行测试;还返回了空字符串。这不是对
ResultSetMetaData.getTableName()
-
getTableName()
的替换。它应返回查询列的基础表
getTables()
无法帮助您找出查询列属于哪个表。同意。但是正如您所提到的,
getTableName()
并没有在Oracle JDBC驱动程序中实现。这样做效率不高,但在表及其列之间循环可能是唯一的方法。我希望有人发布一个更好的方法来做到这一点。非常感谢你!你帮我省了很多时间来解决这个问题。。。我想我应该忽略这个问题。我没有足够的声望投票支持你!非常抱歉。
 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;
}