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_col 的值为零,这是因为该过程不返回结果集。为了使示例更容易读,这里省略了错误检查。
HDBC dbc; HSTMT stmt; long I; SWORD num_col; /* Create a procedure */ 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_col ); do_something( I );
此示例调用一个返回结果集的过程。在此示例中,变量 num_col 的值为 2,因为该过程返回的结果集具有两列。同样,错误检查已被省略,这样该示例便更容易阅读。
HDBC dbc; HSTMT stmt; SWORD num_col; RETCODE retcode; char ID[ 10 ]; char Surname[ 20 ]; /* Create the procedure */ SQLExecDirect( stmt, "CREATE PROCEDURE employees()" \ " 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 employees()", SQL_NTS ); SQLNumResultCols( stmt, &num_col ); SQLBindCol( stmt, 1, SQL_C_CHAR, &ID, sizeof(ID), NULL ); SQLBindCol( stmt, 2, SQL_C_CHAR, &Surname, sizeof(Surname), NULL ); for( ;; ) { retcode = SQLFetch( stmt ); if( retcode == SQL_NO_DATA_FOUND ) { retcode = SQLMoreResults( stmt ); if( retcode == SQL_NO_DATA_FOUND ) break; } else { do_something( ID, Surname ); } }