value-sensitive カーソルは、メンバシップに対しては感知せず、結果セットの順序と値に対しては感知します。
value-sensitive カーソルは、読み取り専用か更新可能なカーソル・タイプで使用されます。
value-sensitive カーソルは、ISO/ANSI 規格の定義に対応していません。このカーソルは、ODBC キーセット駆動型カーソルに対応します。
インタフェース | カーソル・タイプ | コメント |
---|---|---|
ODBC、ADO/OLE DB | キーセット駆動型 | |
Embedded SQL | SCROLL | |
JDBC | INSENSITIVE と CONCUR_UPDATABLE | iAnywhere JDBC ドライバでは、更新可能な INSENSITIVE カーソルの要求は value-sensitive カーソルで応答される |
Open Client と jConnect | サポートされていない |
変更した基本のローで構成されているローをアプリケーションがフェッチすると、そのアプリケーションは更新された値を表示します。また、SQL_ROW_UPDATED ステータスがアプリケーションに発行されます。削除された基本のローで構成されているローをアプリケーションがフェッチした場合は、SQL_ROW_DELETED ステータスがアプリケーションに発行されます。
プライマリ・キー値に加えられた変更によって、結果セットからローが削除されます (削除として処理され、その後、挿入が続きます)。カーソルまたは外部から結果セットのローが削除されると、特別のケースが発生し、同じキー値を持つ新しいキーが挿入されます。この結果、新しいローと、それが表示されていた古いローが置き換えられます。
結果セットのローが、クエリの選択内容や順序指定に一致するという保証はありません。ローのメンバシップは開かれた時に固定であるため、ローが変更されて WHERE 句または ORDER BY 句と一致しなくなっても、ローのメンバシップと位置はいずれも変更されません。
どの値にも、カーソルを使用して行われた変更に対する感知性があります。カーソルを使用して行われた変更に対するメンバシップの感知性は、ODBC オプションの SQL_STATIC_SENSITIVITY によって制御されます。このオプションが ON になっている場合は、カーソルを使った挿入によってそのカーソルにローが追加されます。それ以外の場合は、結果セットに挿入は含まれません。カーソルを使って削除すると、結果セットからローが削除され、SQL_ROW_DELETED ステータスを返すホールは回避されます。
value-sensitive カーソルは「キー・セット・テーブル」を使用します。カーソルが開かれている場合は、SQL Anywhere が、結果セットを構成する各ローの識別情報をワーク・テーブルに入力します。結果セットをスクロールする場合、結果セットのメンバシップを識別するためにキー・セット・テーブルが使用されますが、値は必要に応じて基本のテーブルから取得されます。
value-sensitive カーソルのメンバシップ・プロパティは固定であるため、アプリケーションはカーソル内のローの位置を記憶でき、これらの位置が変更されないことが保証されます。カーソル感知性の例:削除されたローを参照してください。
ローが更新されたか、カーソルが開かれた後に更新された可能性がある場合、SQL Anywhere は、ローがフェッチされた時点で SQLE_ROW_UPDATED_WARNING を返します。警告が生成されるのは 1 回だけです。同じローをもう一度フェッチしても、警告は生成されません。
更新されたカラムがカーソルによって参照されていなくても、任意のカラムを更新すると警告の原因となります。たとえば、Surname と GivenName に対するカーソルは、Birthdate カラムだけが修正された場合でも更新の内容をレポートします。これらの更新警告とエラー条件は、バルク・オペレーション・モード (-b データベース・サーバ・オプション) でローのロックが解除されている場合は発生しません。バルク・オペレーションのパフォーマンスの側面と最後に読み込まれた後で、ローは更新されています。を参照してください。
前回フェッチした後に修正されたローで位置付け UPDATE 文または DELETE 文の実行を試みると、SQLE_ROW_UPDATED_SINCE_READ エラーが返されて、その文はキャンセルされます。アプリケーションでもう一度ローをフェッチすると UPDATE または DELETE が許可されます。
更新されたカラムがカーソルによって参照されていなくても、任意のカラムを更新するとエラーの原因となります。バルク・オペレーション・モードでは、エラーは発生しません。最後に読み込まれた後で、ローは更新されています。操作はキャンセルされました。を参照してください。
カーソルが開かれた後にカーソルまたは別のトランザクションからローを削除した場合は、カーソルに「ホール」が作成されます。カーソルのメンバシップは固定なので、ローの位置は予約されています。ただし、DELETE オペレーションは、変更されたローの値に反映されます。このホールでローをフェッチすると、現在のローがないことを示す「カーソルの現在のローがありません。
」というエラーが返され、カーソルはホールの上に配置されたままになります。sensitive カーソルを使用するとホールを回避できます。sensitive カーソルのメンバシップは値とともに変化するからです。カーソルの現在のローがありません。を参照してください。
value-sensitive カーソル用にローをプリフェッチすることはできません。この稼働条件は、パフォーマンスに影響を与える場合があります。
複数のローを value-sensitive カーソルを介して挿入する場合、新しいローは結果セットの最後に表示されます。カーソルによるローの変更を参照してください。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |