SQLBulkOperations() - 行のセットの追加、更新、削除、またはフェッチ

SQLBulkOperations() で、新しい行を現行照会の動的カーソルで関連付けた基本表やビューに追加できます。

SQLBulkOperations() の ODBC 仕様

表 1. SQLBulkOperations() 仕様
ODBC 仕様レベル X/Open CLI CAE 仕様 ISO CLI 仕様
3.0 はい はい

構文

SQLRETURN SQLBulkOperations (
             SQLHSTMT      StatementHandle,
             SQLSMALLINT   Operation);

関数引数

次の表は、この関数のそれぞれの引数ごとに、 データ・タイプ、用途、および説明を示しています。

表 2. SQLBulkOperations の引数
データ・タイプ 引数 使用 説明
SQLHSTMT StatementHandle 入力 ステートメント・ハンドル。
SQLSMALLINT 操作 入力 実行する操作: SQL_ADD。
Db2 ODBC は以下の操作をサポートしていません。
  • SQL_UPDATE_BY_BOOKMARK
  • SQL_DELETE_BY_BOOKMARK
  • SQL_FETCH_BY_BOOKMARK

使用法

SQLBulkOperations() を呼び出す前に、必要な一括操作がサポートされていることを確認する必要があります。 サポートを確認するには、 SQLGetInfo()InfoTypeSQL_DYNAMIC_CURSOR_ATTRIBUTES1 または SQL_DYNAMIC_CURSOR_ATTRIBUTES2 の 以下の属性を検査して、サポートが使用できることを確認します。
  • SQL_CA1_BULK_ADD
  • SQL_CA1_BULK_UPDATE_BY_BOOKMARK
  • SQL_CA1_BULK_DELETE_BY_BOOKMARK
  • SQL_CA1_BULK_FETCH_BY_BOOKMARK

一括操作が SQLBulkOperations() で実行される場合、列を無視できます。 列を無視するには、SQLBindCol() を呼び出し、列の長さとインディケーター・バッファー (pcbValue) を SQL_COLUMN_IGNORE に設定します。

SQLBulkOperations() 呼び出しの後:
  • SQL_ATTR_ROWS_FETCHED_PTR ステートメント属性が指すバッファーに、呼び出しで影響のある行数が含まれます。
  • SQL_ATTR_ROW_STATUS_PTR ステートメント属性が指す行状況配列に、操作の結果が含まれます。
  • ブロック・カーソル位置は未定義です。 アプリケーションは SQLFetchScroll() を呼び出し、カーソル位置を設定します。 アプリケーションは、 SQLFetchScroll()FetchOrientation SQL_FETCH_FIRST、SQL_FETCH_LAST、またはSQL_FETCH_ABSOLUTEを引数として指定する必要があります。 カーソル位置は、アプリケーションが、SQLFetch() または SQLFetchScroll() (FetchOrientation 引数を SQL_FETCH_PRIOR、SQL_FETCH_NEXT または SQL_FETCH_RELATIVE に設定) を呼び出す場合は、未定義です。
アプリケーションは以下を行う必要はありません
  • SQLBulkOperations() を呼び出す前に SQLFetch() または SQLFetchScroll() を呼び出します。
  • SQL_ATTR_ROW_OPERATION_PTR ステートメント属性を SQLBulkOperations() 呼び出しに対して設定します。 一括操作が SQLBulkOperations() で実行される場合、行を無視できます。

Operation 引数が SQL_ADD で、カーソルと関連付けされている照会の選択リストの中に同じ列への複数の参照がある場合、エラーが発生します。

行状況配列: 行状況配列には、SQLBulkOperations() の呼び出し後、行セット内の各行のデータの状況値が含まれます。 この配列は、SQLFetch() または SQLFetchScroll() が呼び出されないうちに SQLBulkOperations() が呼び出される場合、SQLBulkOperations() の呼び出しによって最初にデータを設定します。 SQL_ATTR_ROW_STATUS_PTR ステートメント属性は行状況配列を指します。 行状況配列内のエレメント数は、SQL_ATTR_ROW_ARRAY_SIZE ステートメント属性で定義されたように、行セット内の行数と同じにする必要があります。

戻りコード

  • SQL_SUCCESS
  • SQL_SUCCESS_WITH_INFO
  • SQL_NEED_DATA
  • SQL_STILL_EXECUTING
  • SQL_ERROR
  • SQL_INVALID_HANDLE

診断

