Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.
本节介绍如何创建和调用存储过程以及如何处理来自 ODBC 应用程序的结果。
有两种类型的过程:返回结果集的过程和不返回结果集的过程。您可以使用 SQLNumResultCols 来指出差异:如果过程不返回结果集,则结果列数为零。如果有结果集,则可像任何其它游标一样使用 SQLFetch 或 SQLExtendedFetch 来读取值。
过程的参数应当使用参数标记(问号)来传递。使用 SQLBindParameter 可为每个参数标记指派存储区域,无论是 INPUT、OUTPUT 还是 INOUT 参数都可以。
要处理多个结果集,ODBC 必须描述当前正在执行的游标,而不是描述由过程定义的结果集。因此,ODBC 并不总是按照存储过程定义中的 RESULT 子句中的定义来描述列名称。要避免出现此问题,您可以在过程结果集游标中使用列别名。
此示例创建和调用不返回结果集的过程。该过程采用一个 INOUT 参数,并会增加它的值。在此示例中,变量 [num_columns] 的值为零,这是因为该过程不返回结果集。为了使示例更容易读,这里省略了错误检查。
num_columns
HDBC dbc; SQLHSTMT stmt; SQLINTEGER I; SQLSMALLINT num_columns; SQLAllocStmt( dbc, &stmt ); SQLExecDirect( stmt, "CREATE PROCEDURE Increment( INOUT a INT )" "BEGIN " " SET a = a + 1 " "END", SQL_NTS ); /* Call the procedure to increment 'I' */ I = 1; SQLBindParameter( stmt, 1, SQL_C_LONG, SQL_INTEGER, 0, 0, &I, NULL ); SQLExecDirect( stmt, "CALL Increment( ? )", SQL_NTS ); SQLNumResultCols( stmt, &num_columns );
此示例调用一个返回结果集的过程。在此示例中,变量 [num_columns] 的值为 2,因为该过程返回的结果集具有两列。同样,错误检查已被省略,这样该示例便更容易阅读。
SQLRETURN rc; SQLHDBC dbc; SQLHSTMT stmt; SQLSMALLINT num_columns; SQLCHAR ID[ 10 ]; SQLCHAR Surname[ 20 ]; SQLExecDirect( stmt, "CREATE PROCEDURE EmployeeList() " "RESULT( ID CHAR(10), Surname CHAR(20) ) " "BEGIN " " SELECT EmployeeID, Surname FROM Employees " "END", SQL_NTS ); /* Call the procedure - print the results */ SQLExecDirect( stmt, "CALL EmployeeList()", SQL_NTS ); SQLNumResultCols( stmt, &num_columns ); SQLBindCol( stmt, 1, SQL_C_CHAR, &ID, sizeof(ID), NULL ); SQLBindCol( stmt, 2, SQL_C_CHAR, &Surname, sizeof(Surname), NULL ); for( ;; ) { rc = SQLFetch( stmt ); if( rc == SQL_NO_DATA_FOUND ) { rc = SQLMoreResults( stmt ); if( rc == SQL_NO_DATA_FOUND ) break; } else { do_something( ID, Surname ); } }