Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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
如何获取存储在Oracle数据库中的Java类的模式_Java_Oracle - Fatal编程技术网

如何获取存储在Oracle数据库中的Java类的模式

如何获取存储在Oracle数据库中的Java类的模式,java,oracle,Java,Oracle,我有一个Oracle数据库应用程序,由几种类型的对象组成,例如表、PL/SQL包和Java类。这些对象需要安装在同一架构中,但架构的实际名称不是固定的。 假设我想在Java中的一个表上运行一个查询 应用程序可以由架构所有者以外的其他用户调用,因此安装架构不是会话的默认架构。因此,我需要在表名前面加上安装模式的前缀。有没有一种方法可以从类中的一个方法获得“这个类安装在哪个模式中?”问题的答案 由于所涉及的对象数量众多,而且大多数对象对应用程序是私有的,因此在每个应用程序用户(或公共用户)的模式中创

我有一个Oracle数据库应用程序,由几种类型的对象组成,例如表、PL/SQL包和Java类。这些对象需要安装在同一架构中,但架构的实际名称不是固定的。 假设我想在Java中的一个表上运行一个查询

应用程序可以由架构所有者以外的其他用户调用,因此安装架构不是会话的默认架构。因此,我需要在表名前面加上安装模式的前缀。有没有一种方法可以从类中的一个方法获得“这个类安装在哪个模式中?”问题的答案

由于所涉及的对象数量众多,而且大多数对象对应用程序是私有的,因此在每个应用程序用户(或公共用户)的模式中创建同义词不是一个选项

我得出了以下结论: 作为安装脚本的一部分,我有以下命令:

create or replace java resource named "inst.properties" using clob
select to_clob('InstSchema='||sys_context('userenv','current_schema')) from dual;
/
然后,我可以使用给定类的类加载器将该资源加载到
Properties
对象中,并使用该对象获取安装时使用的模式。这是一个难题,因为它可能会失效,例如,有人导出架构并使用新名称导入,而不更新属性文件


上面的混乱之所以有效,是因为与类关联的类加载器将首先查看该类的模式,从而获取该模式中的资源。因为类装入器可以做到这一点,所以必须有一种方法可以让它知道类的模式。如果有这样一种方法,那么应该有可能获得这些信息。问题是如何查询。

您的问题不清楚,但如果需要表的所有者,您可以查询所有表

例如:

select OWNER, TABLE_NAME, TABLESPACE_NAME
from ALL_TABLES
where TABLE_NAME like '%what you want%'

您的问题不清楚,但如果需要表的所有者,您可以查询所有表

例如:

select OWNER, TABLE_NAME, TABLESPACE_NAME
from ALL_TABLES
where TABLE_NAME like '%what you want%'

我知道这是一个模糊的答案,但我在这里能做的就是给你一些提示,而不需要做更多的研究

Oracle加载类的方式由类解析器在加载时指定:

因此,获取模式的一种方法是以某种方式获取解析器,并对其进行内省,以确定它首先加载了哪个模式,因为它是从定义者模式开始的

在一个特殊的表中还有一个共享类元数据的工具:

我不知道该表是如何工作的,但我猜它提供了作为系统属性的模式


从纯Java执行此操作的另一种方法是获取一个
DatabaseMetaData
对象,然后在那里查找该对象。它返回的
ResultSet
将具有模式的名称。

我知道这是一个模糊的答案,但我在这里能做的最好的事情是在没有更多研究的情况下给你一些提示

Oracle加载类的方式由类解析器在加载时指定:

因此,获取模式的一种方法是以某种方式获取解析器,并对其进行内省,以确定它首先加载了哪个模式,因为它是从定义者模式开始的

在一个特殊的表中还有一个共享类元数据的工具:

我不知道该表是如何工作的,但我猜它提供了作为系统属性的模式


从纯Java执行此操作的另一种方法是获取一个
DatabaseMetaData
对象,然后在那里查找该对象。它返回的
ResultSet
将具有模式的名称。

对此您做了什么;你的研究是什么;你在尝试什么?你考虑过使用登录触发器吗?这是一个包含许多不同应用程序的数据库。更改
当前的\u模式是不可接受的。什么数据库和Java版本?数据库11.2.0.4,Java 1.6u43。您对此做了什么;你的研究是什么;你在尝试什么?你考虑过使用登录触发器吗?这是一个包含许多不同应用程序的数据库。更改
当前的\u架构是不可接受的。什么数据库和Java版本?数据库11.2.0.4,Java 1.6u43。我不能使用该解决方案。一个数据库的应用程序可能有多个安装,例如生产版本和测试版本。我不能使用该解决方案。一个数据库的应用程序可能会有多个安装,例如生产版本和测试版本。我必须承认,我没有使用反射的经验,因此我不知道如何实现它,但这似乎是正确的方法。我必须承认我没有使用反射的经验,所以我不知道如何实现它,但这似乎是正确的方法。也许对你有用。