Краткая версия:
Я ищу адаптацию С++ OCI для следующего Java-метода, где код может связывать массив чисел (размер массива может меняться) в оператор non-PL/SQL SELECT
, а затем использовать результирующий массив в проверке стиля WHERE ID IN (...)
.
http://rafudb.blogspot.com/2011/10/variable-inlist.html
Оригинальный вопрос:
У нас есть приложение на С++, которое общается с Oracle через OCI. Мы пытаемся исправить старый код, который генерирует SQL-запросы путем конкатенации текста; вместо этого мы хотим как можно больше использовать переменные связывания. Один конкретный случай пришел к выводу, что у нас нет хорошего решения.
SELECT * FROM MyTable WHERE ID IN (1, 4, 10, 30, 93)
Где часть (1, 4, 10, 30, 93)
поступает из vector<int>
или другого контейнера данных с гибким размером данных. Если бы мы знали, что это всегда будет пять значений, мы могли бы сделать:
SELECT * FROM MyTable WHERE ID IN (:1, :2, :3, :4, :5)
Но это может быть одна запись, или десять, или даже нуль. Очевидно, что если мы создаем запрос как строку, мы можем просто добавить столько чисел, сколько нам нужно, но цель состоит в том, чтобы избежать этого, если это возможно, и придерживаться только привязки переменных.
Есть ли хороший способ сделать это? Например, в OCI я могу привязать массив и затем выбрать его из него?
SELECT * FROM MyTable WHERE ID IN (SELECT * FROM :1)
Где :1
- массив OCI? (Возможно, синтаксис будет отличаться.) У кого-нибудь есть опыт? Образец кода был бы находкой, поскольку я, как правило, борюсь с написанием исходного OCI. Спасибо:)
EDIT: Я бы хотел сделать лучше, чем привязку в строке, которая анализируется процедурой PL/SQL, если это вообще возможно. Я уверен, что во многих случаях мы сдули 4000-символьный лимит, и я тоже чувствую, что просто торгую одним видом струнных манипуляций, с которыми мне удобно, для другого вида, которым я не являюсь (и я не могу отлаживать как легко). Если возможно, я хотел бы привязать массив значений (или некоторую форму набора данных) в один стандартный оператор SQL.
РЕДАКТИРОВАТЬ 2:. В некоторых исследованиях появилась следующая ссылка, которая, кажется, делает именно то, что я хочу, но на Java: http://rafudb.blogspot.com/2011/10/variable-inlist.html Кто-нибудь знает, как адаптировать этот подход к С++ OCI?