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;