表 3. SQLBulkOperations SQLSTATE
SQLSTATE 説明 説明
01 0 00 警告。 通知メッセージ。 (関数は、SQL_SUCCESS_WITH_INFO を返します。)
0700 6 無効な変換です。 Operation 引数が SQL_ADD で、アプリケーション・バッファー内のデータ値が結果セット内の列のデータ・タイプに変換できませんでした。
2 20 01 ストリング・データの右側が切り捨てられました。 列への文字またはバイナリー値の割り当てが、 非ブランク文字 (文字の場合) または非 NULL 文字 (バイナリー数の場合) またはバイトに切り捨てられました。
2 20 03 数値が範囲外です。 Operation 引数は SQL_ADD でした。 結果セット内の列へ数値を割り当てることによって数値全体 (一部とは対照的に) が切り捨てられました。
22008 無効な日付時刻形式または日付時刻フィールドがオーバーフローです。 次の条件のうちの 1 つが発生しています。
  • Operation 引数は SQL_ADD でした。 結果セット内の列に日付値またはタイム・スタンプ値を割り当てによって、年、月、日のフィールドが範囲外になりました。
  • Operation 引数は SQL_ADD でした。 結果セット内の列に送られたデータの日時算術演算の結果、日時フィールド (年、月、日、時、分、または秒フィールド) がフィールドに許容される値の範囲外になったか、グレゴリオ暦の日時値として自然の規則に基づくと無効になりました。
22018 割り当てにエラーがありました。 引数 Operation は SQL_ADD でした。 列に割り当てられたデータ値は、結果セットの関連付けられた列のデータ・タイプと互換性がありませんでした。
23000 整合性の制約違反。 整合性の制約に違反していました。 次の条件のうちの 1 つが発生しています。
  • Operation 引数は SQL_ADD でした。 バインドされていなかった列が、NOT NULL で定義されていて、デフォルトがありません。
  • Operation 引数は SQL_ADD でした。 バインドされた pcbValue で指定された長さが、SQL_COLUMN_IGNORE で列にデフォルト値がありませんでした。
24000 カーソルの状態が無効です。 StatementHandle が実行された状態にあったが、結果セットが StatementHandle と関連付けられていませんでした。
4000 1 トランザクション・ロールバック。 フェッチが実行されたトランザクションは、デッドロックを避けるために終了しました。
4000 3 ステートメントが完了したか不明です。 関連付けられた接続が、この関数の実行中に失敗しました。 トランザクションの状態を判別できません。
42 xxx 1 構文エラーまたはアクセス規則違反。 これらの SQLSTATE は、以下のエラーのいずれかを示しています。
  • 425xx の場合、許可 ID には、Operation 引数で要求された操作を実行するための権限がありません。
  • 42xxx の場合は、ステートメントに関してさまざまな構文上の問題 またはアクセス上の問題があることを示しています。
44000 WITH CHECK OPTION の違反。 Operation 引数は SQL_ADD でした。 挿入または更新が、表示された表か表示された表から派生させられた表で実行されました。 表示された表は、WITH CHECK OPTION を指定することで作成されました。 挿入によって影響を受ける 1 つ以上の行が表示された表にもうありません。
HY000 一般エラー。 特定の SQLSTATE のないエラーが発生しました。 SQLGetDiagRec()*MessageText バッファー に戻したエラー・メッセージに、エラーとその原因が記述されています。
HY001 メモリーの割り当てエラーです。 DB2 ODBC が、関数を実行または完了させるのに必要なメモリーを割り当てることができませんでした。 プロセス・レベルのメモリーが、アプリケーション処理用に使い尽くされている可能性があります。 オペレーティング・システム構成を調べ、プロセス・レベルのメモリー制限を確認してください。
HY010 関数のシーケンス・エラーです。 関数が、実行時データ (SQLParamData() または SQLPutData()) の操作中に呼び出されました。
HY011 この時点で無効な操作です。 SQL_ATTR_ROW_STATUS_PTR ステートメント属性が、SQLFetch() または SQLFetchScroll()SQLBulkOperations の呼び出しの間に設定されました。
HY013 予期しないメモリーの処理エラーです。 Db2 ODBC は、関数の実行または完了をサポートするために必要なメモリーにアクセスできませんでした。
HY090 ストリングまたはバッファーの長さが無効です。 次の条件のうちの 1 つが発生しています。
  • Operation 引数は SQL_ADD でした。 データ値は、NULL ポインタ ーでした。列の長さの値が 0 ではなく、SQL_DATA_AT_EXEC、 SQL_COLUMN_IGNORE、 SQL_NULL_DATA、 ではなく、または SQL_LEN_DATA_AT_EXEC_OFFSET 以下でした。
  • Operation 引数は SQL_ADD でした。 データ値は NULL ポインターではありませんでした。 C データ・タイプは SQL_C_BINARY または SQL_C_CHAR でした。 列の長さの値は、0 より小さいが、 SQL_DATA_AT_EXEC、 SQL_COLUMN_IGNORE、 SQL_NTS、または SQL_NULL_DATA に等 しくないか、 SQL_LEN_DATA_AT_EXEC_OFFSET 以下でした。
HY092 無効な属性 ID です。 Operation 引数は SQL_ADD でした。 SQL_ATTR_CONCURRENCY ステートメント属性は、SQL_CONCUR_READ_ONLY に設定されていました。
HYC0 0 ドライバーは使用できません。 Db2 ODBC またはデータ・ソースは、Operation 引数で要求された操作をサポートしていません。
注:
  1. xxx は、そのクラス・コードの任意の SQLSTATE を表します。 例えば、37xxx は、クラス・コード '37' の 任意の SQLSTATE を表しています。