Мне нужно написать простой запрос с использованием оракула, Java и mybatis:В памяти базы данных поддерживает фирменную INSERT ALL оракул синтаксис
select * from FOO foo where foo.id IN (ids)
Теперь ids
большая коллекция строк, около 7000. К сожалению, оракул имеет ограничение 1000 элементов для предложения IN.
Чтобы преодолеть это, я могу либо:
- сцепить запрос динамически, так что становится: Я не уверен, если он даже работает, и я очень сомневаюсь, что он выполняет хорошо
- использование временного таблицу и перепишите запрос на:
select * from FOO foo join SOME_TEMPORARY_ID tempids on foo.id = tempids.id
.
Я решил пойти на 2 варианта. Перед выполнением запроса мне нужно как-то сделать эффективную пакетную вставку в Oracle. К сожалению, Oracle имеет собственный синтаксис, чтобы сделать пакетную вставки:
INSERT ALL
INTO some_table VALUES ('foo')
INTO some_table VALUES ('foo1')
INTO some_table VALUES ('foo2')
....
INTO some_table VALUES ('foo12345')
SELECT * FROM DUAL
Теперь, я не упомянул, но я хочу написать интеграционный тест для этого, в идеале с использованием H2 или любой другой InMemory базы данных. Конечно, H2 не поддерживает этот синтаксис. Также HSQLDB.
Вы знаете какую-либо базу данных в памяти, которая полностью поддерживает проприетарный синтаксис оракула? Или, по крайней мере, это конкретное предложение INSERT ALL?
Как насчет производительности? Что должно быть более результативным - с использованием временных таблиц или 7K элементов IN? – slnowak
@slnowak Вы заметили, что ids является коллекцией, Почему просто smt как этот 'select * from FOO foo где foo.id IN (выберите * из таблицы (коллекции идентификаторы))'. Где ids - вложенная таблица. Вы можете вытаскивать в нем идентификаторы, а затем запускать запрос. О производительности Я думаю, что вложенная таблица - лучшая, временная вторая и в-третьих - третья. –
Не могли бы вы немного объяснить синтаксис и функцию? Я не знал, что это существует. Это более или менее эквивалентно созданию временной таблицы? И не страдает ли этот предел 1k IN? – slnowak