Привязка параметров по имени (именованные параметры)
Некоторые СУБД позволяют приложению указывать параметры хранимой процедуры по имени вместо позиции в вызове процедуры. Такие параметры называются именованным параметрами. ODBC поддерживает использование именованных параметров. В ODBC именованные параметры используются только в вызовах хранимых процедур и не могут использоваться в других инструкциях SQL.
Драйвер проверка значение поля SQL_DESC_UNNAMED IPD, чтобы определить, используются ли именованные параметры. Если SQL_DESC_UNNAMED не задано SQL_UNNAMED, драйвер использует имя в поле SQL_DESC_NAME IPD для идентификации параметра. Чтобы привязать параметр, приложение может вызвать SQLBindParameter , чтобы указать сведения о параметрах, а затем вызвать SQLSetDescField , чтобы задать поле SQL_DESC_NAME IPD. При использовании именованных параметров порядок параметра в вызове процедуры не важен, а номер записи параметра игнорируется.
Разница между неназванными параметрами и именованных параметров находится в связи между порядковым номером дескриптора и номером параметра в процедуре. При использовании неименованных параметров первый маркер параметра связан с первой записью дескриптора параметров, которая, в свою очередь, связана с первым параметром (в порядке создания) в вызове процедуры. При использовании именованных параметров первый маркер параметров по-прежнему связан с первой записью дескриптора параметра, но связь между номером записи дескриптора и номером параметра в процедуре больше не существует. Именованные параметры не используют сопоставление номера записи дескриптора с положением параметра процедуры; Вместо этого имя записи дескриптора сопоставляется с именем параметра процедуры.
Примечание.
Если включена автоматическая популяция IPD, драйвер заполняет дескриптор таким образом, что порядок записей дескриптора будет соответствовать порядку параметров в определении процедуры, даже если используются именованные параметры.
Если используется именованный параметр, все параметры должны быть именованы. Если какой-либо параметр не является именованным параметром, то ни один из параметров ЦС не будет называться параметрами. Если существовала смесь именованных параметров и неименованных параметров, поведение будет зависеть от драйвера.
В качестве примера именованных параметров предположим, что хранимая процедура SQL Server определена следующим образом:
CREATE PROCEDURE test @title_id int = 1, @quote char(30) AS <blah>
В этой процедуре первый параметр @title_idимеет значение по умолчанию 1. Приложение может использовать следующий код для вызова этой процедуры, чтобы указать только один динамический параметр. Этот параметр является именованным параметром с именем "@quote".
// Prepare the procedure invocation statement.
SQLPrepare(hstmt, "{call test(?)}", SQL_NTS);
// Populate record 1 of ipd.
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,
30, 0, szQuote, 0, &cbValue);
// Get ipd handle and set the SQL_DESC_NAMED and SQL_DESC_UNNAMED fields
// for record #1.
SQLGetStmtAttr(hstmt, SQL_ATTR_IMP_PARAM_DESC, &hIpd, 0, 0);
SQLSetDescField(hIpd, 1, SQL_DESC_NAME, "@quote", SQL_NTS);
// Assuming that szQuote has been appropriately initialized,
// execute.
SQLExecute(hstmt);