2016-07-29 6 views
0

Oracleデータベース・アプリケーションがあります。表、PL/SQLパッケージ、およびJavaクラスが含まれます。これらのオブジェクトは同じスキーマにインストールする必要がありますが、スキーマの実際の名前は固定されていません。 Javaからテーブルの1つに対してクエリを実行したいとしましょう。Oracleデータベースに格納されているJavaクラスのスキーマを取得する方法

アプリケーションは、スキーマ所有者以外のユーザーによって呼び出すことができるため、インストールスキーマはセッションのデフォルトスキーマではありません。したがって、テーブル名の前にインストールスキーマを付ける必要があります。 「このクラスはどのスキーマにインストールされていますか?」という質問に対する答えを得る方法はありますか?クラスのメソッドから?

オブジェクトの数が多く、それらのほとんどがアプリケーションに対してプライベートであるため、すべてのアプリケーションユーザー(またはパブリックユーザー)のスキーマに同義語を作成することは選択できません。

私は、次のその場しのぎが出ている

:インストールスクリプトの一環として、私は次のコマンドを持っている :

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

私は、その後に、このリソースをロードするために与えられたクラスのクラスローダを使用することができますPropertiesオブジェクトを作成し、それを使用してインストール時に使用されたスキーマを取得します。これは無効にされる可能性があるため、クルージングです。誰かがスキーマをエクスポートし、プロパティーファイルを更新せずに新しい名前でインポートすることができます。

上記のkludgeは、クラスに関連付けられたクラスローダがそのクラスのスキーマで最初に検索され、そのスキーマ内のリソースを取得するため機能します。クラスローダーはこれを行うことができるので、クラスのスキーマを知る方法が必要です。そのような方法があれば、その情報を得ることが可能でなければなりません。問題はどういうことか。

+0

あなたはそれについて何をしましたか?あなたの研究は何ですか?あなたの試練は何ですか? – pilkington

+0

ログイン・トリガーを使用して[エンド・ユーザーの 'current_schema'をアプリケーション・スキーマに設定する]と考えましたか(https://asktom.oracle.com/pls/apex/f?p = 100:11:0 ::: :P11_QUESTION_ID:6265422366927)? –

+0

これは多くの異なるアプリケーションを持つデータベースです。 'current_schema'の変更は受け入れられません。 –

答えて

2

をここでは、より多くの研究をすることなく、あなたにいくつかのヒントを与えています。

Oracleのクラスをロードします道はロード時にクラスのリゾルバによって指定されます。

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

だから、スキーマを取得するための1つの方法は何とかリゾルバで取得し、どれを把握するためにそれをイントロスペクトすることですそれが定義者スキーマで始まるので、最初にロードされたスキーマ。

シェアリングクラスのメタデータのための施設は、特別なテーブルでもあります:

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

私は、そのテーブルがどのように機能するか分かりませんが、私はそれがシステムプロパティとして、スキーマを提供することを推測すると思います。

純粋なJavaからそれを実行するもう1つの方法は、DatabaseMetaDataオブジェクトを取得してそこのオブジェクトを探すことです。 ResultSetそれはあなたに戻ってスキーマの名前を与えることを与える。

+0

私はリフレクションを使った経験がないことを認めなければならないので、それを実装する方法がわかりませんが、それは正しい方法です。 –

+0

[この質問](http://stackoverflow.com/questions/4385003/are-there-any-open-source-java-reflection-utilities-or-jars)が役に立つかもしれません。 – Brad

1

あなたの質問は明らかではないが、あなたがテーブルの所有者が必要な場合は、ALL_TABLES

例問い合わせることができます:私は、これはあいまいな答えですけど、私ができる最善の

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

私はその解決策を使用できません。 1つのデータベースのアプリケーションを複数インストールすることができます。生産性とテスト版です。 –

関連する問題