変更ビューの API サポート(API ガイド)

提供: InterBase

動的 SQL での作業 へ戻る


変更ビュー API のサポートは、拡張 SQLVAR 構造体、XSQLVAR によって、新たな SQLIND メンバの解釈を通じて提供されています。 レビューするには、開発者は、XSQLVAR.SQLIND の変数へのポインタを配置し、NULL 状態を要求します。 クエリが実行されると、InterBase は 返された行の列の値が NULL 以外の場合には、0 をポインタのアドレスに配置し、NULL の場合には -1 を設定します。

新しい解釈のもとでは、NULL 状態と CHANGE 状態の双対概念が、SQLIND メンバ変数にオーバーレイされています。 SQLIND 変数の下位ビットが、列の変更インジケータとして予約されています: ビット 0 は INSERT; ビット 1 は UPDATE; ビット 2 は DELETE; そしてビット 3 は CHANGE を示します。 3 ビットのビット論理和は、ある種のデータの変更を示します。ただし、3 つの変更ビットすべてがセットされており、それが値が変更されていない(つまり、前回確認したときと同じ値である)ことを示している場合を除きます。 NULL 状態をチェックするには、開発者は、SQLIND が明らかに -1 の値かどうかより、0 未満かどうかをチェックすべきです。 SQLIND アドレスに格納された 0 以上の値は、NULL 値以外を示します。

NULL ではない NULL 変更ステータス

SQLIND = 0

SQLIND = -1

変更ビューとサブスクリプションが使用されない場合に、昔の SQLIND 値が返される。 変更ステータスは未定義。

SQLIND >= 0

SQLIND < 0

新しい SQLIND 値。 変更ステータスは、表示される可能性があり、テスト可能(以下のように)

SQLIND > 0

SQLIND < -1

新しい SQLIND 値。 変更ステータスは、表示される可能性があり、テスト可能(以下のように)

一旦、SQLIND 値が変更ステータスを保有していることが判別されたら、特定の状態のためにテストする前に、SQLIND_NULL ビットが存在する可能性をクリアしておかなければなりません。 次の SQLIND_xxxxxx 定義が、<ibase.h> に含まれています。 これら定義に対して、さまざまなビット論理和オペレーションを実行する前に、関心のある変更ステータスを対象にテストすることができます。

SQLIND 値 変更ステータス
SQLIND_CHANGE_VIEW 列の値は<同じ>値。変更なし。
SQLIND_CHANGE 列の値が変更されたかどうか<不明>。
SQLIND_CHANGE_VIEW | [ SQLIND_CHANGE ] | { SQLIND_INSERT | SQLIND_UPDATE | SQLIND_DELETE } SQL オペレーションのある組み合わせが、列値を変更した。

SQLIND_CHANGE_VIEW はタグ ビットで、変更ステータスの存在を示します。 残りの定義は、FOR ROW 句のオプション(それぞれ CHANGE、INSERT、UPDATE、DELETE)に相当します。 変更された行は、列値の変更の存在が検知されるとすぐに返されるため、CHANGE オプションは、<不明> 変更ステータスとなる場合があります。 実際変更されたそれらの列値は、他が <不明> の状態を返す間に、明確な状態を返します。

サブスクリプションによって行われたデータへの変更は、あとから監視した場合、そのサブスクリプションからは見えません。 これは、双方向レプリケーション内のコンポーネントとしてあり得る、変更ビューのアプリケーションのための礼となります。 レプリケーションのペアの一方が、他方をそれらの論理的変更で更新した場合、その他方が逆方向でレプリケートする際に、その他方はそれら変更を反映返すことは望まないでしょう。