过程参数
过程调用中的参数可以是输入、输入/输出或输出参数。 这不同于所有其他 SQL 语句中的参数,这些参数始终是输入参数。
输入参数用于将值发送到过程。 例如,假设“部件”表包含 PartID、Description 和 Price 列。 InsertPart 过程可能具有表中每列的输入参数。 例如:
{call InsertPart(?, ?, ?)}
在 SQLExecDirect 或 SQLExecute 返回 SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR、SQL_INVALID_HANDLE 或 SQL_NO_DATA 之前,驱动程序不应修改输入缓冲区的内容。 当 SQLExecDirect 或 SQLExecute 返回 SQL_NEED_DATA 或 SQL_STILL_EXECUTING 时,不应修改输入缓冲区的内容。
输入/输出参数用于将值发送到过程并从过程中检索值。 使用相同的参数作为输入和输出参数往往令人困惑,应予以避免。 例如,假设某个过程接受订单 ID 并返回客户的 ID。 这可以使用单个输入/输出参数进行定义:
{call GetCustID(?)}
最好使用两个参数:订单 ID 的输入参数和客户 ID 的输出或输入/输出参数:
{call GetCustID(?, ?)}
输出参数用于检索过程返回值并从过程参数中检索值;返回值的过程有时称为函数。 例如,假设刚才提到的 GetCustID 过程返回一个指示它是否能够找到顺序的值。 在以下调用中,第一个参数是用于检索过程返回值的输出参数,第二个参数是用于指定订单 ID 的输入参数,第三个参数是用于检索客户 ID 的输出参数:
{? = call GetCustID(?, ?)}
驱动程序处理过程中的输入和输出参数的值与处理其他 SQL 语句中的输入参数不同。 执行语句时,它们会检索绑定到这些参数的变量的值,并将其发送到数据源。
执行语句后,驱动程序会将输入/输出和输出参数的返回值存储在绑定到这些参数的变量中。 在提取完成过程返回的所有结果且 SQLMoreResults 返回 SQL_NO_DATA 之后,才能保证设置这些返回的值。 如果执行语句导致错误,则输入/输出参数缓冲区或输出参数缓冲区的内容未定义。
应用程序通过调用 SQLProcedure 来确定过程是否具有返回值。 它调用 SQLProcedureColumns 来确定每个过程参数的类型(返回值、输入、输入/输出或输出)。