Let's take the following example:
SQL> select rid, sys_op_zone_id(rid) zone_id
2 from
3 (
4 select chartorowid('AAAS5KAAHAAABYDAAA') rid
5 from dual
6 );
RID ZONE_ID
------------------ ------------
AAAS5KAAHAAABYDAAA 324580438021
Recalling that extended ROWID has the following format (a nice picture from Oracle Documentation):
In the binary format that would correspond to:
- Data Object Number -- 32 bits
- Relative File Number -- 10 bits
- Block Number -- 22 bits
- Row Number -- 16 bits
(Block Number) + (Relative File Number) * 2 ^ 22 + (Data Object Number) * 2 ^ 32
Applying the above formula to our ROWID:
SQL> select
2 dbms_rowid.rowid_block_number(rid) +
3 dbms_rowid.rowid_relative_fno(rid) * power(2,22) +
4 dbms_rowid.rowid_object(rid) * power(2,32) base_10
5 from
6 (
7 select chartorowid('AAAS5KAAHAAABYDAAA') rid
8 from dual
9 );
BASE_10
---------------
332370368534019
What's left after that is to slice the number into Zone Map chunk size (2^10 by default, thanks to Timur for pointing that out in the comments sections for the previous post):
SQL> select
2 trunc((
3 dbms_rowid.rowid_block_number(rid) +
4 dbms_rowid.rowid_relative_fno(rid) * power(2,22) +
5 dbms_rowid.rowid_object(rid) * power(2,32)
6 )/power(2,10)) zone_id,
7 sys_op_zone_id(rid) sys_zone_id
8 from
9 (
10 select chartorowid('AAAS5KAAHAAABYDAAA') rid
11 from dual
12 );
ZONE_ID SYS_ZONE_ID
------------ ------------
324580438021 324580438021
That's all there is to it!

No comments:
Post a Comment