Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - プログラミング » SQL Anywhere でのプログラミングの概要 » アプリケーションでの SQL の使用 » SQL Anywhere のカーソル

 

value-sensitive カーソル

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 カーソルを介して挿入する場合、新しいローは結果セットの最後に表示されます。カーソルによるローの変更を参照してください。