Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用oracle jdbc连接时如何获取数据库架构名称?_Java_Oracle_Jdbc - Fatal编程技术网

Java 使用oracle jdbc连接时如何获取数据库架构名称?

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

我正在尝试使用DatabaseMetaData.getTables()方法获取所有db表。但此方法需要数据库模式名模式。是否可以获取当前数据库连接的架构名称?

尝试使用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;

    }
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来说,这显然是不一致的。