使用oracle jdbc连接时如何获取数据库模式名称?

问题描述 投票:8回答:5

我试图使用DatabaseMetaData.getTables()方法获取所有数据库表。但是这种方法需要数据库模式名称模式。是否可以获取当前数据库连接的模式名称?

java oracle jdbc
5个回答
9
投票

当前连接的标准模式是您用于登录的用户的名称。因此,如果您的用户是SCOTT,则必须使用SCOTT来表示DatabaseMetaData.getTables()

您可以通过DatabaseMetaData.getUserName()获取用户名。

但请记住,在JDBC驱动程序中完成的模式/用户名的比较是区分大小写的,通常用户名是大写的。

我不是100%确定DatabaseMetaData.getUserName()是否会在所有情况下都以正确的方式返回名称。可以肯定的是,您可能希望在使用该值之前执行upperCase()。


3
投票

尝试使用getCatalogs()。这是一个快速草案

  public List<String> getDatabases(DBEnv dbEnv) {

        Connection conn = getConnection(dbEnv);
        List<String> resultSet = new ArrayList<String>();

        try {
            DatabaseMetaData metaData = conn.getMetaData();
            ResultSet res = metaData.getCatalogs();

            while (res.next()) {
                resultSet.add(res.getString("TABLE_CAT"));
            }

        } catch (SQLException e) {
            logger.error(e.toString());
        }

        return resultSet;

    }

2
投票

自Java 7以来,Connection有一个getSchema方法:https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html#getSchema--


2
投票

不幸的是,答案是没有一致的解决方案。如果John有权访问Sally.Table ...查询将起作用,但getUserName()将返回John而不是Sally模式。对于Oracle,用户拥有其架构,而其他人可能具有访问权限,该用户ID是该连接上的默认架构。

此外,getSchemaName()和getCatalog()都不会返回模式名称。

@horse_with_no_name具有最接近Oracle的答案,因为给定的用户名是(默认)模式名称,除非在对象引用中被覆盖,如图所示。

对于其他数据库,相同的规则不一致。


1
投票

您可以使用获取模式名称

Connection conn = 
DriverManager.getConnection("jdbc:oracle:thin:@server:port:SID",prop);    
DatabaseMetaData databaseMetaData = conn.getMetaData();
System.out.println("schema name >>>> "+databaseMetaData.getUserName());
© www.soinside.com 2019 - 2024. All rights reserved.