DBMS_ROWIDパッケージによって、ユーザーはROWIDを作成し、PL/SQLプログラムとSQL文からROWIDに関する情報を取得できます。64文字ベースの外部ROWIDを解析するためのコードを記述しないで、データ・ブロック番号、オブジェクト番号および他のROWIDコンポーネントを検索できます。DBMS_ROWIDは、Oracle Databaseのバージョン7からバージョン8.Xにアップグレードするためのパッケージです。
|
注意: DBMS_ROWIDは、ユニバーサルROWID(UROWID)とともには使用しません。 |
この章では、次の項目について説明します。
セキュリティ・モデル
タイプ
例外
使用上の注意
例
次のタイプがあります。
RESTRICTED: 制限付きROWID
EXTENDED: 拡張ROWID
次に例を示します。
rowid_type_restricted constant integer := 0; rowid_type_extended constant integer := 1;
|
注意: 拡張ROWIDは、Oracle Databaseのバージョン8.Xi以上でのみ使用されます。 |
次に例を示します。
ROWID_INVALID exception; pragma exception_init(ROWID_INVALID, -1410); ROWID_BAD_BLOCK exception; pragma exception_init(ROWID_BAD_BLOCK, -28516);
このパッケージにあるファンクションの一部は、ROWIDなどの単一のパラメータを必要とします。このパラメータは、1つの文字またはPL/SQL ROWIDで、その内容は必要に応じて制限または拡張されます。
DBMS_ROWIDのファンクションとプロシージャはPL/SQLコードからコールでき、そのファンクションはSQL文で使用することもできます。
|
注意: ROWID_INFOは、プロシージャです。これは、PL/SQLコードでのみ使用できます。 |
DBMS_ROWIDパッケージのファンクションは、他の組込みSQLファンクションと同じように使用でき、すなわち式を使用できる場合は必ず使用できます。次の例では、EMP表にある単一行のブロック番号のみを戻すために、ROWID_BLOCK_NUMBERファンクションが使用されています。
SELECT DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) FROM emp WHERE ename = 'KING';
「ORA: 452,0, サブプログラム'%s'が対応付けられたpragma restrict_referencesに違反しています」のエラーが発生した場合は、次の理由が考えられます。
現行のプロシージャまたはファンクションに問題があるため
プラグマなしでプロシージャまたはファンクションをコールしたか、または制限が不十分なプラグマでプロシージャまたはファンクションをコールしたため
パッケージの初期化コードに関連したパッケージ・プロシージャまたはファンクションをコールしたか、またはデフォルト値を設定するパッケージ・プロシージャまたはファンクションをコールしたため
次の例では、EMP表にある行のROWIDを戻し、DBMS_ROWIDパッケージのROWID_OBJECTファンクションを使用して、そのROWIDからデータ・オブジェクト番号を抽出して表示します。
DECLARE
object_no INTEGER;
row_id ROWID;
...
BEGIN
SELECT ROWID INTO row_id FROM emp
WHERE empno = 7499;
object_no := DBMS_ROWID.ROWID_OBJECT(row_id);
DBMS_OUTPUT.PUT_LINE('The obj. # is '|| object_no);
...
表137-5 DBMS_ROWIDパッケージのサブプログラム
| サブプログラム | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
拡張 |
|
|
|
|
|
行番号を戻します。 |
|
|
特定の表にある行について、 |
|
|
|
|
|
拡張 |
|
|
|
|
|
|
このファンクションは、入力されたROWIDのデータベース・ブロック番号を戻します。
構文
DBMS_ROWID.ROWID_BLOCK_NUMBER ( row_id IN ROWID, ts_type_in IN VARCHAR2 DEFAULT 'SMALLFILE') RETURN NUMBER;
このファンクションによって、コンポーネント部分をパラメータとしてROWIDを作成します。
Oracleサーバーでは、データベース内のデータを指す有効なROWIDを作成することしかできないため、このファンクションは、ROWID操作のテストに役立ちます。
構文
DBMS_ROWID.ROWID_CREATE ( rowid_type IN NUMBER, object_number IN NUMBER, relative_fno IN NUMBER, block_number IN NUMBER, row_number IN NUMBER) RETURN ROWID;
パラメータ
表137-7 ROWID_CREATEファンクションのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タイプ(制限付きまたは拡張)。 制限付き
|
|
|
データ・オブジェクト番号(制限付きの場合は |
|
|
相対ファイル番号。 |
|
|
このファイル内のブロック番号。 |
|
|
このブロック内の行番号を戻します。 |
このプロシージャは、ROWIDのタイプ(制限付きまたは拡張)を含めた情報と、ROWIDのコンポーネントを戻します。これはプロシージャで、SQL文では使用できません。
構文
DBMS_ROWID.ROWID_INFO ( rowid_in IN ROWID, rowid_type OUT NUMBER, object_number OUT NUMBER, relative_fno OUT NUMBER, block_number OUT NUMBER, row_number OUT NUMBER);
このファンクションは、拡張ROWIDのデータ・オブジェクト番号を戻します。入力されたROWIDが制限付きROWIDの場合は、0(ゼロ)を戻します。
このファンクションは、INパラメータで指定されたROWIDの相対ファイル番号を戻します。(ファイル番号は表領域に対して相対的です。)
構文
DBMS_ROWID.ROWID_RELATIVE_FNO ( rowid_id IN ROWID, ts_type_in IN VARCHAR2 DEFAULT 'SMALLFILE') RETURN NUMBER;
このファンクションは、指定のスキーマと表にある行について、ファイル番号が絶対番号であるROWIDから、絶対ファイル番号を抽出します。スキーマ名とスキーマ・オブジェクト名(表名など)がこのファンクションのINパラメータとして提供されます。
構文
DBMS_ROWID.ROWID_TO_ABSOLUTE_FNO ( row_id IN ROWID, schema_name IN VARCHAR2, object_name IN VARCHAR2) RETURN NUMBER;
このファンクションは、ユーザーが指定するスキーマや表にある行をアドレス指定している制限付き形式のROWIDを、拡張ROWID形式に変換します。このファンクションは、今後、このパッケージから削除されて別の場所に移動する可能性があります。
構文
DBMS_ROWID.ROWID_TO_EXTENDED ( old_rowid IN ROWID, schema_name IN VARCHAR2, object_name IN VARCHAR2, conversion_type IN INTEGER) RETURN ROWID;
戻り値
ROWID_TO_EXTENDEDは、拡張文字列形式でROWIDを戻します。入力されたROWIDがNULLの場合、ファンクションはNULLを戻します。ゼロ値(00000000.0000.0000)のROWIDが提供されると、ゼロ値の制限付きROWIDが戻されます。
例
SCOTTスキーマにRIDSと呼ばれる表があり、その表には、ROWID(制限付き)を保持する列ROWID_COLと、SCOTTスキーマのその他の表を指す列TABLE_COLが含まれていると仮定します。次の文を使用して、ROWIDを拡張形式に変換できます。
UPDATE SCOTT.RIDS
SET rowid_col =
dbms_rowid.rowid_to_extended (
rowid_col, 'SCOTT", TABLE_COL, 0);
使用上の注意
スキーマ名とオブジェクト名がINパラメータとして提供されると、このファンクションは、指定の表におけるSELECT認可レベルを検証し、表のデータ・オブジェクト番号を使用して、提供された制限付きROWIDを拡張ROWIDに変換します。ROWID_TO_EXTENDEDは値を戻しますが、このファンクションがコールされたとき、または拡張ROWIDが実際に使用されたときに、変換されたROWIDが表内の有効な行を実際に参照していることは保証しません。
スキーマ名とオブジェクト名が提供されない場合(NULLとして渡された場合)、このファンクションは、提供された制限付きROWIDが指定しているページをフェッチしようとします。ROWIDに格納されているファイル番号は、絶対ファイル番号として処理されます。このため、そのファイルが削除されていたり、その番号が移行前にも使用されている場合は問題が生じます。フェッチされたページが有効な表に属している場合、この表のデータ・オブジェクト番号は拡張ROWID値への変換時に使用されます。これは非常に効率が悪いため、ターゲット表が不明な場合に最終手段としてのみ行うことをお薦めします。ユーザーは、変換された値の使用時にも、正しい表名を覚えている必要があります。
拡張ROWID値が提供された場合、入力した拡張ROWIDのデータ・オブジェクト番号は、表名パラメータから計算されたデータ・オブジェクト番号と照合して検証されます。2つの番号が一致しない場合は、INVALID_ROWID例外が発生します。一致する場合は、入力したROWIDが戻されます。
ROWID_TO_EXTENDEDはパーティション表では使用できません。
このファンクションは、ROWIDを検証します。入力した制限付きROWIDが、入力スキーマ名と表名を指定して、拡張形式に変換できる場合は、0を戻し、変換できない場合は1を戻します。
|
注意: 次の例に示すように、このファンクションをSQL文のWHERE句で使用できます。 |
構文
DBMS_ROWID.ROWID_VERIFY ( rowid_in IN ROWID, schema_name IN VARCHAR2, object_name IN VARCHAR2, conversion_type IN INTEGER RETURN NUMBER;