Поделиться через


Вызовы процедур

Процедура — это исполняемый объект, хранящийся в источнике данных. Обычно процедурой является одна или несколько заранее скомпилированных инструкций SQL. Escape-последовательность для вызова процедуры

{[?=]call procedure-name[([параметр][,[параметр]...)]}

Где имя процедуры указывает имя процедуры и параметра , указывает параметр процедуры.

Дополнительные сведения о escape-последовательности вызовов процедуры см. в разделе "Последовательность вызова вызовов процедур" в приложении C: грамматика SQL.

Процедура может иметь параметры или не иметь их. Он также может возвращать значение, как указано необязательным маркером параметра ?= в начале синтаксиса. Если параметр является входным или выходным параметром , он может быть литеральным или маркером параметров. Однако приложения взаимодействия всегда должны использовать маркеры параметров, так как некоторые источники данных не принимают литеральные значения параметров. Если параметр является выходным параметром, он должен быть маркером параметров. Маркеры параметров должны быть привязаны к SQLBindParameter перед выполнением инструкции вызова процедуры.

Входные и входные-выходные параметры в вызовах процедуры могут быть пропущены. Если процедура вызывается с скобками, но без каких-либо параметров, таких как {call procedure-name()}, драйвер указывает источнику данных использовать значение по умолчанию для первого параметра. Если у процедуры нет параметров, это может привести к сбою процедуры. Если процедура вызывается без круглых скобок, например {call-name}, драйвер не отправляет значения параметров.

В вызовах процедур можно задавать литералы для входных или входных-выходных параметров. Например, предположим, что процедура InsertOrder имеет пять входных параметров. Следующий вызов InsertOrder окупит первый параметр, предоставляет литерал для второго параметра и использует маркер параметра для третьего, четвертого и пятого параметров:

{call InsertOrder(, 10, ?, ?, ?)}   // Not interoperable!  

Обратите внимание, что если параметр опущен, запятая, разделяющая ее из других параметров, по-прежнему должна отображаться. Если пропущен входной или входной-выходной параметр, процедура использует значение по умолчанию. Другой способ указать значение по умолчанию входного или выходного параметра — задать значение буфера длины или индикатора, привязанного к параметру, для SQL_DEFAULT_PARAM.

Если входной и выходной параметр опущен или если для параметра указан литерал, драйвер удаляет выходное значение. Аналогичным образом, если пропущен маркер параметра для значения, возвращаемого процедурой, драйвер отбрасывает возвращаемое значение. Наконец, если в приложении задан параметр возвращаемого значения для процедуры, которая не возвращает значение, драйвер задает значение буфера длины и индикатора, привязанное к параметру процедуры SQL_NULL_DATA.

Предположим, что процедура PARTS_IN_ORDERS создает результирующий набор, содержащий список заказов, содержащих определенный номер части. Следующий код вызывает эту процедуру для номера части 544:

SQLUINTEGER   PartID;  
SQLINTEGER    PartIDInd = 0;  
  
// Bind the parameter.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0,  
                  &PartID, 0, PartIDInd);  
  
// Place the department number in PartID.  
PartID = 544;  
  
// Execute the statement.  
SQLExecDirect(hstmt, "{call PARTS_IN_ORDERS(?)}", SQL_NTS);  

Чтобы определить, поддерживает ли источник данных процедуры, приложение вызывает SQLGetInfo с параметром SQL_PROCEDURES.

Дополнительные сведения о процедурах см. в разделе "Процедуры".