Как я могу обработать массив в подготовленном операторе? т. е. я хочу выполнить запрос, и один из параметров, которые я получаю, представляет собой массив строк, который я хочу использовать в запросе (не выбирайте строки, у которых есть поле, находящееся в массиве)?Java - Подготовленные операторы и массивы
ответ
Некоторые драйверы JDBC могут уже (до JDBC 4) содержать проприетарные расширения, поддерживающие параметры массива в подготовленных операторах - для этого вам необходимо проконсультироваться с API. Это означало бы, что вам нужно использовать и манипулировать подобным массивом типом в SQL.
Одна работа вокруг будет использовать временные таблицы. Это мета-шаги для такого решения:
- Begin сделки (это происходит автоматически, если вы находитесь внутри транзакционной метода - EJB или Spring);
- Использование пакетной вставки JDBC с подготовленным оператором создает и заполняет временную таблицу с элементами arrary (временная таблица должна иметь область транзакций - это также относится к базам данных, но по крайней мере поддерживается Oracle);
- Постройте свой SQL-код, который включает в себя соединение во временную таблицу, чтобы использовать значения массива (это может быть явный внутренний или внешний JOIN или неявное соединение, например, с использованием EXISTS и т. Д.);
- Обязательная транзакция (или откат при выполнении приложения) (это должно уничтожить временную таблицу, при одновременных транзакциях не должно быть конфликтов для одного и того же имени временной таблицы).
Пример: выражение IN заменяется JOIN на временную таблицу.
IBM DB2 тоже может это сделать (временная таблица с транзакционным объем). Мне нравится идея, но какая польза от простого динамического построения предложения IN? –
Я не могу это доказать, но разница выглядит как O (log (n)) против O (n) или даже хуже. Накладные расходы на создание и заполнение временной таблицы пренебрежимо малы для больших n (n> 5). Первоначально мы ввели это для решения проблем производительности с оператором IN с большим количеством элементов. После добавления удобных методов, которые сделали использование прозрачным и сжатым, мы больше не возвращались к использованию IN снова (в случаях, когда число элементов меняется). – topchef
Просто быстрый комментарий к производительности: заменив IN на временную таблицу, вы по существу замените оператор OR внутренним соединением. Любой администратор базы данных согласился бы с тем, что выигрыш в производительности от этого огромен. – topchef
Это, вероятно, сейчас вам не поможет, но я прочитал, что JDBC 4 будет поддерживать типы массивов, определенные в версии SQL версии 2003 года.
Это в значительной степени зависит от использования РСУБД. Часто такая функциональность может быть достигнута с помощью расширений драйвера jdbc поставщика.
2 варианта я нашел это (для Oracle): http://blogs.itemis.de/kloss/2009/03/05/arrays-preparedstatements-jdbc-and-oracle/
http://www.angelfire.com/home/jasonvogel/java_jdbc_arrays.html
Попробуйте посмотреть, если это поможет вам.
- 1. Подготовленные операторы и поплавки
- 2. подготовленные операторы SQL в java
- 3. подготовленные операторы
- 4. SQL-инъекции и подготовленные операторы
- 5. Подготовленные операторы и mysqli_query/mysqli_num_rows?
- 6. Подготовленные операторы и выражение IN
- 7. mysqli подготовленные операторы и mysqli_real_escape_string
- 8. mysqli, циклы и подготовленные операторы
- 9. Перенос в подготовленные операторы
- 10. Как правильно вызвать подготовленные операторы в java
- 11. Подготовленные операторы MySQLi
- 12. Подготовленные операторы с MySQL?
- 13. Подготовленные операторы, вызывающие ошибки
- 14. Подготовленные операторы ortography
- 15. Подготовленные операторы MYSQL-PDO
- 16. массивы и операторы if в Java
- 17. Массивы и операторы
- 18. VBA-массивы и операторы
- 19. PDO, Подготовленные операторы и SQL-Injection снова
- 20. Встроенные функции JDBC и подготовленные операторы
- 21. PHP PDO MySQL LIKE и подготовленные операторы
- 22. Doctrine raw sql и подготовленные операторы
- 23. Подготовленные операторы и «настоящая escape-строка»
- 24. sqlite подготовленные операторы - как отлаживать
- 25. Подготовленные операторы в C++ libneo4j_client?
- 26. Подготовленные операторы: num_rows всегда ноль
- 27. php mysql подготовленные операторы выпуск
- 28. Подготовленные операторы MySQLi в PHP
- 29. mysqli подготовленные операторы - auto trim
- 30. Pre/Post операторы инкремента и массивы
Посмотрите на этот вопрос: http://stackoverflow.com/questions/178479/alternatives-for-java-sql-preparedstatement-in-clause-issue – ChssPly76