ODBC 動的カーソル
動的カーソルは、単なる動的カーソルです。 カーソルを開いた後に結果セット内のメンバーシップ、順序、値に加えられた変更を検出できます。 たとえば、動的カーソルで 2 つの行がフェッチされた後、別のアプリケーションによって一方の行は更新され、他の行は削除されたものとします。 その後、動的カーソルがこれらの行を再フェッチしようとすると、削除された行は見つかりませんが、更新された行の新しい値が返されます。
動的カーソルは、それ自体と他のユーザーが行った更新、削除、挿入の両方を検出します。 (これは、SQL_ATTR_TXN_ISOLATION接続属性によって設定されるトランザクションの分離レベルに従います)。SQL_ATTR_ROW_STATUS_PTR ステートメント属性で指定された行状態配列には、これらの変更が反映され、SQL_ROW_SUCCESS、SQL_ROW_SUCCESS_WITH_INFO、SQL_ROW_ERROR、SQL_ROW_UPDATED、および SQL_ROW_ADDED を含めることができます。 動的カーソルは、行セットの外部で削除された行を返さないため、結果セット内の削除された行の存在、または行の状態配列内の対応する要素を認識しなくなったため、SQL_ROW_DELETED を返すことができません。 SQL_ROW_ADDED は、行が別のカーソルによって更新された場合ではなく、SQLSetPos の呼び出しによって更新された場合にのみ返されます。
データベースに動的カーソルを実装する方法の 1 つは、結果セットのメンバーシップと順序を定義する選択的インデックスを作成することです。 他のユーザーが変更を行うとインデックスが更新されるため、このようなインデックスに基づくカーソルはすべての変更に影響を受けます。 このインデックスで定義された結果セット内で追加の選択を行うには、インデックスに沿って処理します。
動的カーソルをシミュレートするには、結果セットを一意のキーで並べ替える必要があります。 このような制限により、フェッチは、カーソルが行をフェッチするたびに SELECT ステートメントを実行することによって行われます。 たとえば、結果セットがこのステートメントによって定義されるとします。
SELECT * FROM Customers ORDER BY Name, CustID
この結果セット内の次の行セットをフェッチするために、シミュレートされたカーソルは、次の SELECT ステートメントのパラメーターを現在の行セットの最後の行の値に設定し、それを実行します。
SELECT * FROM Customers WHERE (Name > ?) AND (CustID > ?)
ORDER BY Name, CustID
このステートメントでは、2 つ目の結果セットが作成されます。最初の行セットは元の結果セットの次の行セットです。この場合は Customers テーブルの行セットです。 カーソルは、この行セットをアプリケーションに返します。
興味深いことに、この方法で実装された動的カーソルは、実際には多くの結果セットを作成し、元の結果セットへの変更を検出できる点に注意してください。 アプリケーションは、これらの補助結果セットの存在を決して学習しません。カーソルが元の結果セットへの変更を検出できるかのように表示されます。