SQLExecute 関数
準拠
導入されたバージョン: ODBC 1.0 標準コンプライアンス: ISO 92
まとめ
SQLExecute は、ステートメント内にパラメーター マーカーが存在する場合、パラメーター マーカー変数の現在の値を使用して、準備されたステートメントを実行します。
構文
SQLRETURN SQLExecute(
SQLHSTMT StatementHandle);
引数
StatementHandle
[入力]ステートメント ハンドル。
返品
SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NEED_DATA、SQL_STILL_EXECUTING、SQL_ERROR、SQL_NO_DATA、SQL_INVALID_HANDLE、またはSQL_PARAM_DATA_AVAILABLE。
診断
SQLExecute がSQL_ERRORまたはSQL_SUCCESS_WITH_INFOを返す場合、関連付けられている SQLSTATE 値を取得するには、SQL_HANDLE_STMTの HandleType と StatementHandle のハンドルを使用して SQLGetDiagRec を呼び出します。 次の表に、SQLExecute によって一般的に返される SQLSTATE 値を示し、この関数のコンテキストでそれぞれについて説明します。"(DM)" という表記は、ドライバー マネージャーによって返される SQLSTATEs の説明の前にあります。 特に明記されていない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERROR。
SQLSTATE | エラー | 説明 |
---|---|---|
01000 | 一般的な警告 | ドライバー固有の情報メッセージ。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01001 | カーソル操作の競合 | StatementHandle に関連付けられている準備済みステートメントには、配置された更新または削除ステートメントが含まれており、行または複数の行が更新または削除されませんでした。 (複数行の更新の詳細については、SQL_ATTR_SIMULATE_CURSORの説明を参照してください。SQLSetStmtAttr の属性。) (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01003 | set 関数で NULL 値が削除される | StatementHandle に関連付けられた準備済みステートメントにはセット関数 (AVG、MAX、MIN など) が含まれていましたが、COUNT セット関数は含まれず、NULL 引数の値は関数が適用される前に削除されました。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01004 | 文字列データ、右切り捨て | 出力パラメーターに対して返された文字列またはバイナリ データにより、非空白文字または NULL 以外のバイナリ データが切り捨てられました。 文字列値の場合は、右に切り捨てられました。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01006 | 特権が取り消されない | StatementHandle に関連付けられた準備済みステートメントは REVOKE ステートメントであり、ユーザーは指定された特権を持っていませんでした。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01007 | 特権が付与されていません | StatementHandle に関連付けられた準備済みステートメントは GRANT ステートメントであり、指定された特権をユーザーに付与できませんでした。 |
01S02 | オプション値の変更 | 指定されたステートメント属性は、実装の作業条件のために無効であるため、同様の値が一時的に置き換えられました。 (SQLGetStmtAttr を呼び出して、一時的に置換された値が何であるかを判断できます)。置き換え値は、カーソルが閉じられるまで StatementHandle に対して有効です。この時点で、ステートメント属性は前の値に戻ります。 変更できるステートメント属性は、SQL_ATTR_CONCURRENCY、SQL_ATTR_CURSOR_TYPE、SQL_ATTR_KEYSET_SIZE、SQL_ATTR_MAX_LENGTH、SQL_ATTR_MAX_ROWS、SQL_ATTR_QUERY_TIMEOUT、およびSQL_ATTR_SIMULATE_CURSORです。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01S07 | 小数部の切り捨て | 入力/出力または出力パラメーターに対して返されたデータが切り捨てられ、数値データ型の小数部が切り捨てられたか、時刻、タイムスタンプ、または間隔データ型の時間部分の小数部が切り捨てられました。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
07002 | COUNT フィールドが正しくありません | SQLBindParameter で指定されたパラメーターの数が、*StatementText に含まれる SQL ステートメント内のパラメーターの数より少なかった。 SQLBindParameter が呼び出され、ParameterValuePtr が null ポインターに設定され、StrLen_or_IndPtr SQL_NULL_DATAまたはSQL_DATA_AT_EXECに設定されず、InputOutputType がSQL_PARAM_OUTPUTに設定されていないため、SQLBindParameter で指定されたパラメーターの数が*StatementText に含まれる SQL ステートメント内のパラメーターの数を超えています。 |
07006 | 制限付きデータ型属性違反 | バインドされたパラメーターの SQLBindParameter の ValueType 引数によって識別されるデータ値を、SQLBindParameter の ParameterType 引数で識別されるデータ型に変換できませんでした。 SQL_PARAM_INPUT_OUTPUTまたはSQL_PARAM_OUTPUTバインドされたパラメーターに対して返されたデータ値を、SQLBindParameter の ValueType 引数で識別されるデータ型に変換できませんでした。 (1 つ以上の行のデータ値を変換できなかったが、1 つ以上の行が正常に返された場合、この関数はSQL_SUCCESS_WITH_INFOを返します)。 |
07007 | 制限付きパラメーター値違反 | パラメーター型SQL_PARAM_INPUT_OUTPUT_STREAMは、パーツ内のデータを送受信するパラメーターにのみ使用されます。 このパラメーター型では、入力バインド バッファーは使用できません。 このエラーは、パラメーターの型がSQL_PARAM_INPUT_OUTPUTされ、SQLBindParameter で指定された *StrLen_or_IndPtrがSQL_NULL_DATA、SQL_DEFAULT_PARAM、SQL_LEN_DATA_AT_EXEC(len)、またはSQL_DATA_AT_EXECと等しくない場合に発生します。 |
07S01 | 既定のパラメーターの使用が無効です | SQLBindParameter で設定されたパラメーター値がSQL_DEFAULT_PARAMされ、対応するパラメーターは ODBC 正規プロシージャ呼び出しのパラメーターではありません。 |
08S01 | 通信リンクエラー | ドライバーとドライバーが接続されたデータ ソース間の通信リンクは、関数の処理が完了する前に失敗しました。 |
21S02 | 派生テーブルの次数が列リストと一致しない | StatementHandle に関連付けられた準備済みステートメントには CREATE VIEW ステートメントが含まれており、修飾されていない列リスト (SQL ステートメントの列識別子引数のビューに指定された列の数) には、SQL ステートメントのクエリ仕様引数で定義された派生テーブル内の列数よりも多くの名前が含まれていました。 |
22001 | 文字列データ、右切り捨て | 列に文字またはバイナリ値を割り当てると、非空白文字 (文字) または null 以外 (バイナリ) 文字またはバイトが切り捨てられました。 |
22002 | インジケーター変数は必須ですが、指定されていません | SQLBindParameter によって設定されたStrLen_or_IndPtrが null ポインターである出力パラメーターに NULL データがバインドされました。 |
22003 | 範囲外の数値 | StatementHandle に関連付けられた準備済みステートメントにはバインドされた数値パラメーターが含まれており、パラメーター値により、関連付けられたテーブル列に割り当てられると、数値の全体 (小数部ではなく) 部分が切り捨てられます。 1 つ以上の入力/出力パラメーターまたは出力パラメーターに対して数値 (数値または文字列) を返すと、数値の一部全体 (小数部ではなく) が切り捨てられる可能性があります。 |
22007 | datetime 形式が無効です | StatementHandle に関連付けられた準備済みステートメントには、バインドされたパラメーターとして日付、時刻、またはタイムスタンプ構造を含む SQL ステートメントが含まれており、パラメーターはそれぞれ無効な日付、時刻、またはタイムスタンプでした。 入力/出力または出力パラメーターが日付、時刻、またはタイムスタンプ C 構造体にバインドされ、返されたパラメーターの値がそれぞれ無効な日付、時刻、またはタイムスタンプでした。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
22008 | Datetime フィールドオーバーフロー | StatementHandle に関連付けられている準備済みステートメントには、datetime 式を含む SQL ステートメントが含まれていました。このステートメントは、計算されると、無効な日付、時刻、またはタイムスタンプ構造になります。 入力/出力または出力パラメーターに対して計算された datetime 式の結果、日付、時刻、またはタイムスタンプ C 構造体が無効になりました。 |
22012 | 0 で除算しました | StatementHandle に関連付けられた準備済みステートメントには、0 による除算の原因となった算術式が含まれていました。 入力/出力パラメーターまたは出力パラメーターに対して計算された算術式は、0 で除算されます。 |
22015 | 間隔フィールドのオーバーフロー | *StatementText には、間隔 SQL データ型に変換すると有効桁数が失われる正確な数値または間隔パラメーターが含まれていました。 *StatementText には、複数のフィールドを持つ間隔パラメーターが含まれていました。このパラメーターは、列の数値データ型に変換された場合、数値データ型では表現されません。 *StatementText には、間隔 SQL 型に割り当てられたパラメーター データが含まれており、間隔 SQL 型に C 型の値が表されませんでした。 正確な数値または間隔の SQL 型である入力/出力または出力パラメーターを間隔 C 型に割り当てると、有効桁数が失われます。 入力/出力または出力パラメーターが間隔 C 構造体に割り当てられたときに、間隔データ構造内のデータの表現がありませんでした。 |
22018 | キャスト指定の文字値が無効です | *StatementText には、正確または概数、datetime、または間隔データ型の C 型が含まれています。列の SQL 型は文字データ型であり、列の値はバインドされた C 型の有効なリテラルではありません。 入力/出力または出力パラメーターが返されたとき、SQL 型は正確または概数、datetime、または間隔データ型でした。C型はSQL_C_CHAR。列の値が、バインドされた SQL 型の有効なリテラルではありません。 |
22019 | エスケープ文字が無効です | StatementHandle に関連付けられた準備済みステートメントには、WHERE 句に ESCAPE を含む LIKE 述語が含まれており、ESCAPE の後のエスケープ文字の長さが 1 に等しくありません。 |
22025 | エスケープ シーケンスが無効です | StatementHandle に関連付けられている準備済みステートメントには WHERE 句に "LIKE パターン値 ESCAPE エスケープ文字" が含まれており、パターン値のエスケープ文字の後の文字が "%" または "_" に含まれていませんでした。 |
23000 | 整合性制約違反 | StatementHandle に関連付けられている準備済みステートメントにパラメーターが含まれていました。 関連付けられたテーブル列で NOT NULL として定義された列のパラメーター値が NULL であったり、一意の値のみを含む制約がある列に対して重複値が指定されたり、その他の整合性制約に違反したりしました。 |
24000 | カーソル状態が無効 | カーソルが SQLFetch または SQLFetchScroll によって StatementHandle に配置されました。 このエラーは、SQLFetch または SQLFetchScroll がSQL_NO_DATAを返していない場合にドライバー マネージャーによって返され、SQLFetch または SQLFetchScroll がSQL_NO_DATAを返した場合にドライバーによって返されます。 StatementHandle でカーソルが開いています。 StatementHandle に関連付けられた準備済みステートメントには、位置指定された更新ステートメントまたは delete ステートメントが含まれており、カーソルは結果セットの開始前または結果セットの末尾の後に配置されました。 |
40001 | シリアル化エラー | 別のトランザクションでリソースのデッドロックが発生したため、トランザクションがロールバックされました。 |
40003 | ステートメントの入力候補が不明です | この関数の実行中に関連付けられた接続が失敗し、トランザクションの状態を特定できません。 |
42000 | 構文エラーまたはアクセス違反 | ユーザーには、StatementHandle に関連付けられた準備済みステートメントを実行するアクセス許可がありませんでした。 |
44000 | WITH CHECK OPTION 違反 | StatementHandle に関連付けられた準備済みステートメントには、表示されたテーブルまたは WITH CHECK OPTION を指定して作成された表示テーブルから派生したテーブルに対して実行される INSERT ステートメントが含まれていました。これにより、INSERT ステートメントの影響を受ける 1 つ以上の行が表示テーブルに存在しなくなります。 StatementHandle に関連付けられた準備済みステートメントには、表示されたテーブルまたは WITH CHECK OPTION を指定して作成された表示テーブルから派生したテーブルに対して実行される UPDATE ステートメントが含まれていました。これにより、UPDATE ステートメントの影響を受ける 1 つ以上の行が表示テーブルに存在しなくなります。 |
HY000 | 一般的なエラー | 特定の SQLSTATE がなく、実装固有の SQLSTATE が定義されていないエラーが発生しました。 *MessageText バッファー内の SQLGetDiagRec によって返されるエラー メッセージには、エラーとその原因が記述されています。 |
HY001 | メモリ割り当てエラー | ドライバーは、関数の実行または完了をサポートするために必要なメモリを割り当てませんでした。 |
HY008 | 操作が取り消されました | StatementHandle に対して非同期処理が有効になりました。 関数が呼び出され、実行が完了する前に、StatementHandle で SQLCancel または SQLCancelHandle が呼び出されました。 その後、StatementHandle で関数が再度呼び出されました。 関数が呼び出され、実行が完了する前に、SQLCancel または SQLCancelHandle がマルチスレッド アプリケーション内の別のスレッドから StatementHandle で呼び出されました。 |
HY010 | 関数シーケンス エラー | (DM) StatementHandle に関連付けられている接続ハンドルに対して非同期実行関数が呼び出されました。 この非同期関数は、SQLExecute 関数が呼び出されたときにまだ実行されていました。 (DM) StatementHandle に対して SQLExecute、SQLExecDirect、または SQLMoreResults が呼び出され、SQL_PARAM_DATA_AVAILABLE返されました。 この関数は、すべてのストリーミング パラメーターのデータが取得される前に呼び出されました。 (DM) 非同期実行関数 (この関数ではない) が StatementHandle に対して呼び出され、この関数が呼び出されたときにはまだ実行されていました。 (DM) StatementHandle に対して SQLExecute、SQLExecDirect、SQLBulkOperations、または SQLSetPos が呼び出され、SQL_NEED_DATA返されました。 この関数は、すべての実行時データ パラメーターまたは列に対してデータが送信される前に呼び出されました。 (DM) StatementHandle が準備されていません。 |
HY013 | メモリ管理エラー | メモリが不足している可能性があるため、基になるメモリ オブジェクトにアクセスできなかったため、関数呼び出しを処理できませんでした。 |
HY090 | 文字列またはバッファーの長さが無効です | SQLBindParameter で設定されたパラメーター値が null ポインターであり、パラメーターの長さの値が 0、SQL_NULL_DATA、SQL_DATA_AT_EXEC、SQL_DEFAULT_PARAM、または SQL_LEN_DATA_AT_EXEC_OFFSET 以下でした。 SQLBindParameter で設定されたパラメーター値は null ポインターではありません。C データ型はSQL_C_BINARYまたはSQL_C_CHARでした。パラメーターの長さの値は 0 未満でしたが、SQL_NTS、SQL_NULL_DATA、SQL_DEFAULT_PARAM、またはSQL_DATA_AT_EXECではなく、SQL_LEN_DATA_AT_EXEC_OFFSET以下でした。 SQLBindParameter によってバインドされたパラメーター長の値がSQL_DATA_AT_EXECに設定されました。SQL 型は、SQL_LONGVARCHAR、SQL_LONGVARBINARY、または長いデータ ソース固有のデータ型のいずれかでした。また、SQLGetInfo のSQL_NEED_LONG_DATA_LEN情報型は "Y" でした。 |
HY105 | パラメーターの型が無効です | SQLBindParameter の引数 InputOutputType に指定された値がSQL_PARAM_OUTPUTされ、パラメーターが入力パラメーターでした。 |
HY109 | カーソル位置が無効です | 準備されたステートメントは位置指定の更新または削除ステートメントであり、カーソルは削除された行またはフェッチできなかった行に置かれていました (SQLSetPos または SQLFetchScroll によって)。 |
HY117 | 不明なトランザクション状態のため、接続が中断されます。 切断関数と読み取り専用関数のみが許可されます。 | (DM) 中断状態の詳細については、「SQLEndTran 関数」を参照してください。 |
HYC00 | 省略可能な機能が実装されていません | SQL_ATTR_CONCURRENCY属性とSQL_ATTR_CURSOR_TYPE ステートメント属性の現在の設定の組み合わせは、ドライバーまたはデータ ソースではサポートされていませんでした。 SQL_ATTR_USE_BOOKMARKS ステートメント属性はSQL_UB_VARIABLEに設定され、SQL_ATTR_CURSOR_TYPE ステートメント属性は、ドライバーがブックマークをサポートしていないカーソルの種類に設定されました。 |
HYT00 | タイムアウトの期限が切れました | データ ソースが結果セットを返す前に、クエリのタイムアウト期間が期限切れになりました。 タイムアウト期間は、sqlSetStmtAttr (SQL_ATTR_QUERY_TIMEOUT) によって設定されます。 |
HYT01 | 接続のタイムアウト | データ ソースが要求に応答する前に、接続タイムアウト期間の有効期限が切れています。 接続タイムアウト期間は、SQL_ATTR_CONNECTION_TIMEOUT SQLSetConnectAttr を使用して設定されます。 |
IM001 | ドライバーは、この関数をサポートしていません | (DM) StatementHandle に関連付けられているドライバーは、関数をサポートしていません。 |
IM017 | 非同期通知モードでポーリングが無効になっている | 通知モデルが使用されるたびに、ポーリングは無効になります。 |
IM018 | SQLCompleteAsync は、このハンドルに対する前の非同期操作を完了するために呼び出されていません。 | ハンドルに対する前の関数呼び出しがSQL_STILL_EXECUTINGを返し、通知モードが有効になっている場合は、 後処理を実行して操作を完了するために、ハンドルで SQLCompleteAsync を呼び出す必要があります。 |
SQLExecute は、データ ソースがステートメントに関連付けられている SQL ステートメントを評価するタイミングに基づいて、SQLPrepare から返すことができる任意の SQLSTATE を返すことができます。
Comments
SQLExecute は、SQLPrepare によって準備されたステートメントを実行します。 アプリケーションが SQLExecute の呼び出しの結果を処理または破棄した後、アプリケーションは新しいパラメーター値を使用して SQLExecute を再度呼び出すことができます。 準備された実行の詳細については、「準備された実行」を参照してください。
SELECT ステートメントを複数回実行するには、SELECT ステートメントを再実行する前に、アプリケーションで SQLCloseCursor を呼び出す必要があります。
データ ソースが手動コミット モード (明示的なトランザクション開始を必要とする) で、トランザクションがまだ開始されていない場合、ドライバーは SQL ステートメントを送信する前にトランザクションを開始します。 詳細については、「トランザクション」を参照してください。
アプリケーションで SQLPrepare を使用して準備し、SQLExecute を使用して COMMIT または ROLLBACK ステートメントを送信する場合、DBMS 製品間で相互運用することはできません。 トランザクションをコミットまたはロールバックするには、SQLEndTran を呼び出します。
SQLExecute が実行時データ パラメーターを検出すると、SQL_NEED_DATAが返されます。 アプリケーションは、SQLParamData と SQLPutData を使用してデータを送信します。 SQLBindParameter、SQLParamData、SQLPutData、および長いデータの送信に関するページを参照してください。
SQLExecute が、データ ソースの行に影響しない検索された更新、挿入、または削除ステートメントを実行すると、SQLExecute の呼び出しはSQL_NO_DATAを返します。
SQL_ATTR_PARAMSET_SIZE ステートメント属性の値が 1 より大きく、SQL ステートメントに少なくとも 1 つのパラメーター マーカーが含まれている場合、SQLExecute は、SQLBindParameter の呼び出しで *ParameterValuePtr 引数が指す配列内のパラメーター値のセットごとに、SQL ステートメントを 1 回実行します。 詳細については、「パラメーター値の配列」を参照してください。
ブックマークが有効になっていて、ブックマークをサポートできないクエリが実行された場合、ドライバーは属性値を変更し、SQLSTATE 01S02 (オプション値が変更されました) を返すことによって、ブックマークをサポートする環境に強制的に適用する必要があります。 属性を変更できない場合、ドライバーは SQLSTATE HY024 (無効な属性値) を返す必要があります。
Note
接続プールを使用する場合、アプリケーションは、データベースまたはデータベースのコンテキストを変更する SQL ステートメント (SQL Server の USE データベース ステートメントなど) を実行しないでください。SQL Server では、データ ソースによって使用されるカタログが変更されます。
コード例
SQLBindParameter、SQLBulkOperations、SQLPutData、SQLSetPos を参照してください。
関連する関数
情報 | 参照トピック |
---|---|
結果セット内の列へのバッファーのバインド | SQLBindCol 関数 |
ステートメント処理の取り消し | SQLCancel 関数 |
カーソルを閉じる | SQLCloseCursor 関数 |
コミットまたはロールバック操作の実行 | SQLEndTran 関数 |
SQL ステートメントの実行 | SQLExecDirect 関数 |
複数行のデータをフェッチする | SQLFetch 関数 |
データブロックのフェッチまたは結果セットのスクロール | SQLFetchScroll 関数 |
ステートメント ハンドルの解放 | SQLFreeStmt 関数 |
カーソル名を返す | SQLGetCursorName 関数 |
データの列の一部またはすべてをフェッチする | SQLGetData 関数 |
データを送信する次のパラメーターを返す | SQLParamData 関数 |
実行のためのステートメントの準備 | SQLPrepare 関数 |
実行時のパラメーター データの送信 | SQLPutData 関数 |
カーソル名の設定 | SQLSetCursorName 関数 |
ステートメント属性の設定 | SQLSetStmtAttr 関数 |