Привязка параметров по имени (именованные параметры)

Некоторые СУБД позволяют приложению указывать параметры хранимой процедуры по имени вместо позиции в вызове процедуры. Такие параметры называются именованным параметрами. 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);