2014-05-16 50 views
1

我有一個表與外鍵到另一個表中的唯一列。我可以看到外鍵被正確定義,但是當我嘗試使用下面提到的使用JDBC的代碼來獲得它時,我沒有看到它。我已經驗證過,當外鍵引用另一個表的主鍵時,這會起作用。從Oracle使用JDBC獲取所有外鍵唯一索引

所以我的問題是「如何使用JDBC在Oracle中獲得唯一索引列的外鍵?」

ResultSet rset = databaseMetaData.getImportedKeys(null, dbName, tableName); 

while(rset.next()){ 
    String column_name = rset.getString("FKCOLUMN_NAME"); 
    String pk_table = rset.getString("PKTABLE_NAME"); 
    String pk_column = rset.getString("PKCOLUMN_NAME"); 
    String constraint_name = rset.getString("FK_NAME"); 

    System.out.println(column_name + " ==> " + pk_column + "(TBL:" + pk_table + ")(CN:" + constraint_name + ")"); 
} 
rset.close(); 

附加信息:有人曾用getCrossReference建議,但與問題是,我需要知道引用約束的源和目標表事先我不知道。 另外我正在尋找一種純粹的jdbc api解決方案,它不使用任何特殊的Oracle模式或查詢。我的應用程序處理多個數據庫,但我試圖將它隱藏在一層通用jdbc api後面。

+0

嗨米克我有同樣的問題,我試圖從一個給定的主鍵獲取所有的外鍵和他們的表來知道表之間的關係,你有沒有發現足夠好的東西? –

回答

0

我會建議你的情況下,你使用目錄的意見。在Oracle目錄視圖你會發現所有描述Oracle數據庫中的元數據:

http://www.oracle.com/pls/db92/db92.catalog_views

例如,爲了從某個表中的所有外鍵:

select * from all_constraints constraints where constraints.table_name = 'MY_TABLE' and constraints.constraint_type = 'R' 

有更深和更好的答案在這裏:

Oracle get foreign keys

+0

雖然我認爲你的答案,我正在尋找一個純粹的jdbc API解決方案。我的應用程序處理多個數據庫,但我將它隱藏在通用jdbc api層後面。 – MickJ

+0

然後,我會重申您的問題,如果您不介意將「Oracle」標記帶走 –

+0

我之所以保留「Oracle」的原因是因爲同一api會返回MySql或PostgreSQL的所有外鍵,但我可以看到爲什麼人們追隨'Oracle'標籤可能會發現有點誤導。 – MickJ

0

使用getCrossReference從JDBC大tabaseMetaData將是首選的解決方案。使用null"%"作爲參數parentTable將列出指定的foreignTable的所有外鍵。

但是,在看了getCrossReferenceOracle JDBC driver API之後,似乎Oracle驅動程序沒有指定引用唯一鍵的外鍵將被列出。我試了一下,可悲的是,似乎沒有辦法僅使用純JDBC API獲取所有外鍵的列表。你只能得到一個引用主鍵的外鍵列表