Java 使用oracle jdbc连接时如何获取数据库架构名称?
我正在尝试使用DatabaseMetaData.getTables()方法获取所有db表。但此方法需要数据库模式名模式。是否可以获取当前数据库连接的架构名称?尝试使用getCatalogs()。这是一份速写稿Java 使用oracle jdbc连接时如何获取数据库架构名称?,java,oracle,jdbc,Java,Oracle,Jdbc,我正在尝试使用DatabaseMetaData.getTables()方法获取所有db表。但此方法需要数据库模式名模式。是否可以获取当前数据库连接的架构名称?尝试使用getCatalogs()。这是一份速写稿 public List<String> getDatabases(DBEnv dbEnv) { Connection conn = getConnection(dbEnv); List<String> resultSet = n
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;
}
publicslist-getDatabases(DBEnv-DBEnv){
连接conn=getConnection(dbEnv);
List resultSet=new ArrayList();
试一试{
DatabaseMetaData=conn.getMetaData();
ResultSet res=metaData.getCatalogs();
while(res.next()){
resultSet.add(res.getString(“TABLE_CAT”);
}
}捕获(SQLE异常){
logger.error(例如toString());
}
返回结果集;
}
当前连接的标准模式是用于登录的用户的名称。因此,如果您的用户是SCOTT
,则必须将SCOTT
用于DatabaseMetaData.getTables()
您可以通过DatabaseMetaData.getUserName()
获取用户名
但是请记住,在JDBC驱动程序中进行的模式/用户名比较是区分大小写的,通常用户名是大写的
我不能100%确定
DatabaseMetaData.getUserName()
是否会在所有情况下以正确的大小写返回名称。当然,在使用该值之前,您可能需要先执行大写()操作。您可以使用
Connection conn =
DriverManager.getConnection("jdbc:oracle:thin:@server:port:SID",prop);
DatabaseMetaData databaseMetaData = conn.getMetaData();
System.out.println("schema name >>>> "+databaseMetaData.getUserName());
由于Java7,
Connection
有一个getSchema
方法:不幸的是,没有一致的解决方案。如果约翰能找到莎莉的桌子。。。查询将正常工作,但getUserName()将返回John而不是Sally模式。对于Oracle,用户拥有自己的模式,而其他人可以访问,该用户ID是该连接上的默认模式
此外,getSchemaName()和getCatalog()都不会返回架构名称
@horse_with_no_name是Oracle最接近的答案,因为给定的用户名是(默认)模式名,除非在对象引用中被覆盖,如图所示
对于其他数据库,相同的规则并不一致。你说得对。我要查找的模式id名称为大写的用户名字符串。由于模式/用户名区分大小写,为什么Oracle将用户名存储为大写???@CKLee:因为SQL标准要求标识符折叠为大写,所以非引号的标识符在Oracle中存储为大写。本例中区分大小写的原因是,后台的JDBC驱动程序执行类似于
where owner=?
的操作,并且该比较是区分大小写的(与其他字符串比较一样)。作为标识符一部分的用户名不区分大小写select*from SCOTT.foobar
与select*from SCOTT.foobar
相同,我现在正在处理不同数据库的DDL层。Oracle的行为使我无法概括我的实现。要强制Oracle使用原始大小写存储用户名吗?@CKLee:没有单一的解决方案:一些DBMS使用大写、小写和混合大小写存储用户名。有些在比较字符串时区分大小写,有些不区分大小写,有些有时区分大小写。有些始终独立于操作系统和安装选项工作,对于某些人来说,这种行为取决于配置或操作系统。不知道为什么,但结果集是空的。@ThaiTran你知道为什么该方法被称为getCatalogs而不是GetSchema吗?@johnny-b-goode-如果你同时发现了原因:)-是DB对该方法进行了不同的解释?我的意思是,它可以在MySql上工作,但在Oracle或其他类型的DB上,它可能会返回其他类型的对象(我在阅读时遇到这个提示),这是一个很好的调用,但是。。。至少在MySQL(v5.7.x)[Connection].getSchema()上返回null-即使该架构是在连接字符串上定义的。MySQL将其解释为数据库实例ID的方式稍有不同,显然没有将其转换为适合JDBC的数据模型(catalog/schema/{object})。。。有人会认为“getSchema()”将返回模式,“getUserName()”等将返回与用户、数据库实例ID和模式的公共模型相关联的预期数据,但。。。唉,对于Oracle和MySQL来说,这显然是不一致的。