Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 编程 » SQL Anywhere 数据访问 API » SQL Anywhere ODBC API

 

调用存储过程

本节介绍如何创建和调用存储过程以及如何处理来自 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 );
   }
}