У меня есть список абсолютных имен файлов (csv файлов). Я хочу, чтобы пакет вставлял их, используя LOAD DATA LOCAL INFILE
.
Проблема: я не могу собрать операторы sql партиями, прежде чем выполнять их как пакет:
PreparedStatement ps = con.prepareStatement("LOAD DATA LOCAL INFILE ? INTO TABLE mytable");
for (String filename : filenames) {
ps.setString(1, filename);
ps.addBatch();
}
ps.executeBatch();
ps.commit();
Результат:
Ошибка при фиксации 1 файла: Индекс параметров вне диапазона (1> количество параметров, которое равно 0)
Параметр подстановки sql не распознается. Но как я могу получить абсолютное имя файла, это утверждение, если не с ?
подстановочные?
Я не думаю, что подготовленные заявления поддерживают LOAD DATA
как вы помните. Насколько я знаю, только литеральные значения в запросах могут быть представлены параметрами. Но вы можете использовать обычную конкатенацию строк здесь:
String sql1 = "LOAD DATA LOCAL INFILE '";
String sql2 = "' INTO TABLE mytable";
Statement s = con.createStatement(); // use a regular statement
for (String filename : filenames) {
String query = sql1 + filename + sql2
s.addBatch(query);
}
s.executeBatch();
s.commit();
LOAD DATA
недопустима для подготовленного заявления. Он не найден в списке «Синтаксис SQL, разрешенный в подготовленных выражениях», который приведен здесь: dev.mysql.com/doc/refman/5.7/en/…