oracle

Oracle ROWIDとは

ROWID疑似列

ROWID疑似列というくらいなので、「カラム」ではありません。オブジェクト(テーブル)のアドレスとなります。ROWIDは以下項目で構成されます。

  • オブジェクト番号
  • 行が存在するデータファイル番号
  • 行が存在するデータファイルのブロック番号
  • ブロック内での行の位置

またDBMS_ROWID.ROWID_CREATE()ファンクションで導出する事ができます。
以下は行ロックが発生している対象レコードを特定する際の使用例です。ROWIDを導出する事で対象レコードがわかります

DBMS_ROWID.ROWID_CREATE ()ファンクションでrowidを求めるサンプル
select 
 s.ROW_WAIT_OBJ# 
,o.OWNER
,o.OBJECT_NAME
,DBMS_ROWID.ROWID_CREATE (
  rowid_type    =>  1                 --拡張ROWID
 ,object_number => s.ROW_WAIT_OBJ#    --オブジェクト番号
 ,relative_fno  => s.ROW_WAIT_FILE#   --データファイル番号
 ,block_number  => s.ROW_WAIT_BLOCK#  --ブロック番号
 ,row_number    => s.ROW_WAIT_ROW#    --ブロック内行番号
 ) as M_ROWID -- rowidを導出
from v$session s 
inner join dba_objects o on s.ROW_WAIT_OBJ# = o.OBJECT_ID
where s.BLOCKING_SESSION_STATUS='VALID'
;
SQL> select
  2   s.ROW_WAIT_OBJ#
  3  ,o.OWNER
  4  ,o.OBJECT_NAME
  5  ,DBMS_ROWID.ROWID_CREATE (
  6    rowid_type    =>  1                 --拡張ROWID
  7   ,object_number => s.ROW_WAIT_OBJ#    --オブジェクト番号
  8   ,relative_fno  => s.ROW_WAIT_FILE#   --データファイル番号
  9   ,block_number  => s.ROW_WAIT_BLOCK#  --ブロック番号
 10   ,row_number    => s.ROW_WAIT_ROW#    --ブロック内行番号
 11   ) as M_ROWID -- rowidを導出
 12  from v$session s
 13  inner join dba_objects o on s.ROW_WAIT_OBJ# = o.OBJECT_ID
 14  where s.BLOCKING_SESSION_STATUS='VALID'
 15  ;

   ROW_WAIT_OBJ#    OWNER    OBJECT_NAME               M_ROWID
________________ ________ ______________ _____________________
          100061 SOONI    EX01           AAAYbdAAFAAAADVAAF

SQL> select * from sooni.ex01 where rowid='AAAYbdAAFAAAADVAAF'
  2  ;

   SID    SNAME    BIRTHDAY       NOTE    KANA    ROMA
______ ________ ___________ __________ _______ _______
     7 喜多川      00-12-13    納豆は嫌いです

SQL>

ROWNUMはこちら

スポンサーリンク