Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.
この項では、ODBC アプリケーションからストアドプロシージャーを作成して呼び出し、その結果を処理する方法について説明します。
プロシージャーには、結果セットを返すものと返さないものの 2 種類があります。SQLNumResultCols を使用すると、そのどちらであるかを確認できます。プロシージャーが結果セットを返さない場合は、結果カラムの数が 0 になります。結果セットがある場合は、他のカーソルの場合と同様に、SQLFetch または SQLExtendedFetch を使用して値をフェッチできます。
プロシージャーへのパラメーターは、パラメーターマーカー (疑問符) を使用して渡してください。INPUT、OUTPUT、または INOUT パラメーターのいずれについても、SQLBindParameter を使用して各パラメーターマーカー用の記憶領域を割り当てます。
複数の結果セットを処理するために ODBC は、プロシージャーが定義した結果セットではなく、現在実行中のカーソルを記述します。したがって、ODBC はストアドプロシージャー定義の RESULT 句で定義されているカラム名を常に記述するわけではありません。この問題を回避するため、プロシージャー結果セットのカーソルでカラムのエイリアスを使用できます。
この例では、結果セットを返さないプロシージャーを作成して呼び出します。このプロシージャーは、INOUT パラメーターを 1 つ受け取り、その値を増分します。この例では、プロシージャーが結果セットを返さないため、変数 num_col の値は 0 になります。わかりやすくするためにエラーチェックは省いています。
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 );
この例では、結果セットを返すプロシージャーを呼び出しています。ここでは、プロシージャーが 2 つのカラムの結果セットを返すため、変数 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 ); } }