はい、私は知ってDatabaseMetadata.getIndexInfo
いますが、それは私が望むことをしていないようです。
A
2つのユーザー/スキーマがあります。それらをとと呼びましょうB
。
A
と呼ばれるテーブルがありますTAB
。ユーザーB
がにインデックスを作成しました。A.TAB
そのインデックスを呼び出しましょうIND
。
私が必要とする情報は次のとおりです。TAB
スキーマのテーブルにあるインデックスA
(別名、所有者A
)。インデックスの所有者は気にせず、特定のテーブルにあるだけです。
実験してみるとgetIndexInfo
、次のことがわかりました。
- 最初の引数
catalog
は、OracleJDBCドライバーによって完全に無視されているようです。 - 2番目の引数は、返されるテーブル統計とインデックスの所有者を
schema
制限します unique
そしてapproximate
(大まかに)彼らがすべきことをします(与えることapproximate=false
は実際に更新統計ステートメントを実行することを除いて)。
JDBCドライバーが実行するSQLをトレースするとgetIndexInfo(null, "A", "TAB", false, true)
、次のようになります。
select null as table_cat,
owner as table_schem,
table_name,
0 as NON_UNIQUE,
null as index_qualifier,
null as index_name, 0 as type,
0 as ordinal_position, null as column_name,
null as asc_or_desc,
num_rows as cardinality,
blocks as pages,
null as filter_condition
from all_tables
where table_name = 'TAB'
and owner = 'A'
union
select null as table_cat,
i.owner as table_schem,
i.table_name,
decode (i.uniqueness, 'UNIQUE', 0, 1),
null as index_qualifier,
i.index_name,
1 as type,
c.column_position as ordinal_position,
c.column_name,
null as asc_or_desc,
i.distinct_keys as cardinality,
i.leaf_blocks as pages,
null as filter_condition
from all_indexes i, all_ind_columns c
where i.table_name = 'TAB'
and i.owner = 'A'
and i.index_name = c.index_name
and i.table_owner = c.table_owner
and i.table_name = c.table_name
and i.owner = c.index_owner
order by non_unique, type, index_name, ordinal_position
あなたが両方 を見ることができるように、table_name
そして i.owner
あることに制限されていTAB
ます。これは、このクエリがテーブルと同じユーザーが所有するインデックス情報のみを返すことを意味します。
私は3つの可能な回避策を考えることができます:
- 常に同じスキーマにインデックスとテーブルを作成します(つまり、同じ所有者を持たせます)。残念ながら、それは常にオプションではありません。
schema
に設定してクエリを実行しnull
ます。これは、2つのスキーマに同じテーブル名が含まれるとすぐに醜くなります(特定のスキーマがどのテーブル(つまり、どのテーブル所有者)にあるかを知る方法がないため)。- そのSQLを直接実行します(を使用して
executeQuery()
)。どうしてもやむを得ない場合を除いて、このレベルに落ちたくない。
これらの回避策はどれも私には特に喜ばしいものではありませんが、他に何も機能しない場合は、SQLの直接実行にフォールバックする必要があるかもしれません。
データベースとJDBCドライバーの両方が11.2.0.2.0にあります。
つまり、基本的に私の質問は次のとおりです。
- これはJDBCドライバーのバグですか、それとも私が気付いていないロジックが背後にありますか?
- Oracleに必要な情報を提供してもらうための、シンプルで合理的に移植可能な方法はありますか?