2009-08-29 5 views
1

Как я могу обработать массив в подготовленном операторе? т. е. я хочу выполнить запрос, и один из параметров, которые я получаю, представляет собой массив строк, который я хочу использовать в запросе (не выбирайте строки, у которых есть поле, находящееся в массиве)?Java - Подготовленные операторы и массивы

+0

Посмотрите на этот вопрос: http://stackoverflow.com/questions/178479/alternatives-for-java-sql-preparedstatement-in-clause-issue – ChssPly76

ответ

1

Некоторые драйверы JDBC могут уже (до JDBC 4) содержать проприетарные расширения, поддерживающие параметры массива в подготовленных операторах - для этого вам необходимо проконсультироваться с API. Это означало бы, что вам нужно использовать и манипулировать подобным массивом типом в SQL.

Одна работа вокруг будет использовать временные таблицы. Это мета-шаги для такого решения:

  1. Begin сделки (это происходит автоматически, если вы находитесь внутри транзакционной метода - EJB или Spring);
  2. Использование пакетной вставки JDBC с подготовленным оператором создает и заполняет временную таблицу с элементами arrary (временная таблица должна иметь область транзакций - это также относится к базам данных, но по крайней мере поддерживается Oracle);
  3. Постройте свой SQL-код, который включает в себя соединение во временную таблицу, чтобы использовать значения массива (это может быть явный внутренний или внешний JOIN или неявное соединение, например, с использованием EXISTS и т. Д.);
  4. Обязательная транзакция (или откат при выполнении приложения) (это должно уничтожить временную таблицу, при одновременных транзакциях не должно быть конфликтов для одного и того же имени временной таблицы).

Пример: выражение IN заменяется JOIN на временную таблицу.

+0

IBM DB2 тоже может это сделать (временная таблица с транзакционным объем). Мне нравится идея, но какая польза от простого динамического построения предложения IN? –

+0

Я не могу это доказать, но разница выглядит как O (log (n)) против O (n) или даже хуже. Накладные расходы на создание и заполнение временной таблицы пренебрежимо малы для больших n (n> 5). Первоначально мы ввели это для решения проблем производительности с оператором IN с большим количеством элементов. После добавления удобных методов, которые сделали использование прозрачным и сжатым, мы больше не возвращались к использованию IN снова (в случаях, когда число элементов меняется). – topchef

+0

Просто быстрый комментарий к производительности: заменив IN на временную таблицу, вы по существу замените оператор OR внутренним соединением. Любой администратор базы данных согласился бы с тем, что выигрыш в производительности от этого огромен. – topchef

1

Это, вероятно, сейчас вам не поможет, но я прочитал, что JDBC 4 будет поддерживать типы массивов, определенные в версии SQL версии 2003 года.

1

Это в значительной степени зависит от использования РСУБД. Часто такая функциональность может быть достигнута с помощью расширений драйвера 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

Попробуйте посмотреть, если это поможет вам.

Смежные вопросы