我正忙于编写一段代码以从 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()。