JDBC DatabaseMetaData.getColumns()返回重复的列

我正忙于一段代码来从Oracle数据库获取表的列名。我想出的代码如下所示:

DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());

Connection conn = DriverManager.getConnection(

"jdbc:oracle:thin:@<server>:1521:<sid>", <username>, <password>);

DatabaseMetaData meta = conn.getMetaData();

ResultSet columns = meta.getColumns(null, null, "EMPLOYEES", null);

int i = 1;

while (columns.next())

{

System.out.printf("%d: %s (%d)\n", i++, columns.getString("COLUMN_NAME"),

columns.getInt("ORDINAL_POSITION"));

}

当我运行此代码时,令我惊讶的是,返回了太多列。仔细研究发现,ResultSet包含所有列的重复集,即每个列都返回了两次。这是我得到的输出:

1: ID (1)

2: NAME (2)

3: CITY (3)

4: ID (1)

5: NAME (2)

6: CITY (3)

当我使用Oracle SQL

Developer查看该表时,它显示该表只有三列(ID,NAME,CITY)。我已经针对数据库中的几个不同表尝试了此代码,其中一些工作很好,而另一些表现出这种奇怪的行为。

Oracle JDBC驱动程序中可能有错误吗?还是我在这里做错了什么?


感谢Kenster,我现在有了另一种检索列名的方法。您可以从ResultSet中获取它们,如下所示:

DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());

Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@<server>:1521:<sid>", <username>, <password>);

Statement st = conn.createStatement();

ResultSet rset = st.executeQuery("SELECT * FROM \"EMPLOYEES\"");

ResultSetMetaData md = rset.getMetaData();

for (int i=1; i<=md.getColumnCount(); i++)

{

System.out.println(md.getColumnLabel(i));

}

这似乎工作得很好,没有重复返回!对于那些想知道的人:根据此博客,您应该使用getColumnLabel()而不是getColumnName()。

回答:

在oracle中,Connection.getMetaData()返回 整个

数据库的元数据,而不仅仅是您碰巧要连接到的架构。因此,当您提供null的前两个参数时meta.getColumns(),您并不仅要过滤模式的结果。

您需要将Oracle模式的名称提供给的前两个参数之一meta.getColumns(),可能是第二个,例如

meta.getColumns(null, "myuser", "EMPLOYEES", null);

这样做有点烦人,但这是Oracle员工选择实现其JDBC驱动程序的方式。

以上是 JDBC DatabaseMetaData.getColumns()返回重复的列 的全部内容, 来源链接: utcz.com/qa/428733.html

回到顶部