139 DBMS_ROWID
DBMS_ROWID
パッケージによって、ユーザーはROWID
を作成し、PL/SQLプログラムとSQL文からROWID
に関する情報を取得できます。64文字ベースの外部ROWID
を解析するためのコードを記述しないで、データ・ブロック番号、オブジェクト番号および他のROWID
コンポーネントを検索できます。DBMS_ROWID
は、Oracle Databaseのバージョン7からバージョン8.Xにアップグレードするためのパッケージです。
ノート:
DBMS_ROWID
は、ユニバーサルROWID
(UROWID
)とともには使用しません。
この章のトピックは、次のとおりです:
139.2 DBMS_ROWIDのタイプ
DBMS_ROWID
には4つのタイプがあります。
それらは次のとおりです。
-
拡張タイプと制限タイプ
-
検証タイプ
-
オブジェクト・タイプ
-
変換タイプ
拡張タイプと制限タイプ
次のタイプがあります。
-
RESTRICTED
: 制限付きROWID
-
EXTENDED
: 拡張ROWID
次に例を示します。
rowid_type_restricted constant integer := 0; rowid_type_extended constant integer := 1;
ノート:
拡張ROWID
は、Oracle Databaseのバージョン8.Xi以上でのみ使用されます。
検証タイプ
表139-1 検証タイプ
結果 | 説明 |
---|---|
|
有効 |
|
無効 |
次に例を示します。
rowid_is_valid constant integer := 0; rowid_is_invalid constant integer := 1;
オブジェクト・タイプ
表139-2 オブジェクト・タイプ
結果 | 説明 |
---|---|
|
(制限付き |
次に例を示します。
rowid_object_undefined constant integer := 0;
変換タイプ
表139-3 変換タイプ
結果 | 説明 |
---|---|
|
|
|
文字列フォーマットから、または文字列フォーマットへの変換。 |
次に例を示します。
rowid_convert_internal constant integer := 0; rowid_convert_external constant integer := 1;
139.3 DBMS_ROWIDの例外
この表は、DBMS_ROWIDサブプログラムで発生する例外について説明しています。
表139-4 例外
例外 | 説明 |
---|---|
|
無効なROWID形式。 |
|
ブロックがファイルの最後を超えています。 |
次に例を示します。
ROWID_INVALID exception; pragma exception_init(ROWID_INVALID, -1410); ROWID_BAD_BLOCK exception; pragma exception_init(ROWID_BAD_BLOCK, -28516);
139.4 DBMS_ROWIDの操作上のノート
DBMS_ROWID
には、次の使用上のノートが適用されます。
-
このパッケージにあるファンクションの一部は、
ROWID
などの単一のパラメータを必要とします。このパラメータは、1つの文字またはPL/SQLROWID
で、その内容は必要に応じて制限または拡張されます。 -
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
に違反しています」のエラーが発生した場合は、次の理由が考えられます。-
現行のプロシージャまたはファンクションに問題があるため
-
プラグマなしでプロシージャまたはファンクションをコールしたか、または制限が不十分なプラグマでプロシージャまたはファンクションをコールしたため
-
パッケージの初期化コードに関連したパッケージ・プロシージャまたはファンクションをコールしたか、またはデフォルト値を設定するパッケージ・プロシージャまたはファンクションをコールしたため
-
139.5 DBMS_ROWIDの例
次の例では、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); ...
139.6 DBMS_ROWIDサブプログラムの要約
この表は、DBMS_ROWID
サブプログラムを示し、簡単に説明しています。
表139-5 DBMS_ROWIDパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
|
|
|
|
|
|
拡張 |
|
|
|
行番号を戻します。 |
|
特定の表にある行について、 |
|
|
|
拡張 |
|
|
|
|
139.6.1 ROWID_BLOCK_NUMBERファンクション
このファンクションは、入力されたROWID
のデータベース・ブロック番号を戻します。
構文
DBMS_ROWID.ROWID_BLOCK_NUMBER ( row_id IN ROWID, ts_type_in IN VARCHAR2 DEFAULT 'SMALLFILE') RETURN NUMBER;
プラグマ
pragma RESTRICT_REFERENCES(rowid_block_number,WNDS,RNDS,WNPS,RNPS);
パラメータ
表139-6 ROWID_BLOCK_NUMBERファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
解釈する |
|
行が属する表領域のタイプ(bigfile/smallfile)。 |
例
次のSQL文の例では、ROWID
からブロック番号を選択し、別の表に挿入します。
INSERT INTO T2 (SELECT dbms_rowid.rowid_block_number(ROWID, 'BIGFILE') FROM some_table WHERE key_value = 42);
139.6.2 ROWID_CREATEファンクション
このファンクションによって、コンポーネント部分をパラメータとして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;
プラグマ
pragma RESTRICT_REFERENCES(rowid_create,WNDS,RNDS,WNPS,RNPS);
パラメータ
表139-7 ROWID_CREATEファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
タイプ(制限付きまたは拡張)。 制限付き
|
|
データ・オブジェクト番号(制限付きの場合は |
|
相対ファイル番号。 |
|
このファイル内のブロック番号。 |
|
このブロック内の行番号を戻します。 |
例
ダミーの拡張ROWID
を作成します。
my_rowid := DBMS_ROWID.ROWID_CREATE(1, 9999, 12, 1000, 13);
rowid_object
ファンクションが戻す値を検索します。
obj_number := DBMS_ROWID.ROWID_OBJECT(my_rowid);
変数obj_number
には、9999が入っています。
139.6.3 ROWID_INFOプロシージャ
このプロシージャは、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);
プラグマ
pragma RESTRICT_REFERENCES(rowid_info,WNDS,RNDS,WNPS,RNPS);
パラメータ
表139-8 ROWID_INFOプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
解釈する |
|
タイプ(制限付きまたは拡張)を戻します。 |
|
データ・オブジェクト番号(制限付きの場合は |
|
相対ファイル番号を戻します。 |
|
このファイル内のブロック番号を戻します。 |
|
このブロック内の行番号を戻します。 |
例
この例では、ROWID_CREATE
で作成したROWID
の値を読み込んで戻します。
DBMS_ROWID.ROWID_INFO ( my_rowid, rid_type, obj_num, file_num, block_num, row_num, 'BIGFILE');
139.6.4 ROWID_OBJECTファンクション
このファンクションは、拡張ROWID
のデータ・オブジェクト番号を戻します。
入力されたROWID
が制限付きROWID
の場合は、0(ゼロ)を戻します。
構文
DBMS_ROWID.ROWID_OBJECT ( rowid_id IN ROWID) RETURN NUMBER;
プラグマ
pragma RESTRICT_REFERENCES(rowid_object,WNDS,RNDS,WNPS,RNPS);
パラメータ
表139-9 ROWID_OBJECTファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
解釈する |
ノート:
制限付きROWID
については、ROWID_OBJECT_UNDEFINED
の定数が戻されます。
例
SELECT dbms_rowid.rowid_object(ROWID) FROM emp WHERE empno = 7499;
139.6.5 ROWID_RELATIVE_FNOファンクション
このファンクションは、IN
パラメータで指定されたROWID
の相対ファイル番号を戻します。(ファイル番号は表領域に対して相対的です。)
構文
DBMS_ROWID.ROWID_RELATIVE_FNO ( rowid_id IN ROWID, ts_type_in IN VARCHAR2 DEFAULT 'SMALLFILE') RETURN NUMBER;
プラグマ
pragma RESTRICT_REFERENCES(rowid_relative_fno,WNDS,RNDS,WNPS,RNPS);
パラメータ
表139-10 ROWID_RELATIVE_FNOファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
解釈する |
|
行が属する表領域のタイプ(bigfile/smallfile)。 |
例
次の例のPL/SQLコードは、相対ファイル番号を戻します。
DECLARE file_number INTEGER; rowid_val ROWID; BEGIN SELECT ROWID INTO rowid_val FROM dept WHERE loc = 'Boston'; file_number := dbms_rowid.rowid_relative_fno(rowid_val, 'SMALLFILE'); ...
139.6.6 ROWID_ROW_NUMBERファンクション
このファンクションは、ROWID
IN
パラメータから行番号を抽出します。
構文
DBMS_ROWID.ROWID_ROW_NUMBER ( row_id IN ROWID) RETURN NUMBER;
プラグマ
PRAGMA RESTRICT_REFERENCES(rowid_row_number,WNDS,RNDS,WNPS,RNPS);
パラメータ
表139-11 ROWID_ROW_NUMBERファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
解釈する |
例
行番号を選択します。
SELECT dbms_rowid.rowid_row_number(ROWID) FROM emp WHERE ename = 'ALLEN';
139.6.7 ROWID_TO_ABSOLUTE_FNOファンクション
このファンクションは、指定のスキーマと表にある行について、ファイル番号が絶対番号であるROWID
から、絶対ファイル番号を抽出します。
スキーマ名とスキーマ・オブジェクト名(表名など)がこのファンクションのIN
パラメータとして提供されます。
構文
DBMS_ROWID.ROWID_TO_ABSOLUTE_FNO ( row_id IN ROWID, schema_name IN VARCHAR2, object_name IN VARCHAR2) RETURN NUMBER;
プラグマ
pragma RESTRICT_REFERENCES(rowid_to_absolute_fno,WNDS,WNPS,RNPS);
パラメータ
表139-12 ROWID_TO_ABSOLUTE_FNOファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
解釈する |
|
表が含まれるスキーマの名前。 |
|
表名 |
例
DECLARE abs_fno INTEGER; rowid_val CHAR(18); object_name VARCHAR2(20) := 'EMP'; BEGIN SELECT ROWID INTO rowid_val FROM emp WHERE empno = 9999; abs_fno := dbms_rowid.rowid_to_absolute_fno( rowid_val, 'SCOTT', object_name);
ノート:
パーティション・オブジェクトの名前には、パーティション名やサブパーティション名ではなく、表名を指定する必要があります。
139.6.8 ROWID_TO_EXTENDEDファンクション
このファンクションは、ユーザーが指定するスキーマや表にある行をアドレス指定している制限付き形式の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;
プラグマ
pragma RESTRICT_REFERENCES(rowid_to_extended,WNDS,WNPS,RNPS);
パラメータ
表139-13 ROWID_TO_EXTENDEDファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
変換する |
|
表が含まれるスキーマの名前(オプション)。 |
|
表名(オプション)。 |
|
次の定数が定義されます。
|
戻り値
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_VERIFYファンクション」を参照してください。
139.6.9 ROWID_TO_RESTRICTEDファンクション
このファンクションは、拡張ROWID
を制限付きROWID
形式に変換します。
構文
DBMS_ROWID.ROWID_TO_RESTRICTED ( old_rowid IN ROWID, conversion_type IN INTEGER) RETURN ROWID;
プラグマ
pragma RESTRICT_REFERENCES(rowid_to_restricted,WNDS,RNDS,WNPS,RNPS);
パラメータ
表139-14 ROWID_TO_RESTRICTEDファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
変換する |
|
次の定数が定義されます。
|
139.6.10 ROWID_TYPEファンクション
このファンクションは、ROWID
が制限付きROWID
の場合は0(ゼロ)、拡張の場合は1を戻します。
構文
DBMS_ROWID.ROWID_TYPE ( rowid_id IN ROWID) RETURN NUMBER;
プラグマ
pragma RESTRICT_REFERENCES(rowid_type,WNDS,RNDS,WNPS,RNPS);
パラメータ
表139-15 ROWID_TYPEファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
解釈する |
例
IF DBMS_ROWID.ROWID_TYPE(my_rowid) = 1 THEN my_obj_num := DBMS_ROWID.ROWID_OBJECT(my_rowid);
139.6.11 ROWID_VERIFYファンクション
このファンクションは、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;
プラグマ
pragma RESTRICT_REFERENCES(rowid_verify,WNDS,WNPS,RNPS);
パラメータ
表139-16 ROWID_VERIFYファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
検証する |
|
表が含まれるスキーマの名前。 |
|
表名 |
|
次の定数が定義されます。
|