Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Возможен ли параметрический insert all?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3588
Мне нужно синхронизироваться с внешней системой, которая отдает данные в JSON (несколько тысяч записей).
Я перепробовал несколько разных способов, в которых смог разобраться, и самым оптимальным получилось загружать данные без обработки в temp-таблицу (буфер), а затем работать с буфером.
Загружаю я данные построчно, с помощью insert into ... values (?, ?, ...).
В принципе скорость работы меня устраивает, все загружается за пару секунд.
Но мне кажется, что если заменить несколько тысяч insert на один большой insert all, то это бы ускорило работу и снизило нагрузку на сервер.
Но в этом случае мне нужно будет динамически формировать огромный SQL и экранировать в нем спецсимволы, чего я стараюсь избегать.
Не подскажите, можно ли в подобных случаях передавать в запрос коллекцию или массив с данными?

Сообщение было отредактировано: 19 июн 20, 10:57
19 июн 20, 10:58    [22153483]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли параметрический insert all?  [new]
oragraf
Member

Откуда: Moscow
Сообщений: 1275
Alibek B.,

forall?
19 июн 20, 11:12    [22153492]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли параметрический insert all?  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8657
Alibek B.
Не подскажите, можно ли в подобных случаях передавать в запрос коллекцию или массив с данными?

Да.

https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/forall_statement.htm
19 июн 20, 11:12    [22153493]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли параметрический insert all?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3588
forall это ведь PL/SQL?
А не подскажите, как воспользоваться этим с клиента?
Я никак не могу сообразить. Если на клиенте формировать блок PL/SQL, то это мало чем будет отличаться, все тот же большой сгенерированный SQL и необходимость экранирования спецсимволов. А вот чтобы передать с клиента на сервер массив/коллекцию (в виде параметра) — я примеры видел только для Java EE, и они сильно отличаются от привычных.

Сообщение было отредактировано: 19 июн 20, 11:19
19 июн 20, 11:18    [22153495]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли параметрический insert all?  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8657
Alibek B.

А не подскажите, как воспользоваться этим с клиента?

Читать документацию по клиенту

OCI и JDBC - точно поддерживают

А что у Вас за клиент, кроме Вас никто не знает. Кофе закончилось. Погадать на кофейной гуще не могу.
19 июн 20, 11:20    [22153497]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли параметрический insert all?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3588
Жаль.
Клиент Perl+DBI, но в нем видимо эти возможности (коллекции и рекордсеты) не реализованы.
В нем есть метод execute_array, в который можно передать массив значений для каждого параметра, но судя по тому, как он выполняется, это просто оптимизированный внутри цикл с последовательным выполнением обычного запроса.

Сообщение было отредактировано: 19 июн 20, 11:30
19 июн 20, 11:31    [22153512]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли параметрический insert all?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2468
Alibek B.,

с клиента "несколько тысяч записей" за пару секунд, как на меня неплохо

forall/вставка массивом по идее должна быть быстрее

пробуйте

но если устраивает то ...

.....
stax
19 июн 20, 12:01    [22153539]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли параметрический insert all?  [new]
K790
Member

Откуда:
Сообщений: 618
автор
с внешней системой
это db link?
Тогда forall как говорится нельзя использовать можно заменить на ...
19 июн 20, 12:56    [22153602]     Ответить | Цитировать Сообщить модератору
 Re: Возможен ли параметрический insert all?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3588
Stax
с клиента "несколько тысяч записей" за пару секунд, как на меня неплохо

Это вообще весь скрипт столько выполняется.
Если исключить получение внешних данных и посчитать только время "заливки" данных в БД, то там меньше секунды.

K790
это db link?

Нет, это веб-сервис с REST-интерфейсом, который возвращает JSON.
Он не предназначен для интенсивной нагрузки, поэтому БД выполняет роль промежуточного кеша.
19 июн 20, 13:37    [22153631]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить