我正在尝试使用DatabaseMetaData.getTables()方法获取所有数据库表。但是这种方法需要数据库模式名称模式。是否可以获取当前数据库连接的模式名称?
答案 0 :(得分:9)
当前连接的标准架构是您用于登录的用户的名称。因此,如果您的用户为SCOTT
,则必须使用SCOTT
作为DatabaseMetaData.getTables()
。
您可以通过DatabaseMetaData.getUserName()
获取用户名。
但请记住,在JDBC驱动程序中完成的模式/用户名的比较是区分大小写的,通常用户名是大写的。
我并非100%确定DatabaseMetaData.getUserName()
是否会在所有情况下都以正确的方式返回名称。当然,您可能希望在使用该值之前执行upperCase()。
答案 1 :(得分: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 :(得分:2)
自Java 7起,Connection
采用getSchema
方法:https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html#getSchema--
答案 3 :(得分:2)
不幸的是,没有一致的解决方案。如果John可以访问Sally.Table ...,查询将起作用,但getUserName()将返回John而不是Sally模式。对于Oracle,用户拥有自己的架构,而其他人则可以访问,该用户ID是该连接上的 default 架构。
此外,getSchemaName()和getCatalog()均不会返回架构名称。
@horse_with_no_name对于Oracle来说是最接近的答案,因为给定的用户名是(默认)架构名称,除非在对象引用中被覆盖,如图所示。
对于其他数据库,相同的规则并不一致。
答案 4 :(得分:1)
您可以使用
获取架构名称Connection conn =
DriverManager.getConnection("jdbc:oracle:thin:@server:port:SID",prop);
DatabaseMetaData databaseMetaData = conn.getMetaData();
System.out.println("schema name >>>> "+databaseMetaData.getUserName());