调用方法¶
存储过程是存储在数据库中的可执行对象,在神通数据库中,存储过程可以用SQL语言或PL/SQL语言编写,请参见神通数据库的相关文档。 调用存储过程的语法格式为:
{[? =]call 存储过程名称[ ([参数] [,[参数]] …) ]}
神通数据库 ODBC会把这种ODBC语法转义成神通数据库支持的语法:
exec out 存储过程名称[([参数] [,[参数]]...)]
一个存储过程可以有零个或多个参数,它可以有返回值,如语法开头的可选参数标记 ? = 所示。 如果参数是一个in参数或in/out参数,则它可以是具体的值或?号参数标记。 如果参数是out参数,则它必须是?号参数标记。 执行过程调用语句之前,必须与 SQLBindParameter 绑定?号参数标记,但此时SQLBindParameter的InputOutputType必须指定为SQL_PARAM_OUTPUT。
对于返回值、out参数、in/out参数,如果通过SQLBindParameter后,在调用SQLExecDirect或者SQLExecute后,绑定变量的值会被写入过程执行完成后返回的值,如果应用程序要使用这些返回值或者out参数的值,可以从这些绑定变量中去获取。
存储过程调用的in参数或in/out参数可以省略。 如果使用括号(但不带任何参数)调用存储过程,则驱动程序指示数据源使用第一个参数的默认值。 如果该过程不具有任何参数,则这可能会导致过程失败。如果在不使用括号的情况下调用过程(如 {call procedure-name}),驱动程序不会发送任何参数值。
可以为存储过程调用中的in参数或in/out参数指定具体的参数值。 例如,假设过程 InsertOrder 有五个输入参数。 以下对 InsertOrder 的调用省略第一个参数,为第二个参数是具体的值,并为第三个、第四个和第五个参数使用?号参数标记:
{call InsertOrder(, 10, ?, ?, ?)}; //不可互操作!
请注意,如果省略了某个参数,则该参数必须与其他参数分隔开。 如果省略in参数或in/out参数,过程会使用该参数的默认值。 指定in参数或in/out参数默认值的另一种方法是将绑定到参数的长度/指示器缓冲区的值设置为 SQL_DEFAULT_PARAM。
如果省略了in/out参数或为参数提供了具体的值,驱动程序将丢弃输出值。 同样,如果省略过程返回值的?号参数标记,驱动程序将放弃返回值。最后一点,如果应用程序为不返回值的过程指定返回值参数,驱动程序将绑定到该参数的长度/指示器缓冲区的值设置为 SQL_NULL_DATA。
假设存储过程 PARTS_IN_ORDERS 创建一个结果集,该结果集包含包含特定部件号的订单列表。 以下代码为调用此存储过程的示例:
SQLUINTEGER PartID;
SQLINTEGER PartIDInd = 0;
// 将部门号放到绑定参数中
PartID = 544;
// 绑定参数.
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &PartID, 0, PartIDInd);
// 执行SQL语句
SQLExecDirect(hstmt, "{call PARTS_IN_ORDERS(?)}", SQL_NTS);
备注:需要指出,神通数据库的存储过程不能同时支持输出参数和返回结果集;如果应用程序绑定了输出参数,神通数据库 ODBC驱动会认为这是一个没有结果集的存储过程。若要确定驱动否支持过程,应用程序需要使用 SQL_PROCEDURES 选项调用 SQLGetInfo ,可以获得是否支持存储过程的执行。