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にはすべての列の重複セットが含まれていることがわかりました。つまり、すべての列が2回返されました。これが私が得た出力です:
1: ID (1)
2: NAME (2)
3: CITY (3)
4: ID (1)
5: NAME (2)
6: CITY (3)
Oracle SQL Developerを使用してテーブルを見ると、テーブルには3つの列(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));
}
これは問題なく機能しているようで、重複は返されません。そして疑問に思う人のために:このブログによると、 getColumnName()の代わりにgetColumnLabel()を使用する必要があります。