“Holy location address, DBAtman!”
Recently I needed to decode a rowid so I could find some information about it, I found this bit of code that I thought useful:
SET SERVEROUTPUT ON DECLARE v_rid VARCHAR2(20) ; v_type NUMBER; v_obj NUMBER; v_rfno NUMBER; v_bno NUMBER; v_rno NUMBER; BEGIN v_rid := 'AAAAASAABAAAADxAAb'; dbms_output.put_line('Row_ID = "'||v_rid||'"'); dbms_rowid.rowid_info(CHARTOROWID(v_rid), v_type, v_obj, v_rfno, v_bno, v_rno); IF v_type = 0 THEN dbms_output.put_line('RowID Type -> Restricted'); ELSE dbms_output.put_line('RowID Type -> Extended'); END IF; dbms_output.put_line('Object ID = "'||v_obj||'"'); dbms_output.put_line('Relative File Number = "'||v_rfno||'"'); dbms_output.put_line('Block Number = "'||v_bno||'"'); dbms_output.put_line('Row Number = "'||v_rno||'"'); END; /
Note that I have hard-coded the rowid but it is relatively easy to either edit this or indeed to incorporate this into a procedure.
Here’s the sample output
Row_ID = "AAAAASAABAAAADxAAb" RowID Type -> Extended Object ID = "18" Relative File Number = "1" Block Number = "241" Row Number = "27"
Na, na, na, na, na, na, na, na, na, na, na, na… DBAtman!