位置指定更新 (ODBC)
ODBC では、カーソルで位置指定更新を実行するために、次の 2 とおりの方法をサポートします。
- SQLSetPos
- WHERE CURRENT OF 句
SQLSetPos を使用する方法が一般的で、次のオプションがあります。
- SQL_POSITION
現在の行セットの特定行にカーソルを位置付けます。
- SQL_REFRESH
カーソルが現在位置付けられている行から取り出した値で、結果セット列にバインドされているプログラム変数を更新します。
- SQL_UPDATE
結果セット列にバインドされているプログラム変数に格納されている値で、カーソルの現在行を更新します。
- SQL_DELETE
カーソルの現在行を削除します。
SQLSetPos は、ステートメント ハンドル カーソル属性がサーバー カーソルを使用するように設定されている場合に、任意のステートメントの結果セットと併用できます。結果セットの列を、プログラム変数にバインドする必要があります。アプリケーションは行のフェッチ直後に SQLSetPos(SQL_POSTION) を呼び出して行にカーソルを位置付けます。その後、アプリケーションは SQLSetPos(SQL_DELETE) を呼び出して現在行を削除するか、新しいデータ値をバインドされているプログラム変数に移動し、SQLSetPos(SQL_UPDATE) を呼び出して現在行を更新します。
つまり、アプリケーションは SQLSetPos を使用して行セット内の任意の行を更新することも削除することもできます。SQLSetPos の呼び出しは、SQL ステートメントを作成して実行することに代わる簡易的な方法です。SQLSetPos は現在行に対して動作します。また、この方法を使用できるのは SQLFetchScroll を呼び出した後だけです。
行セット サイズを設定するには、属性引数 SQL_ATTR_ROW_ARRAY_SIZE を指定して SQLSetStmtAttr を呼び出します。SQLSetPos は新しい行セット サイズを使用しますが、新しい行セット サイズを使用できるのは SQLFetch または SQLFetchScroll を呼び出した後だけです。たとえば、行セット サイズが変化した場合は、SQLSetPos を呼び出してから、SQLFetch または SQLFetchScroll を呼び出します。SQLSetPos の呼び出しでは、古い行セット サイズを使用しますが、SQLFetch や SQLFetchScroll は新しい行セット サイズを使用します。
行セット内の先頭行の行番号は 1 です。SQLSetPos の RowNumber 引数で、行セット内の行を特定する必要があります。つまり、この引数に指定する値の範囲は、1 から最後にフェッチした行番号までになります。この値には、行セット サイズよりも小さい値を指定できます。RowNumber が 0 の場合、操作は行セット内のすべての行に適用されます。
SQLSetPos の削除操作では、テーブル内の選択された 1 つ以上の行が削除されるようにデータ ソースに指示します。SQLSetPos を使用して行を削除する場合、アプリケーションは Operation に SQL_DELETE、RowNumber に削除する行番号を設定して SQLSetPos を呼び出します。RowNumber が 0 の場合は、行セット内のすべての行が削除されます。
SQLSetPos による操作が完了すると、削除された行が現在行になり、その行の状態は SQL_ROW_DELETED になります。この行は追加の位置指定操作 (SQLGetData や SQLSetPos の呼び出しなど) には使用できません。
行セット内のすべての行を削除する (RowNumber が 0) ときに、アプリケーションは、ドライバが特定の行を削除するのを防ぐことができます。この操作を行うには、SQLSetPos の更新操作と同様に、行操作配列を使用します。
削除対象の各行は、行セット内に存在する行でなければなりません。フェッチによってアプリケーション バッファが設定され、行の状態配列が維持されている場合は、これら各行位置の行の状態値が SQL_ROW_DELETED、SQL_ROW_ERROR、または SQL_ROW_NOROW であってはなりません。
位置指定更新は、UPDATE、DELETE、および INSERT の各ステートメントに WHERE CURRENT OF 句を使用することによっても実行できます。WHERE CURRENT OF には、SQLGetCursorName 関数の呼び出し時に ODBC が生成するカーソル名、または SQLSetCursorName を呼び出して指定できるカーソル名が必要です。次に、ODBC アプリケーションで WHERE CURRENT OF 更新の実行に使用する一般的な手順を示します。
- SQLSetCursorName を呼び出して、ステートメント ハンドルのカーソル名を確立します。
- FOR UPDATE OF 句を指定した SELECT ステートメントを作成し、実行します。
- SQLFetchScroll を呼び出して行セットを取得するか、SQLFetch を呼び出して行を取得します。
- SQLSetPos (SQL_POSITION) を呼び出して、行にカーソルを位置付けます。
- SQLSetCursorName で設定したカーソル名を使用して、WHERE CURRENT OF 句を指定した UPDATE ステートメントを作成し実行します。
または、SELECT ステートメントの実行前に SQLSetCursorName を呼び出すのではなく、SELECT ステートメントの実行後に SQLGetCursorName を呼び出すこともできます。SQLSetCursorName を使用してカーソル名が設定されていなければ、SQLGetCursorName は ODBC によって割り当てられた既定のカーソル名を返します。
サーバー カーソルを使用している場合、SQLSetPos は WHERE CURRENT OF 句よりも優先されます。ODBC カーソル ライブラリで静的で更新可能なカーソルを使用している場合、カーソル ライブラリは、基になるテーブルのキー値を指定した WHERE 句を追加することで、WHERE CURRENT OF 更新を実装します。テーブル内のキーが一意でない場合、意図しない更新が行われることがあります。