2016-05-30 111 views
1

我想在一個ArrayList(例如)一個完整的列表與另一個表引用的表,這是由其他表引用。List或ArrayList引用和引用表與Java和SQL和Oracle

我正在尋找一個具有條目(我想查找的表)和結果(ArrayList)的Java函數。

的函數的頭會是這樣的:

private static ArrayList<String> name_tables (String table) { ... } 

而且我希望該函數返回我table被另一個表和table引用其他表所引用的表的列表。它將類似於包含table的外鍵和table具有其他表的外鍵。

我如何在Java中使用Oracle實現它?

+0

您正在尋找['getImportedKeys()']( HTTP:// docs.oracle.com/javase/8/docs/api/java/sql/DatabaseMetaData.html#getImportedKeys-java.lang.String-java.lang.String-java.lang.String-)和['getExportedKeys()' ](http://docs.oracle.com/javase/8/docs/api/java/sql/DatabaseMetaData.html#getExportedKeys-java.lang.String-java.lang.String-java.lang.String-) –

+0

但我不想要表的外鍵或主鍵,我想要包含它的表的名稱,並且我沒有foreigns或主鍵,我只有一個表的名稱 – WhiteShadow

+0

那些調用** do **返回表名,請仔細閱讀JavaDocs。這是唯一可以返回這些信息的Java API。如果你不想這樣做,你需要創建自己的查詢,從'all_constraints'中獲取這些信息。 –

回答

2

甲骨文設置

CREATE TABLE test.parent_table (
    id INT PRIMARY KEY 
); 

CREATE TABLE test.child_table (
    id  INT PRIMARY KEY, 
    parent_id INT REFERENCES parent_table (id), 
    prev_id INT REFERENCES child_table (id) 
); 

的Java代碼

import java.sql.Connection; 
import java.sql.DatabaseMetaData; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 

public class DescribeDB { 
    public static void main(String[] args) 
    { 
    try{ 
     Class.forName("oracle.jdbc.OracleDriver"); 

     Connection con = DriverManager.getConnection(
         "jdbc:oracle:thin:@localhost:1521:XE", 
         "username", 
         "password" 
         ); 

     DatabaseMetaData md = con.getMetaData(); 

     ResultSet rs = md.getImportedKeys(
          con.getCatalog(), 
          "TEST", 
          "CHILD_TABLE" 
         ); 

     while (rs.next()) { 
     System.out.println(
      String.format(
       "%s.%s.%s references %s.%s.%s", 
       rs.getString("FKTABLE_SCHEM"), 
       rs.getString("FKTABLE_NAME"), 
       rs.getString("FKCOLUMN_NAME"), 
       rs.getString("PKTABLE_SCHEM"), 
       rs.getString("PKTABLE_NAME"), 
       rs.getString("PKCOLUMN_NAME") 
      ) 
     ); 
     } 
    } catch(ClassNotFoundException | SQLException e) { 
     System.out.println(e); 
    } 
    } 
} 

輸出

TEST.CHILD_TABLE.PREV_ID references TEST.CHILD_TABLE.ID 
TEST.CHILD_TABLE.PARENT_ID references TEST.PARENT_TABLE.ID 
+0

非常感謝你的代碼!這對我來說是非常有幫助的!只有一件事,會有另一件事情以迭代的方式做到這一點?我放了一張表,然後檢查表,我把第一個和第二個表引用到它的表中,第三個表引用了另一個表,並且如此連續 – WhiteShadow

+0

只需將上面的功能包裝在一個輔助函數中(您可以保持相同的連接查詢),每次調用返回一個模式和表名對的列表,然後維護這些對的數據結構(列表/堆棧/等),並對該結構執行深度(或寬度)首次搜索。你只需要確保你不會訪問同一個表兩次,否則你可能會以無限循環結束。 – MT0

+0

再次感謝。我對Java非常笨拙......你能粗略地列出一個我必須實現的函數的例子嗎? – WhiteShadow