簡単なオブジェクトの例を検証します。型personと表person_tabを作成します。この表には同じくオブジェクト型の列addressが含まれています。
create type person as object ( lastname varchar2(20), firstname char(20), age int, addr address ) / create table person_tab of person;
表にデータを挿入し、処理します。
Pro*C/C++を使用して、lastnameの値を「Smith」から「Smythe」に変更する方法を考えてみます。
OTTを実行して、personにマップするC言語の構造体を生成します。Pro*C/C++プログラムに、OTTによって生成されるヘッダー・ファイルをインクルードする必要があります。
アプリケーション内で、クライアント側キャッシュ内の永続メモリーへのポインタ、person_pを宣言します。それからメモリーを割り当てて、戻されたポインタを使用します。
char *new_name = "Smythe"; person *person_p; ... EXEC SQL ALLOCATE :person_p;
これで、永続オブジェクトのコピーにメモリーが割り当てられます。割当て済オブジェクトには、まだデータは含まれていません。
C言語の代入文か、SELECT文またはFETCH文を使用して既存のオブジェクトを取り出し、キャッシュにデータを入れます。
EXEC SQL SELECT VALUE(p) INTO :person_p FROM person_tab p WHERE lastname = 'Smith';
キャッシュ内のコピーに対する変更結果は、INSERT文、UPDATE文およびDELETE文を使用してサーバー・データベースに送信します。
EXEC SQL OBJECT SET lastname OF :person_p TO :new_name; EXEC SQL INSERT INTO person_tab VALUES(:person_p);
次の文を使用してキャッシュ・メモリーを解放します。
EXEC SQL FREE :person_p;
オブジェクト・キャッシュ内に、REFをオブジェクトpersonにコピーするためのメモリーを割り当てます。ALLOCATE文はREFへのポインタを戻します。
person *person_p; person_ref *per_ref_p; ... EXEC SQL ALLOCATE :per_ref_p;
割当て済のREFには、データが含まれていません。データを入れるには、オブジェクトのREFを取り出します。
EXEC SQL SELECT ... INTO :per_ref_p;
それからREFを間接参照して、オブジェクトのインスタンスをクライアント側のキャッシュに入れます。間接参照コマンドでは、per_ref_pを使用して、キャッシュ内で対応するオブジェクトのインスタンスを作成します。
EXEC SQL OBJECT DEREF :per_ref_p INTO :person_p;
C言語の代入を使用するか、またはOBJECT GET文を使用して、キャッシュ内のデータを変更します。
/* lname is a C variable to hold the result */ EXEC SQL OBJECT GET lastname FROM :person_p INTO :lname; ... EXEC SQL OBJECT SET lastname OF :person_p TO :new_name; /* Mark the changed object as changed with OBJECT UPDATE command */; EXEC SQL OBJECT UPDATE :person_p; EXEC SQL FREE :per_ref_p;
変更をデータベース内で永続的なものにするために、FLUSHを使用します。
EXEC SQL OBJECT FLUSH :person_p;
サーバーが変更されたため、オブジェクトをリリースできます。リリースされるオブジェクトが、オブジェクト・キャッシュ・メモリーからただちに解放されるとはかぎりません。最近の使用頻度が最も低いスタックに置かれます。キャッシュがいっぱいになると、オブジェクトはメモリーからスワップされます。
リリースされるのはオブジェクトのみで、そのオブジェクトを指すREFはキャッシュ内に残留します。REFをリリースするには、REF用のRELEASE文を使用します。person_p
が指すオブジェクトをリリースするには次のようにします。
EXEC SQL OBJECT RELEASE :person_p;
または、確保継続時間が適切に設定されていれば、トランザクション・コミットを発行すると、キャッシュ内のオブジェクトがすべてリリースされます。