Московский государственный университет имени М.В.Ломоносова
Опубликован: 20.12.2005 | Доступ: свободный | Студентов: 3142 / 371 | Оценка: 4.22 / 3.86 | Длительность: 12:03:00
ISBN: 978-5-9556-0068-0
Лекция 5:

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

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

Именованные параметры

Именованные параметры могут использоваться в том случае, когда в SQL-операторе выполняется вызов хранимой процедуры. Именованные параметры идентифицируются в соответствии с их именами, а не по порядку их расположения (как при позиционных параметрах). Именованные параметры, так же как и позиционные параметры, связываются с переменной посредством вызова функции ODBC API SQLBindParameter, но идентифицируются посредством поля SQL_DESC_NAME IPD-дескриптора (Implementation Parameter Descriptor). Именованные параметры также могут быть связаны с переменной при вызове функции SQLSetDescField или функции SQLSetDescRec.

Далее приведен пример применения именованных параметров, используемых при вызове предварительно созданной хранимой процедуры test с двумя параметрами

(CREATE PROCEDURE test @f_id int = 1, @f2 char(30) AS )

Первый параметр процедуры имеет значение, по умолчанию равное 1, а второй параметр @f2 обязательно должен быть указан при вызове процедуры. Параметр @f2 - это динамический параметр, называемый именованным параметром.

// Компилирование вызова хранимой процедуры 
SQLPrepare(hstmt, "{call test(?)}", SQL_NTS);
// Заполнение записи 1 для IPD-дескриптора
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, 
                 SQL_C_CHAR, SQL_CHAR,
                 30, 0, szF2, 0, &cbValue);
// Получение IPD-дескриптора и определение полей 
// SQL_DESC_NAMED и SQL_DESC_UNNAMED для записи  #1.
SQLGetStmtAttr(hstmt, SQL_ATTR_IMP_PARAM_DESC, 
               &hIpd, 0, 0);
SQLSetDescField(hIpd, 1, SQL_DESC_NAME, 
               "@f2", SQL_NTS);
SQLSetDescField(hIpd, 1, SQL_DESC_UNNAMED, 
                SQL_NAMED, 0);
// Если переменная szF2 была корректно 
// инициализирована, то можно выполнять 
// вызов хранимой процедуры
SQLExecute(hstmt);
< Лекция 4 || Лекция 5: 123 || Лекция 6 >