Опубликован: 20.12.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 5:

Параметрические запросы

< Лекция 4 || Лекция 5: 123 || Лекция 6 >
Аннотация: Описываются средства формирование параметрических запросов.

Формирование параметрических запросов

Параметры 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.

< Лекция 4 || Лекция 5: 123 || Лекция 6 >