使用Java、SQL和Oracle的引用和引用表的列表或数组列表
我试图在一个ArrayList(例如)中获得一个完整的列表,其中包含另一个表引用的表,而其他表引用了该列表 我正在寻找一个Java函数,它有一个条目(我要查找的表)和一个结果(ArrayList) 函数的标题如下所示:使用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被其他
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不是一个代码编写服务。你可以试着写它,如果你有问题,然后用你试过的代码和它的问题发布一个新的问题。