Java DatabaseMetaData.getColumns() метод не работает для всех пользователей
У меня есть несколько пользователей в базе данных Oracle, скажем, UserOne, UserTwo и UserTree с одной и той же непустой таблицей с именем - "tableExample".
В моем случае мне нужно инициализировать ResultSet через метод getColumns():
DatabaseMetaData md = conn.getMetaData();
ResultSet r = md.getColumns(null, "UserTwo", "tableExample", null);
while(r.next())
{
//Do something;
}
В приведенном выше примере r.next() имеет значение true, но когда я использую UserOne или UserTree, r.next() имеет значение false.
Как я могу решить эту проблему, чтобы получить ResultSet этой таблицы независимо от того, какого пользователя я выбрал?
* Если я использую:
ResultSet r = md.getColumns(null, null, "tableExample", null);
Я получу результат для всех пользователей в базу данных, но мне нужно динамически конкретизировать пользователей, используя второй аргумент в этом методе.
2 ответа
Из апидоков:
schemaPattern
- шаблон имени схемы; должен совпадать с именем схемы в том виде, в каком оно хранится в базе данных; [...]
Так что это шаблон, но, к сожалению, нет подсказки о том, какой тип шаблона ожидается от метода, но вы можете просто попробовать что-нибудь:
ResultSet r = md.getColumns(null, "User*", "tableExample", null);
ResultSet r = md.getColumns(null, "User.+", "tableExample", null);
В качестве альтернативы вы можете использовать системные таблицы oracle напрямую ( apidoc для 10g):
String sql = "SELECT * FROM SYS.ALL_TAB_COLUMNS WHERE OWNER LIKE 'User%'";
ResultSet r = conn.createStatement().executeQuery(sql);
Это старо, но может помочь кому-то поискать и увидеть это. Я использую jar версии 19.3.0.0 ojbc10. Он работает, но внутри он, кажется, использует представление add_tab_cols или dba_tab_cols и требует, чтобы имена схемы и таблицы были в верхнем регистре, или, похоже, он ничего не возвращает.
Это работает для меня (не Oracle в настоящее время Postgres):
if (databaseMetaData instanceof OracleDatabaseMetaData) {
ResultSet rs = databaseMetaData.getColumns(null, schema.toUpperCase(), tableName.toUpperCase(), null);
return getColumnsFromResultSet(tableName, rs);
} else {
ResultSet rs = databaseMetaData.getColumns(null, schema, tableName, null);
return getColumnsFromResultSet(tableName, rs);
}