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