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.1 DBMS_ROWIDのセキュリティ・モデル

このパッケージは、パッケージ所有者SYSではなく、コール・ユーザーの権限で実行されます。

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 検証タイプ

結果 説明

VALID

有効ROWID

INVALID

無効ROWID

次に例を示します。

rowid_is_valid   constant integer := 0;
rowid_is_invalid constant integer := 1;

オブジェクト・タイプ

表139-2 オブジェクト・タイプ

結果 説明

UNDEFINED

(制限付きROWIDに対する)オブジェクト番号が定義されていません。

次に例を示します。

rowid_object_undefined constant integer := 0;

変換タイプ

表139-3 変換タイプ

結果 説明

INTERNAL

ROWIDタイプの列から、またはその列への変換。

EXTERNAL

文字列フォーマットから、または文字列フォーマットへの変換。

次に例を示します。

rowid_convert_internal constant integer := 0;
rowid_convert_external constant integer := 1;

139.3 DBMS_ROWIDの例外

この表は、DBMS_ROWIDサブプログラムで発生する例外について説明しています。

表139-4 例外

例外 説明

ROWID_INVALID

無効なROWID形式。

ROWID_BAD_BLOCK

ブロックがファイルの最後を超えています。

次に例を示します。

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/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に違反しています」のエラーが発生した場合は、次の理由が考えられます。

    • 現行のプロシージャまたはファンクションに問題があるため

    • プラグマなしでプロシージャまたはファンクションをコールしたか、または制限が不十分なプラグマでプロシージャまたはファンクションをコールしたため

    • パッケージの初期化コードに関連したパッケージ・プロシージャまたはファンクションをコールしたか、またはデフォルト値を設定するパッケージ・プロシージャまたはファンクションをコールしたため

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パッケージのサブプログラム

サブプログラム 説明

ROWID_BLOCK_NUMBERファンクション

ROWIDのブロック番号を戻します。

ROWID_CREATEファンクション

ROWIDをテスト用に限って作成します。

ROWID_INFOプロシージャ

ROWIDのタイプとコンポーネントを戻します。

ROWID_OBJECTファンクション

拡張ROWIDのオブジェクト番号を戻します。

ROWID_RELATIVE_FNOファンクション

ROWIDのファイル番号を戻します。

ROWID_ROW_NUMBERファンクション

行番号を戻します。

ROWID_TO_ABSOLUTE_FNOファンクション

特定の表にある行について、ROWIDに関連する絶対ファイル番号を戻します。

ROWID_TO_EXTENDEDファンクション

ROWIDを制限付き形式から拡張形式に変換します。

ROWID_TO_RESTRICTEDファンクション

拡張ROWIDを制限付き形式に変換します。

ROWID_TYPEファンクション

ROWIDのタイプを戻します。0は制限タイプ、1は拡張タイプです。

ROWID_VERIFYファンクション

ROWID_TO_EXTENDEDファンクションが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ファンクションのパラメータ

パラメータ 説明

row_id

解釈するROWID

ts_type_in

行が属する表領域のタイプ(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_type

タイプ(制限付きまたは拡張)。

制限付きROWIDについては、rowid_typeパラメータを0(ゼロ)に設定します。拡張ROWIDを作成するには、1を設定します。

rowid_typeを0(ゼロ)に指定すると、指定されたobject_numberパラメータは無視され、ROWID_CREATEファンクションは制限付きROWIDを戻します。

object_number

データ・オブジェクト番号(制限付きの場合はrowid_object_undefined)。

relative_fno

相対ファイル番号。

block_number

このファイル内のブロック番号。

row_number

このブロック内の行番号を戻します。

ダミーの拡張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_in

解釈するROWIDROWIDが制限付き(0)か、または拡張(1)ROWIDかを判別します。

rowid_type

タイプ(制限付きまたは拡張)を戻します。

object_number

データ・オブジェクト番号(制限付きの場合はrowid_object_undefined)を戻します。

relative_fno

相対ファイル番号を戻します。

block_number

このファイル内のブロック番号を戻します。

row_number

このブロック内の行番号を戻します。

この例では、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ファンクションのパラメータ

パラメータ 説明

row_id

解釈するROWID

注意:

制限付き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ファンクションのパラメータ

パラメータ 説明

row_id

解釈するROWID

ts_type_in

行が属する表領域のタイプ(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ファンクションのパラメータ

パラメータ 説明

row_id

解釈するROWID

行番号を選択します。

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ファンクションのパラメータ

パラメータ 説明

row_id

解釈するROWID

schema_name

表が含まれるスキーマの名前。

object_name

表名

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ファンクションのパラメータ

パラメータ 説明

old_rowid

変換するROWID

schema_name

表が含まれるスキーマの名前(オプション)。

object_name

表名(オプション)。

conversion_type

次の定数が定義されます。

ROWID_CONVERT_INTERNAL (:=0)

ROWID_CONVERT_EXTERNAL (:=1)

戻り値

ROWID_TO_EXTENDEDは、拡張文字列形式でROWIDを戻します。入力されたROWIDNULLの場合、ファンクションは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ファンクションのパラメータ

パラメータ 説明

old_rowid

変換するROWID

conversion_type

次の定数が定義されます。

ROWID_CONVERT_INTERNAL (:=0)

ROWID_CONVERT_EXTERNAL (:=1)

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ファンクションのパラメータ

パラメータ 説明

row_id

解釈するROWID

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ファンクションのパラメータ

パラメータ 説明

rowid_in

検証するROWID

schema_name

表が含まれるスキーマの名前。

object_name

表名

conversion_type

次の定数が定義されます。

ROWID_CONVERT_INTERNAL (:=0)

ROWID_CONVERT_EXTERNAL (:=1)

ROWID_TO_EXTENDEDファンクションの例にあるスキーマを考慮しながら、次の文を使用すると、無効なROWIDを変換前に検索できます。これにより、無効を事前に修正できます。

SELECT ROWID, rowid_col 
   FROM SCOTT.RIDS
   WHERE dbms_rowid.rowid_verify(rowid_col, NULL, NULL, 0) =1;