位置指定操作による行の変更
更新可能なカーソルは、カーソルによって行を更新するデータ変更ステートメントをサポートしています。更新可能なカーソル内の行を位置指定すると、そのカーソル内の現在の行の構築に使用されたベース テーブルの行に対して、更新操作または削除操作を実行できます。この操作を位置指定更新といいます。
位置指定更新は、カーソルを開いた接続上で実行されます。このため、そのカーソルと同じトランザクション空間を共有してデータ変更を行うことができるので、そのカーソルが保持するロックによって更新がブロックされることはありません。
カーソル内で位置指定更新を実行するには、次の 2 つの方法があります。
- Transact-SQL の UPDATE ステートメントまたは DELETE ステートメントの WHERE CURRENT OF 句
- ODBC の SQLSetPos 関数など、データベース API の位置指定更新関数または位置指定更新メソッド
Transact-SQL による位置指定更新の実行
カーソル内の特定の行に基づいて変更を行う必要がある場合、通常は、Transact-SQL ストアド プロシージャ、トリガ、およびスクリプトの中で Transact-SQL の WHERE CURRENT OF 句が使用されます。ストアド プロシージャ、トリガ、またはスクリプトは次の処理を実行します。
- DECLARE ステートメントと OPEN ステートメントでカーソルを宣言して開きます。
- FETCH ステートメントを使用して、カーソル内の行を位置指定します。
- WHERE CURRENT OF 句を使用した UPDATE ステートメントまたは DELETE ステートメントを実行します。DECLARE ステートメントの cursor_name を WHERE CURRENT OF 句の cursor_name として使用します。
API による位置指定更新の実行
OLE DB と ADO の関数とメソッドによって作成されたカーソルには名前がないため、WHERE CURRENT OF 句で使用されません。ただし、ODBC では、SQLGetCursorName 関数を使用して API サーバー カーソルの名前を取得できます。Transact-SQL ステートメントを実行することによりカーソル属性を設定してカーソルを開いた後、SQLGetCursorName 関数を使用してカーソルの名前を取得します。カーソル内で位置指定を行った後、WHERE CURRENT OF 句を伴う UPDATE ステートメントまたは DELETE ステートメントを実行して、SQLGetCursorName により返された名前を参照します。しかし、この方法はお勧めできません。それよりも良い方法は、ODBC API の位置指定更新関数を使用することです。
データベース API は、API サーバー カーソルに対する位置指定操作を実行する 2 つの異なるメソッドをサポートしています。ODBC が 1 つのモデルをサポートし、OLE DB と ADO がもう 1 つのモデルをサポートしています。
ODBC では、カーソル内の列をプログラム変数にバインドしてから、カーソル内の特定の行を位置指定します。位置指定更新を実行する場合、プログラム変数のデータ値を新しい値に変更します。位置指定操作を実行するには、SQLSetPos 関数を呼び出します。
これらの関数のオプションは次のとおりです。
SQLSetPos(SQL_POSITION)
ODBC だけで使用するオプションです。現在の行セットの特定の行に ODBC カーソルを位置付けます。
SQLSetPos(SQL_REFRESH)
カーソルが現在位置付けられている行から取り出した値を使用して、結果セット列にバインドされているプログラム変数を更新します。
SQLSetPos(SQL_UPDATE)
結果セット列にバインドされているプログラム変数に格納されている値を使用して、カーソル内の現在の行を更新します。
SQLSetPos(SQL_DELETE)
カーソル内の現在の行を削除します。
現在の行にロックをかけます。OLE DB と ADO は、異なるモデルを使用して位置指定更新をサポートしています。
OLE DB では、行セット内の行にカーソルを位置付けてから、IRowsetChange::SetData メソッドまたは IRowsetChange::DeleteRows メソッドを呼び出して位置指定更新を実行します。OLE DB プロバイダが IRowsetUpdate::Update をサポートしている場合、IRowsetChange メソッドで行った変更は、IRowsetUpdate::Update を呼び出すまでキャッシュされます。OLE DB プロバイダが IRowsetUpdate::Update をサポートしていない場合、IRowsetChange メソッドで行った変更は直ちに適用されます。
ADO では、レコードセット内の行にカーソルを位置付けてから、Recordset オブジェクトの Update メソッドまたは Delete メソッドを呼び出して位置指定更新を実行します。OLE DB プロバイダが IRowsetUpdate::Update をサポートしている場合、Recordset オブジェクトの Update メソッドまたは Delete メソッドで行った変更は、Recordset オブジェクトの UpdateBatch メソッドを呼び出すまでキャッシュされます。OLE DB プロバイダが IRowsetUpdate::Update をサポートしていない場合、Recordset オブジェクトの Update メソッドまたは Delete メソッドで行った変更は直ちに適用されます。
参照
その他の技術情報
WHERE (Transact-SQL)
位置指定更新 (ODBC)