PreparedStatement для выбора количества [дубликата]

1

У меня есть программа, которая будет подсчитывать количество записей из разных источников данных. У меня есть имена баз данных и имена таблиц, которые хранятся в списках массивов, называемых именами database_names и table_names соответственно. Я не могу заставить это запустить:

for (int i = 0; i < table_names.size(); i++) {
    String query = "select count(1) from ?.?";
    PreparedStatement stmt = connection.prepareStatement(query);
    stmt.setString(1, database_names.get(i));
    stmt.setString(2, table_names.get(i));
    ResultSet rs = stmt.executeQuery();
}

Я получаю ORA-00903: invalid table name ошибка ORA-00903: invalid table name. Я установил операторы печати, чтобы гарантировать, что мои database_names.get(i) и table_names.get(i) печатают правильные значения. Они были, и если я жестко привязываю имя базы данных и имя таблицы в строке query, программа может подсчитывать записи.

Как я могу правильно подготовить запрос запроса так, чтобы он имел форму:

select count(1) from database_name.table_name
  • 2
    Я не думаю, что вы можете сделать это. В Javadoc PreparedStatement говорится (частично) Примечание. Методы установки (setShort, setString и т. Д.) Для установки значений параметров IN должны указывать типы, совместимые с определенным типом SQL входного параметра. Например, если параметр IN имеет тип SQL INTEGER, следует использовать метод setInt. нет метода setTableName .
  • 0
    @ElliottFrisch как мой database_name и table_name являются строками и я использую setString() метод, поэтому не следует моей решительность запроса для select count(1) from sampleDB.sampleTable ?
Показать ещё 4 комментария
Теги:
prepared-statement

1 ответ

0

Oracle говорит: когда вы готовите SQL-запрос или PL/SQL-блок, содержащий входные данные, которые будут поставляться во время выполнения, заполнители в SQL-заявлении или PL/SQL-блоке, где должны быть предоставлены данные.

Имя схемы и таблицы - это не данные, а структуры данных. На этапе подготовки Oracle анализирует инструкцию, проверяет права. оптимизирует план. Это невозможно без схем и таблиц. Oracle использует переменные связывания на этапе выполнения, когда ваш отчет подготовлен.

В вашем случае вам нужно создать новое PreparedStatement для каждой таблицы

Ещё вопросы

Сообщество Overcoder
Наверх
Меню