Параметрические запросы
Формирование параметрических запросов
Параметры SQL-оператора
Параметром называется переменная, используемая в SQL-операторе.
Применение параметров позволяет формировать SQL-операторы непосредственно во время выполнения приложения. Так, при использовании многошагового интерфейса, при котором процесс компиляции и выполнения SQL-оператора происходит как последовательные действия, достаточно откомпилировать SQL-оператор с параметрами вместо явного указания значений полей таблицы базы данных, а затем многократно выполнять данный оператор с различными значениями параметров.
Например:
INSERT INTO TBL1 (F_ID, F2, F3) VALUES (?, ?, ?)
Параметры могут быть именованными и позиционными.
Позиционные параметры указываются символом вопросительный знак (?), называемым маркером параметров. При выполнении оператора вместо параметра в соответствующую позицию SQL-оператора приставляется значение параметра.
Согласно спецификации языка SQL маркеры параметров нельзя размещать в следующих местах SQL-оператора:
- в списке полей оператора SELECT ;
- одновременно как оба операнда для бинарного оператора (например, оператора =), так как на этапе компиляции нельзя определить тип операндов, выступающих в роли параметров;
- одновременно как первый и второй операнд для оператора BETWEEN (например, вместо SQL-операторанельзя записать
SELECT title_id, f_sales FROM tbl1 WHERE f_sales BETWEEN 4095 AND 12000
SELECT title_id, f_sales FROM tbl1 WHERE ? BETWEEN ? AND 12000 );
- одновременно как первый и третий операнд для оператора BETWEEN ;
- одновременно как первый операнд и второй операнд для оператора IN (например, вместо SQL-операторанельзя записать
SELECT f_ID, f_state FROM tbl1 WHERE f_state IN ('CA', 'CB')
SELECT f_ID, f_state FROM tbl1 WHERE ? IN (?, ?) );
- как операнд унарного оператора + или -.
Определение параметров
Выполняемый SQL-оператор может содержать несколько параметров.
Для использования параметра его первоначально следует определить (выполнить связывание параметра). Определение параметра заключается в указании типов для значения (С-тип) и для поля таблицы (SQL-тип), а также для указания буфера, в котором будет содержаться значение параметра, или номера параметра - для его последующего запроса во время выполнения. Определение параметра реализуется функцией SQLBindParameter (вместо функции SQLSetParam в ODBC 1.0).
Функция SQLBindParameter имеет следующее формальное описание:
SQLRETURN SQLBindParameter( SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber, SQLSMALLINT InputOutputType, SQLSMALLINT ValueType, SQLSMALLINT ParameterType, SQLUINTEGER ColumnSize, SQLSMALLINT DecimalDigits, SQLPOINTER ParameterValuePtr, SQLINTEGER BufferLength, SQLINTEGER * StrLen_or_IndPtr);
Параметр StatementHandle ([Input]) указывает дескриптор оператора, параметр ParameterNumber ([Input]) задает номер параметра (по мере их вхождения в SQL-оператор), начиная с 1.
Параметр InputOutputType ([Input]) определяет тип параметра.
Параметр ValueType ([Input]) определяет тип значения переменной (С-тип), из которой будет извлекаться значение, передаваемое в базу данных, а параметр ParameterType ([Input]) указывает тип параметра (SQL-тип поля таблицы базы данных).
Параметр ColumnSize ([Input]) определяет размер столбца или указывает выражение, соответствующее маркеру параметра, а параметр DecimalDigits ([Input]) определяет количество десятичных знаков в столбце или указывает выражение, соответствующее маркеру параметра. Получить размер столбца и количество десятичных знаков в столбце можно при помощи функции ODBC API SQLDescribeCol.
Параметр ParameterValuePtr ([Deferred Input]) является указателем на буфер для данных, передаваемых в качестве параметра. Длина этого буфера определяется параметром BufferLength ([Input/Output]), а указатель на буфер для длины параметра задается параметром StrLen_or_IndPtr ([Deferred Input]). Функция SQLBindParameter может возвращать следующие значения: SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE.