データベース・サーバーでは、ヒープ表および索引構成表という2種類の表編成が使用されています。
デフォルトでは、ヒープ表が使用されます。物理的な行アドレス(ROWID)は、ヒープ表の行を識別するためのパーマネント・プロパティです。物理ROWIDの外部文字書式は、ベース64でエンコーディングした18バイトの文字列です。
索引構成表には、永続識別子としての物理行アドレスはありません。これらの表には、論理ROWIDが定義されています。索引構成表からのSELECT ROWID...文を使用するとき、ROWIDは、表の主キー、制御情報、および物理的な推測を含む不透明な構造です。表から値を検索するために、「WHERE ROWID = ...」などの句を含むSQL文でこのROWIDを使用できます。
ユニバーサルROWIDは、物理ROWIDと論理ROWIDの両方で使用できます。表編成の変更はアプリケーションに影響しないため、ユニバーサルROWIDを使用すると、ヒープ表または索引構成表のデータにアクセスできます。ROWIDに使用される列データ型はUROWID(length)で、length
はオプションです。
新しいアプリケーションでは、ユニバーサルROWIDを使用してください。
ユニバーサルROWIDの詳細は、『Oracle Database概要』を参照してください。
ユニバーサルROWID変数の使用方法は、次のとおりです。
OCIROWIDへのタイプ・ポインタとして宣言します。
ユニバーサルROWID変数用のメモリーを割り当てます。
ユニバーサルROWIDをホスト・バインド変数として使用します。
終了時にメモリーを解放します。
次に例を示します。
OCIRowid *my_urowid ; ... EXEC SQL ALLOCATE :my_urowid ; /* Bind my_urowid as type SQLT_RDD -- no implicit conversion */ EXEC SQL SELECT rowid INTO :my_urowid FROM my_table WHERE ... ; ... EXEC SQL UPDATE my_table SET ... WHERE rowid = :my_urowid ; EXEC SQL FREE my_urpwid ; ...
また、19(18バイトとヌル終端文字)から4001の幅を持つ文字ホスト変数を、ユニバーサルROWIDのホスト・バインド変数として使用することもできます。文字ベースのユニバーサルROWIDはヒープ表でもサポートされていますが、下位互換性しかありません。ユニバーサルROWIDは可変長であるため、切り捨てられる場合があります。
文字変数の使用方法は、次のとおりです。
/* n is based on table characteristics */ int n=4001 ; char my_urowid_char[n] ; ... EXEC SQL ALLOCATE :my_urowid_char ; /* Bind my_urowid_char as SQLT_STR */ EXEC SQL SELECT rowid INTO :my_urowid_char FROM my_table WHERE ... ; EXEC ORACLE OPTION(CHAR_MAP=STRING); EXEC SQL UPDATE my_table SET ... WHERE rowid = :my_urowid_char ; EXEC SQL FREE :my_urowid_char ; ...
関連項目:
ユニバーサルROWIDを使用した位置付け更新の例は、位置付け更新を参照してください。
SQLLIB関数SQLRowidGet()を使用すると、最後に挿入、更新または選択された行のユニバーサルROWIDへのポインタを取得できます。関数プロトタイプとその引数は、次のとおりです。
void SQLRowidGet (dvoid *rctx, OCIRowid **urid) ;
rctx (IN)
これは、ランタイム・コンテキストへのポインタです。デフォルト・コンテキストまたは非スレッドの場合は、SQL_SINGLE_RCTXを渡します。
urid (OUT)
これは、ユニバーサルROWIDポインタへのポインタです。通常の実行が終了すると、有効なROWIDをポイントします。エラーが発生した場合は、NULLが戻されます。
注意:
SQLRowidGet()をコールするには、ユニバーサルROWIDポインタを事前に割り当てる必要があります。その後、ユニバーサルROWIDにFREEを使用してください。