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

时间:2016-07-29 10:21:49

标签: java oracle

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

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

由于涉及的对象数量多,并且由于大多数对象都是应用程序专用的,因此在每个应用程序用户(或公共用户)的模式中创建同义词都不是一种选择。

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

create or replace java resource named "inst.properties" using clob
select to_clob('InstSchema='||sys_context('userenv','current_schema')) from dual;
/

然后我可以使用给定类的类加载器将此资源加载到Properties对象中,并使用它来获取安装时使用的模式。这是一个kludge,因为它可能会失效,例如由某人导出架构并使用新名称导入它而不更新属性文件。

上面的kludge是有效的,因为与类关联的类加载器将首先在该类的模式中查找,从而获取该模式中的资源。由于类加载器可以做到这一点,因此必须有一种方法可以知道类的模式。如果有这样的方式,那么应该有可能获得这些信息。问题是如何。

2 个答案:

答案 0 :(得分:2)

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

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

https://docs.oracle.com/cd/B28359_01/java.111/b31225/chtwo.htm#BABGJCAJ

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

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

https://docs.oracle.com/cd/B28359_01/java.111/b31225/appendixb.htm#BGBBBJAE

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

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

答案 1 :(得分:1)

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

示例:

select OWNER, TABLE_NAME, TABLESPACE_NAME
from ALL_TABLES
where TABLE_NAME like '%what you want%'
相关问题