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). Я пробовал этот код на нескольких разных таблицах в моей базе данных, и некоторые работают просто отлично, в то время как другие демонстрируют это странное поведение.

Может ли быть ошибка в драйвере JDBC Oracle? Или я что-то здесь не так делаю?

Обновить:&nbsp;БлагодаряKenster&nbsp;Теперь у меня есть альтернативный способ получить имена столбцов. Вы можете получить их из 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));
}

Это, кажется, работает просто отлично, и дубликаты не возвращаются! И для тех, кто интересуется: согласноэтот блог&nbsp;Вы должны использовать getColumnLabel () вместо getColumnName ().