Я наследуя приложение, которое имеет для чтения данных из различных типов файлов и использовать интерфейс OCI для перемещения данных в базу данных Oracle. Большинство таблиц в вопросе имеет около 40-50 столбцов, поэтому операторы SQL вставок становятся довольно длительными.
Когда я унаследовал этот код, он в основном построены операторы вставки через серию strcat
с в виде строки C, а затем передал его в соответствующие функции OCI , чтобы настроить и выполнить инструкцию. Однако, так как большая часть данных считываются непосредственно из файлов в значение столбца, это оставляет приложение с открытым для легкой инъекции SQL. Так что я пытаюсь использовать переменные связывания , чтобы решить эту проблему.
В каждом примере OCI приложении я могу найти, каждый переменный выделяются статический и связаны индивидуально. Это привело бы к совсем немного шаблонный, однако, и я хотел бы, чтобы свести его к какой-то для создания циклов. Так что мое решение является для каждой таблицы, создать статический массив строк, содержащих имена столбцов таблицы:
const char const *TABLE_NAME[N_COLS] = {
COL_1,
COL_2,
COL_3,
...
COL_N
};
наряду с короткой функцией, которая делает заполнитель из имени столбца:
void makePlaceholder(char *buf, const char *col);
// COLUMN_NAME -> :column_name
Поэтому я тогда Перебери каждый массив и связать свои значения каждого столбец, генерируя заполнители , как я иду. Одна потенциальная проблема здесь состоит в том , что, так как типы каждого столбца меняются, я связываю все как SQLT_STR
(строк) , и , таким образом , ожидать , Oracle преобразовать в соответствующий тип данных при вставке.
Итак, мой вопрос (ы):
Что такое правильный / идиоматическое (если такая вещь существует для SQL / OCI), чтобы использовать переменные связывания для операторов SQL вставки с большим количеством колонок / Params? В более общем плане, что это лучший способ использовать OCI, чтобы сделать этот тип большого оператора вставки?
Есть большое количество связываемых вызовов имеет значительную стоимость в эффективности по сравнению с построением и использования строк ванили C?
Есть ли риск в связывании всех переменных в виде строк и позволяя Oracle сделать правильный тип преобразования?
Заранее спасибо!