rowid:select t.*,t.rowid from test t; -- AACeJKAAIAAAA4XAAA
注:有个很二需求,通过一个存储过程插入的数据必须是放在一块的,不能分散开存储,考虑用到使用insert /*+append*/ into插入数据,需要了解一下数据的存储原理
AACeJK AAI AAAA4X AAA
数据对象编号(6位)文件编号(3位) 块编号(6位) 行序号(3位)
declare
v_rowid rowid;
v_rowid_type number;
v_object_number number;
v_relative_fno number;
v_block_number number;
v_row_number number;
begin
--得到输入变量v_rowid,把它传递给dbms_rowid.rowid_info过程
dbms_rowid.rowid_info('AACeJKAAIAAAA4XAAA',
v_rowid_type,
v_object_number,
v_relative_fno,
v_block_number,
v_row_number);
dbms_output.put_line('row id is: ' || v_rowid);
dbms_output.put_line('rowid type is: ' || v_rowid_type || ' -- ' ||
v_object_number || ' -- ' || v_relative_fno ||
' -- ' || v_block_number || ' -- ' || v_row_number); --此处测试仅显示1-2个输出参数,其它同理
end;
select dbms_rowid.rowid_relative_fno(row_id => 'AACeJKAAIAAAA4XAAA')
from dual
select * from v$datafile;
--数据对象编号
select * from user_objects t where t.data_OBJECT_ID = '647754';
--文件编号
select * from v$datafile where file# = 8;
rowid本身是一种数据类型
错误:
select t.*,t.rowid from test t where t.rowid ='AAA111';
正确:
select t.*,t.rowid from test t where ROWIDTOCHAR(t.rowid)='AAA111';
ROWIDTOCHAR(t.rowid):将rowid转化成string
CHARTOROWID('rowid_string') :将string转换成ROWID
select CHARTOROWID('AAAAB0AABAAAAOhAAA') from dual;
rowid类型:
Extended rowid:使用表空间相关的数据块地址,8i及以上使用这种格式
Restricted rowid:使用数据库范围的数据块地址,oracle 7或更早前的版本使用