Leo*_*man 17 java jdbc database-metadata
我忙于编写一段代码来获取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"));
}
Run Code Online (Sandbox Code Playgroud)
当我把这个代码运行到我的意外时,返回了太多的列.仔细观察发现ResultSet包含所有列的重复集合,即每列返回两次.这是我得到的输出:
1: ID (1)
2: NAME (2)
3: CITY (3)
4: ID (1)
5: NAME (2)
6: CITY (3)
Run Code Online (Sandbox Code Playgroud)
当我使用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));
}
Run Code Online (Sandbox Code Playgroud)
这似乎工作得很好,没有返回重复!对于那些想知道的人:根据这篇博客,您应该使用getColumnLabel()而不是getColumnName().
ska*_*man 25
在oracle中,Connection.getMetaData()返回整个数据库的元数据,而不仅仅是您碰巧连接到的模式.因此,当您提供null前两个参数时meta.getColumns(),您不会仅仅过滤模式的结果.
您需要将Oracle模式的名称提供给前两个参数之一meta.getColumns(),可能是第二个参数,例如
meta.getColumns(null, "myuser", "EMPLOYEES", null);
Run Code Online (Sandbox Code Playgroud)
这样做有点恼人,但这就是Oracle人员选择实现JDBC驱动程序的方式.
Ken*_*ter 15
这不直接回答您的问题,但另一种方法是执行查询:
select * from tablename where 1 = 0
Run Code Online (Sandbox Code Playgroud)
这将返回ResultSet,即使它没有选择任何行.结果集元数据将与您选择的表匹配.根据您正在做的事情,这可能更方便.tablename可以是你可以选择的任何东西 - 你不必让案件正确或担心它的模式.
| 归档时间: |
|
| 查看次数: |
38874 次 |
| 最近记录: |