次の方法で共有


SQLMoreResults 関数

準拠
導入されたバージョン: ODBC 1.0 Standards Compliance: ODBC

まとめ
SQLMoreResults は、 SELECTUPDATEINSERT、または DELETE ステートメントを含むステートメントでより多くの結果を使用できるかどうかを判断し、存在する場合は、それらの結果の処理を初期化します。

構文

  
SQLRETURN SQLMoreResults(  
     SQLHSTMT     StatementHandle);  

論争

StatementHandle
[入力]ステートメント ハンドル。

返品ポリシー

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_NO_DATA、SQL_ERROR、SQL_INVALID_HANDLE、またはSQL_PARAM_DATA_AVAILABLE。

診断

SQLMoreResults がSQL_ERRORまたはSQL_SUCCESS_WITH_INFOを返す場合、関連付けられている SQLSTATE 値を取得するには、SQL_HANDLE_STMTの HandleTypeStatementHandleハンドルを使用して SQLGetDiagRec を呼び出します。 次の表に、 SQLMoreResults によって一般的に返される SQLSTATE 値を示し、この関数のコンテキストでそれぞれについて説明します。"(DM)" という表記は、ドライバー マネージャーによって返される SQLSTATEs の説明の前にあります。 特に明記されていない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERROR。

SQLSTATE エラー 説明
01000 一般的な警告 ドライバー固有の情報メッセージ。 (関数はSQL_SUCCESS_WITH_INFOを返します。
01S02 オプション値が変更されました バッチの処理中に変更されたステートメント属性の値。 (関数はSQL_SUCCESS_WITH_INFOを返します。
08S01 通信リンクエラー ドライバーとドライバーが接続されたデータ ソース間の通信リンクは、関数の処理が完了する前に失敗しました。
40001 シリアル化エラー 別のトランザクションでリソースのデッドロックが発生したため、トランザクションがロールバックされました。
40003 ステートメントの入力候補が不明です この関数の実行中に関連付けられた接続が失敗し、トランザクションの状態を特定できません。
HY000 一般的なエラー 特定の SQLSTATE がなく、実装固有の SQLSTATE が定義されていないエラーが発生しました。 *MessageText バッファー内の SQLGetDiagRec によって返されるエラー メッセージには、エラーとその原因が記述されています。
HY001 メモリ割り当てエラー ドライバーは、関数の実行または完了をサポートするために必要なメモリを割り当てませんでした。
HY008 操作が取り消されました StatementHandle に対して非同期処理が有効になりました。 SQLMoreResults 関数が呼び出され、実行が完了する前に、StatementHandleSQLCancel または SQLCancelHandle が呼び出されました。 その後、 SqlMoreResults 関数が StatementHandle で再度呼び出されました。

SQLMoreResults 関数が呼び出され、実行が完了する前に、SQLCancel または SQLCancelHandle がマルチスレッド アプリケーション内の別のスレッドから StatementHandle で呼び出されました。
HY010 関数シーケンス エラー (DM) StatementHandle に関連付けられている接続ハンドルに対して非同期実行関数が呼び出されました。 この非同期関数は、 SQLMoreResults 関数が呼び出されたときにまだ実行されていました。

(DM) 非同期実行関数 (この関数ではない) が StatementHandle に対して呼び出されこの関数が呼び出されたときにはまだ実行されていました。

(DM) SQLExecuteSQLExecDirectSQLBulkOperations、または SQLSetPosStatementHandle に対して呼び出され、SQL_NEED_DATAが返されました。 この関数は、すべての実行時データ パラメーターまたは列に対してデータが送信される前に呼び出されました。
HY013 メモリ管理エラー メモリが不足している可能性があるため、基になるメモリ オブジェクトにアクセスできなかったため、関数呼び出しを処理できませんでした。
HY117 不明なトランザクション状態のため、接続が中断されます。 切断関数と読み取り専用関数のみが許可されます。 (DM) 中断状態の詳細については、「 SQLEndTran 関数を参照してください。
HYT01 接続のタイムアウト データ ソースが要求に応答する前に、接続タイムアウト期間の有効期限が切れています。 接続タイムアウト期間は、SQL_ATTR_CONNECTION_TIMEOUT SQLSetConnectAttr によって設定されます。
IM001 ドライバーは、この関数をサポートしていません (DM) StatementHandle に関連付けられているドライバーは、関数をサポートしていません。
IM017 非同期通知モードでポーリングが無効になっている 通知モデルが使用されるたびに、ポーリングは無効になります。
IM018 SQLCompleteAsync は、このハンドルに対する前の非同期操作を完了するために呼び出されていません。 ハンドルに対する前の関数呼び出しがSQL_STILL_EXECUTINGを返し、通知モードが有効になっている場合は、後処理を実行して操作を完了するために、 SQLCompleteAsync をハンドルで呼び出す必要があります。

コメント

SELECT ステートメントは結果セットを返します。 UPDATEINSERTおよび DELETE ステートメントは、影響を受ける行の数を返します。 これらのステートメントのいずれかがバッチ処理され、パラメーターの配列 (バッチ内に出現する順序でパラメーターの順序が増えて番号が付けられます) で送信された場合、またはプロシージャで、複数の結果セットまたは行数を返すことができます。 ステートメントのバッチとパラメーターの配列については、「SQL ステートメントのバッチとパラメーター値の配列」を参照してください。

バッチの実行後、アプリケーションは最初の結果セットに配置されます。 アプリケーションは、1 つの結果セットがある場合と同様に、最初または後続の結果セットで SQLBindColSQLBulkOperationsSQLFetchSQLGetDataSQLFetchScrollSQLSetPos、およびすべてのメタデータ関数を呼び出すことができます。 最初の結果セットで完了すると、アプリケーションは SQLMoreResults を呼び出して次の結果セットに移動します。 別の結果セットまたはカウントが使用可能な場合、 SQLMoreResults はSQL_SUCCESSを返し、追加の処理のために結果セットまたはカウントを初期化します。 結果セット生成ステートメントの間に行カウント生成ステートメントがある場合は、SQLMoreResults を呼び出すことによってステップオーバーできます。UPDATEINSERT、または DELETE ステートメントに対して SQLMoreResults を呼び出した後、アプリケーションは SQLRowCount を呼び出すことができます。

行がフェッチされていない現在の結果セットがあった場合、 SQLMoreResults はその結果セットを破棄し、次の結果セットまたはカウントを使用できるようにします。 すべての結果が処理された場合、 SQLMoreResults はSQL_NO_DATAを返します。 一部のドライバーでは、すべての結果セットと行数が処理されるまで、出力パラメーターと戻り値を使用できません。 このようなドライバーでは、 SQLMoreResults がSQL_NO_DATAを返すと、出力パラメーターと戻り値が使用可能になります。

前の結果セットに対して確立されたバインディングは引き続き有効です。 この結果セットで列構造が異なる場合、 SQLFetch または SQLFetchScroll を呼び出すと、エラーまたは切り捨てが発生する可能性があります。 これを防ぐには、アプリケーションは SQLBindCol を呼び出して、必要に応じて明示的に再バインドする必要があります (または、記述子フィールドを設定して再バインドする必要があります)。 または、アプリケーションで sqlFreeStmt を呼び出し、 SQL_UNBINDのオプション を指定して、すべての列バッファーのバインドを解除することもできます。

SQLMoreResults の呼び出しによってアプリケーションがバッチ内を移動すると、カーソルの種類、カーソルのコンカレンシー、キーセット サイズ、最大長など、ステートメント属性の値が変更される可能性があります。 この場合、 SQLMoreResults はSQL_SUCCESS_WITH_INFOおよび SQLSTATE 01S02 を返します (オプション値が変更されました)。

SQLCloseCursor または sqlFreeStmtを SQL_CLOSE のオプションで呼び出すと、バッチの実行の結果として使用できたすべての結果セットと行数が破棄されます。 ステートメント ハンドルは、割り当てられた状態または準備された状態に戻ります。 SQLCancel を呼び出して、バッチが実行され、ステートメント ハンドルが実行、カーソル位置、または非同期状態の場合に非同期実行関数を取り消すと、キャンセル呼び出しが成功した場合にバッチによって生成されたすべての結果セットと行数が破棄されます。 その後、ステートメントは準備済みまたは割り当て済み状態に戻ります。

ステートメントまたはプロシージャのバッチが他の SQL ステートメントを SELECTUPDATEINSERTおよび DELETE ステートメントと混在させる場合、これらの他のステートメントは SQLMoreResults には影響しません。

詳細については、「 複数の結果」を参照してください。

ステートメントのバッチ内の検索された更新、挿入、または削除ステートメントがデータ ソースの行に影響しない場合、 SQLMoreResults はSQL_SUCCESSを返します。 これは、SQLExecDirect、SQLExecute、または SQLParamData を介して実行される検索された更新、挿入、または削除ステートメントの場合とは異なり、データ ソースの行に影響しない場合はSQL_NO_DATAを返します。 アプリケーションが SQLRowCount を 呼び出して 、SQLMoreResults の呼び出しが行に影響を与えなかった後に行数を取得した場合、 SQLRowCount はSQL_NO_DATA返します。

結果処理関数の有効なシーケンス処理の詳細については、「 付録 B: ODBC 状態遷移テーブル」を参照してください。

SQL_PARAM_DATA_AVAILABLEおよびストリーム出力パラメーターの詳細については、「 SQLGetData を使用した出力パラメーターの取得」を参照してください。

行数の可用性

バッチに複数の連続する行数生成ステートメントが含まれている場合、これらの行数が 1 つの行数のみにロールアップされる可能性があります。 たとえば、バッチに 5 つの挿入ステートメントがある場合、特定のデータ ソースは 5 つの個別の行数を返します。 他の特定のデータ ソースでは、5 つの個々の行数の合計を表す行数が 1 つだけ返されます。

バッチに結果セット生成ステートメントと行カウント生成ステートメントの組み合わせが含まれている場合、行数がまったく使用できない場合があります。 行数の可用性に関するドライバーの動作は、 SQLGetInfo の呼び出しによって使用可能なSQL_BATCH_ROW_COUNT情報の種類に列挙されます。 たとえば、バッチに SELECT が含まれており、その後に 2 つの INSERT ステートメントと別の SELECT が含まれているとします。 その後、次のケースが考えられます。

  • 2 つの INSERT ステートメントに対応する行数は、まったく使用できません。 SQLMoreResults を最初に呼び出すと、2 番目の SELECT ステートメントの結果セットに移動します。

  • 2 つの INSERT ステートメントに対応する行数は、個別に使用できます。 ( SQLGetInfo を呼び出しても、SQL_BATCH_ROW_COUNT情報型のSQL_BRC_ROLLED_UP ビットは返されません)。 SQLMoreResults を最初に呼び出すと、最初の INSERT の行数が表示され、2 番目の呼び出しでは 2 番目の INSERT の行数が表示されます。 SQLMoreResults の 3 番目の呼び出しでは、2 番目の SELECT ステートメントの結果セットに配置されます。

  • 2 つの INSERT に対応する行数は、使用可能な 1 つの行数にロールアップされます。 ( SQLGetInfo を呼び出すと、SQL_BATCH_ROW_COUNT情報型のSQL_BRC_ROLLED_UP ビットが返されます)。 SQLMoreResults を最初に呼び出すと、ロールアップされた行数が表示され、2 回目の SQLMoreResults の呼び出しによって、2 番目の SELECT の結果セットが表示されます。

一部のドライバーでは、行数は明示的なバッチでのみ使用でき、ストアド プロシージャでは使用できません。

詳細については、次の情報を参照してください。 参照先
ステートメント処理の取り消し SQLCancel 関数の
データブロックのフェッチまたは結果セットのスクロール SQLFetchScroll 関数
1 つの行またはデータ ブロックを順方向にフェッチする SQLFetch 関数
データの列の一部またはすべてをフェッチする SQLGetData 関数

こちらもご覧ください

ODBC API リファレンス
ODBC ヘッダー ファイル
SQLGetData を使用した出力パラメーターの取得