У меня есть программа, которая будет подсчитывать количество записей из разных источников данных. У меня есть имена баз данных и имена таблиц, которые хранятся в списках массивов, называемых именами 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
Oracle говорит: когда вы готовите SQL-запрос или PL/SQL-блок, содержащий входные данные, которые будут поставляться во время выполнения, заполнители в SQL-заявлении или PL/SQL-блоке, где должны быть предоставлены данные.
Имя схемы и таблицы - это не данные, а структуры данных. На этапе подготовки Oracle анализирует инструкцию, проверяет права. оптимизирует план. Это невозможно без схем и таблиц. Oracle использует переменные связывания на этапе выполнения, когда ваш отчет подготовлен.
В вашем случае вам нужно создать новое PreparedStatement для каждой таблицы
PreparedStatement
говорится (частично) Примечание. Методы установки (setShort, setString и т. Д.) Для установки значений параметров IN должны указывать типы, совместимые с определенным типом SQL входного параметра. Например, если параметр IN имеет тип SQL INTEGER, следует использовать метод setInt. нет методаsetTableName
.database_name
иtable_name
являются строками и я используюsetString()
метод, поэтому не следует моей решительность запроса дляselect count(1) from sampleDB.sampleTable
?