rowid เ็ป็น column ที่ unique เก็บ address ของ row นั้นๆ
SQL> select rowid, id from A;
ROWID ID
------------------ ----------
AAAUd2AAHAAAACTAAB 1
AAAUd2AAHAAAACTAAC 2
ตั้งแต่ Oracle Release 8i เราจะพบ Extended Rowids ซึ่งจะเก็บด้วย BASE64 Encoding
ซึ่่งแบ่งเป็น 4 ส่วน
- OOOOOO: เรียกว่า data object number จะเป็นตัวบอกเกี่ยวกับ segment
- FFF: ตัวบอกกี่ยวกับ datafile number
- BBBBBB: เป็นตัวบอกว่าอยู่บน block number อะำไรของ datafile...
- RRR: row...
SELECT ROWID,
SUBSTR(ROWID,1,6) "OBJECT",
SUBSTR(ROWID,7,3) "FIL",
SUBSTR(ROWID,10,6) "BLOCK",
SUBSTR(ROWID,16,3) "ROW" from A;
ROWID OBJECT FIL BLOCK ROW
------------------ ------------------------ ------------ ------------------------ ------------
AAAUd2AAHAAAACTAAB AAAUd2 AAH AAAACT AAB
AAAUd2AAHAAAACTAAC AAAUd2 AAH AAAACT AAC
อย่างไรก็ตามเราสามารถหาข้อมูล เกี่ยวกับ rowid โดยใช้ dbms_rowid
> เช็ค datafile ที่ rowid อยู่
SQL> select file_name
2 from dba_data_files
3 where file_id = dbms_rowid.rowid_to_absolute_fno('AAAUd2AAHAAAACTAAB', user, 'A');
FILE_NAME
--------------------------------------------------------------------------------
+DATA1/test.274.673800173
> เช็ค block ที่ rowid อยู่
SQL> select dbms_rowid.rowid_block_number('AAAUd2AAHAAAACTAAB') from dual;
DBMS_ROWID.ROWID_BLOCK_NUMBER('AAAUD2AAHAAAACTAAB')
---------------------------------------------------
147
> และสามารถเช็คได้ว่า อยู่ที่ row ไหน
SQL> select dbms_rowid.rowid_row_number('AAAUd2AAHAAAACTAAB') from dual;
DBMS_ROWID.ROWID_ROW_NUMBER('AAAUD2AAHAAAACTAAB')
-------------------------------------------------
1
เรายังสามารถใช้ rowid ได้มากมาย...