Использование переменных связывания в больших операторах вставки

голоса
2

Я наследуя приложение, которое имеет для чтения данных из различных типов файлов и использовать интерфейс 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 преобразовать в соответствующий тип данных при вставке.

Итак, мой вопрос (ы):

  1. Что такое правильный / идиоматическое (если такая вещь существует для SQL / OCI), чтобы использовать переменные связывания для операторов SQL вставки с большим количеством колонок / Params? В более общем плане, что это лучший способ использовать OCI, чтобы сделать этот тип большого оператора вставки?

  2. Есть большое количество связываемых вызовов имеет значительную стоимость в эффективности по сравнению с построением и использования строк ванили C?

  3. Есть ли риск в связывании всех переменных в виде строк и позволяя Oracle сделать правильный тип преобразования?

Заранее спасибо!

Задан 12/07/2014 в 18:22
пользователем
На других языках...                            


1 ответов

голоса
1

Не уверен, что аспекты C этого. Мой ответ будет с точки зрения администратора базы данных.

Вопрос 2: Всегда используйте переменные связывания. Это предотвращает SQL-инъекции и повышает производительность.

Аспект производительности часто забывают программистами. Когда Oracle получает SQL это делает хэш всего SQL-текст и выглядит в его внутреннее хранилище исполнения планов, чтобы увидеть, если он есть. Если переменные связывания использовали его SQL-текст-будет то же самое каждый раз при выполнении запроса, не имеет значения, что значение переменной. Однако, если вы сцепляетесь строковой ваш сам Oracle будет хеширования SQL-текст, в том числе содержания (то, что вы нечто, поставили в) переменных, получая уникальный хеш каждый раз. Так что, если вы делаете запрос, один миллион раз Oracle будет, если вы использовали переменные связывания сделать один план выполнения, в то время как, если вы не используете переменные связывания будет составлять планы один миллион выполнения и отходов нагрузок ресурсов делают это.

Ответил 17/07/2014 в 07:49
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more