2016-05-30 7 views
1

他のテーブルが参照するテーブルで完全リストを取得しようとしています。これは他のテーブルによって参照されています。JavaおよびSQLとOracleを使用した参照テーブルと参照テーブルのリストまたは配列リスト

私は、Javaで検索するテーブル(見つけたいテーブル)と結果(ArrayList)を持つ関数を探しています。

関数のヘッダはこのようなものになるだろう:

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

そして私は機能は私にtableは別のテーブルやtable参照他のテーブルで参照されるテーブルのリストを返すことをしたいです。それはtableの外部キーとtableの他のテーブルの外部キーを含むテーブルのようになります。

JavaでJavaを実装する方法は?

+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

しかし、私はテーブルの外部キーまたはプライマリキーを必要としません、私はそれを含むテーブルの名前が欲しい、私は外国人またはプライマリキーを持っていない、私は1つのテーブルの名前を持っている – WhiteShadow

+0

これらの呼び出し**は**テーブルの名前を返す、JavaDocsを慎重に読んでください。そのような情報を返すことができる唯一のJava APIです。あなたが望んでいなければ、 'all_constraints'からその情報を取得する独自のクエリを作成する必要があります –

答えて

2

Oracleのセットアップ

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

あなたのコードにはありがとう!それは私のために非常に役立ちます!ただ一つのことだけが、反復的なやり方でこれをする別のことがありますか?私はテーブルを置くと、これは私が最初に参照してテーブルを参照し、2番目に参照するテーブルと3番目にそれが参照してcontinuosly別のテーブル – WhiteShadow

+0

ちょうどヘルパー関数で上の機能をラップ(あなたは同じ接続を維持することができますこれらのペアのデータ構造(リスト/スタック/ etc)を維持し、構造の深さ(または幅)の最初の検索を実行します。同じテーブルを2度訪れないようにする必要があります。そうしないと、無限ループに終わる可能性があります。 – MT0

+0

もう一度ありがとうございます。私はJavaには非常に不器用です...私が実装しなければならない機能の例を大まかに説明できますか? – WhiteShadow

関連する問題