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_columns の値は 0 になります。わかりやすくするためにエラーチェックは省いています。
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 );
この例では、結果セットを返すプロシージャを呼び出しています。ここでは、プロシージャが 2 つのカラムの結果セットを返すため、変数 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 ); } }