过程调用

过程是存储在数据源中的可执行对象。 通常,它是一个或更多的已经预编译的 SQL 语句。 调用过程的转义序列是:

{[?=]callprocedure-name[([parameter][,[parameter]]...)]}

其中,procedure-name 指定过程的名称,parameter 指定过程参数。

有关过程调用转义序列的详细信息,请参阅附录 C:SQL 语法中的过程调用转义序列

一个过程可以有零个或多个参数。 它还可以返回值,如语法开头的可选参数标记 ?= 所示。 如果 parameter 是输入或输入/输出参数,它可以是文本或参数标记。 但是,可互操作的应用程序应始终使用参数标记,因为某些数据源不接受文本参数值。 如果 parameter 是输出参数,它必须是参数标记。 在执行过程调用语句之前,参数标记必须与 SQLBindParameter 绑定。

过程调用的输入和输入/输出参数可以省略。 如果使用括号但不带任何参数调用过程,如 {call procedure-name()},则驱动程序将指示数据源使用第一个参数的默认值。 如果该过程不具有任何参数,则它可能会导致过程失败。 如果不带括号调用过程,例如 {call procedure-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);  

要确定数据源是否支持过程,应用程序可以使用 SQL_PROCEDURES 选项来调用 SQLGetInfo

有关过程的详细信息,请参阅过程