dbms_rowid.rowid_create函数,此函数可以创建一个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;
rowid_type Type (restricted or extended).
Set the rowid_type parameter to 0 for a restricted ROWID. Set
it to 1 to create an extended ROWID.
If you specify rowid_type as 0, then the required object_
number parameter is ignored, and ROWID_CREATE returns a
restricted ROWID.
object_number Data object number (rowid_object_undefined for restricted).
relative_fno Relative file number.
block_number Block number in this file.
row_number Returns row number in this block.
下面是使用dbms_rowid.rowid_create的一个例子
sys@JINGYONG> select rowid, t.*,dbms_rowid.rowid_relative_fno(rowid) relative_fno , 2 dbms_rowid.rowid_object(rowid) object_number , 3 dbms_rowid.rowid_block_number(rowid) block_number , 4 dbms_rowid.rowid_row_number(rowid) row_number 5 from t where rownum<2; ROWID ID TEXT RELATIVE_FNO OBJECT_NUMBER BLOCK_NUMBER ROW_NUMBER ------------------ ---------- ------------------------------ ------------ ------------- ------------ ---------- AAANB1AABAAAPAaAAA 20 ICOL$ 1 53365 61466 0 sys@JINGYONG> select data_object_id from dba_objects where object_id=53365; DATA_OBJECT_ID -------------- 53365 sys@JINGYONG> select dbms_rowid.rowid_create(1,53365,1,61466,0) create_rowid fr om dual; CREATE_ROWID ------------------ AAANB1AABAAAPAaAAA
通过dbms_rowid.rowid_create(1,53365,1,61466,0)构造的rowid与原始的rowid是一样的.
参数的意思:1表示rowid的类型为扩展rowid,类型为1; data_object_id 为53365,也就是文中t表对象的id; 数据文件id为1 ,即system表空间文件;块的编号为61466号; 行数为第一行(第一行为值0) 。
通过dbms_rowid.rowid_create函数查询被锁定的具体行
查询被锁的会话和持有锁的会话,如果是exclusive锁则xidusn非零的表示已经执行并持有锁
column o_name format a10 column lock_type format a20 column object_name format a15 select rpad(oracle_username,10) o_name, session_id sid, decode(locked_mode,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') lock_type, object_name, all_objects.object_id, xidusn, xidslot, xidsqn from v$locked_object,all_objects where v$locked_object.object_id=all_objects.object_id; O_NAME SID LOCK_TYPE OBJECT_NAME OBJECT_ID XIDUSN XIDSLOT XIDSQN ---------- ------- -------------------- --------------- -------------- ---------- ------------ ---------- SYS 145 Row Exclusive T 53365 8 17 724 SYS 148 Row Exclusive T 53365 0 0 0
下面的查询可以得到被锁定的session,被锁定的对象id和row number
select sid, row_wait_obj# object_id, row_wait_file# file_no, row_wait_block# block, row_wait_row# row_num from v$session where row_wait_obj#=&object_id; Enter value for object_id: 53365 old 7: where row_wait_obj#=&object_id new 7: where row_wait_obj#=53365 SID OBJECT_ID FILE_NO BLOCK ROW_NUM ---------- -------------- ---------- ---------- ---------- 148 51207 1 61466 0
如果要对应行rowid则:
sys@JINGYONG> select dbms_rowid.rowid_create(1,53365,1,61466,0) create_rowid fr om dual; CREATE_ROWID ------------------ AAANB1AABAAAPAaAAA
有了rowid,具体的行就能定位了