Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java、SQL和Oracle的引用和引用表的列表或数组列表_Java_Sql_Oracle_Arraylist - Fatal编程技术网

使用Java、SQL和Oracle的引用和引用表的列表或数组列表

使用Java、SQL和Oracle的引用和引用表的列表或数组列表,java,sql,oracle,arraylist,Java,Sql,Oracle,Arraylist,我试图在一个ArrayList(例如)中获得一个完整的列表,其中包含另一个表引用的表,而其他表引用了该列表 我正在寻找一个Java函数,它有一个条目(我要查找的表)和一个结果(ArrayList) 函数的标题如下所示: private static ArrayList<String> name_tables (String table) { ... } private static ArrayList name_表(字符串表){…} 我希望函数返回一个表列表,其中table被其他

我试图在一个ArrayList(例如)中获得一个完整的列表,其中包含另一个表引用的表,而其他表引用了该列表

我正在寻找一个Java函数,它有一个条目(我要查找的表)和一个结果(ArrayList)

函数的标题如下所示:

private static ArrayList<String> name_tables (String table) { ... }
private static ArrayList name_表(字符串表){…}
我希望函数返回一个表列表,其中
table
被其他表引用,并且
table
引用其他表。它将类似于包含
table
外键的表和
table
包含其他表外键的表


如何使用Oracle在Java中实现它?

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 )
);
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
Java代码

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 )
);
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
输出

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 )
);
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

您正在寻找,但我不想要表的外键或主键,我想要包含其的表的名称,我没有外键或主键,我只有一个表的名称。这些调用返回表的名称,请仔细阅读Javadoc。这是唯一可以返回此类信息的JavaAPI。如果您不想这样做,您需要创建自己的查询,从
所有约束中检索该信息
非常感谢您的代码!这对我很有帮助!再多做一件事,你会用另一件事来迭代吗?我放了一个表,然后检查我放在第一个和第二个表中的表,第三个是它引用的另一个表,所以继续将上面的功能包装在一个helper函数中(您可以在查询之间保持相同的连接)它在每次调用时返回模式和表名对的列表,然后维护这些对的数据结构(list/stack/etc),并对结构执行深度优先(或广度优先)搜索。您只需确保不要访问同一张表两次,否则您可能会陷入无限循环。再次感谢。我对Java非常笨拙。。。你能粗略地给出一个我必须实现的函数的例子吗?不幸的是,StackOverflow不是一个代码编写服务。你可以试着写它,如果你有问题,然后用你试过的代码和它的问题发布一个新的问题。