一、oracle中怎么修改数据rowid
rowid是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置。
rowid可以分为物理rowid和逻辑rowid两种。普通的堆表中的rowid是物理rowid,索引组织表(iot)的rowid是逻辑rowid。oracle提供了一种urowid的数据类型,同时支持物理和逻辑rowid。
物理rowid又分为扩展rowid(extended
rowid)和限制rowid(restricted
rowid)两种格式。限制rowid主要是oracle7以前的rowid格式,现在已经不再使用,保留该类型只是为了兼容性。
1.创建一临时表
create
table
test_rowid
(id
number,
row_id
rowid);
2.插入一行记录
insert
into
test_rowid
values(1,null);
3.修改刚插入的记录
update
test_rowid
set
row_id
=
rowid
where
id
=
1;
4.查看rowid
select
rowid,row_id
from
test_rowid;
二、Oracle数据库中rowid什么作用
ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置。
ROWID可以分为物理rowid和逻辑rowid两种。普通的堆表中的rowid是物理rowid,索引组织表(IOT)的rowid是逻辑rowid。oracle提供了一种urowid的数据类型,同时支持物理和逻辑rowid。
物理rowid又分为扩展rowid(extended rowid)和限制rowid(restricted rowid)两种格式。限制rowid主要是oracle7以前的rowid格式,现在已经不再使用,保留该类型只是为了兼容性。
1.创建一临时表
create table test_rowid(id number, row_id rowid);
2.插入一行记录
insert into test_rowid values(1,null);
3.修改刚插入的记录
update test_rowid set row_id= rowid where id= 1;
4.查看rowid
select rowid,row_id from test_rowid;
三、说说Oracle的rowid
在Oracle中rowid唯一标识每条记录所在的位置它作为一个伪列在查询中出现
select rowid id
from test_table
where rownum<=;
ROWID ID
AAAVcbAAPAAAAALAAA
AAAVcbAAPAAAAALAAB
AAAVcbAAPAAAAALAAC
AAAVcbAAPAAAAALAAD
AAAVcbAAPAAAAALAAE
AAAVcbAAPAAAAALAAF
AAAVcbAAPAAAAALAAG
AAAVcbAAPAAAAALAAH
AAAVcbAAPAAAAALAAI
AAAVcbAAPAAAAALAAJ
rowid是由个字符组成分个部分分别是
个字符的对象编号个字符的文件号个字符的块编号个字符的行编号
每一个字符的取值范围以及对应的数值是
| A||| a|||||
| B||| b|||||
| C||| c|||||
| D||| d|||||
| E||| e|||||
| F||| f|||||
| G||| g|||||
| H||| h|||||
| I||| i|||||
| J||| j|||||
| K||| k|||+||
| L||| l|||/||
| M||| m|||||
| N||| n|||||
| O||| o|||||
| P||| p|||||
| Q||| q|||||
| R||| r|||||
| S||| s|||||
| T||| t|||||
| U||| u|||||
| V||| v|||||
| W||| w|||||
| X||| x|||||
| Y||| y|||||
| Z||| z|||||
可以看到rowid是一个进制的表示方式利用上述对应表即可计算出
对象编号 AAAVcb=
文件号 AAP=
块号 AAAAAL=
行号 AAA~AAJ=~
进制的转换完全可以交给机器去做 Oracle也是这么认为的于是提供了一个叫做dbms_rowid的包它包含了一系列的方法我们借助这个包就可完成上述的工作了
select rowid
substr(rowid)||:|| dbms_rowid rowid_object(rowid)数据对象编号/object_id
substr(rowid)||:|| dbms_rowid rowid_relative_fno(rowid)文件编号/file_id
substr(rowid)||:|| dbms_rowid rowid_block_number(rowid)块编号/block_id
substr(rowid)||:|| dbms_rowid ROWID_ROW_NUMBER(rowid)行编号/row_num
from test_table
where rownum<=;
ROWID数据对象编号/object_id文件编号/file_id块编号/block_id行编号/row_num
AAAVcbAAPAAAAALAAA AAAVcb: AAP: AAAAAL: AAA:
AAAVcbAAPAAAAALAAB AAAVcb: AAP: AAAAAL: AAB:
AAAVcbAAPAAAAALAAC AAAVcb: AAP: AAAAAL: AAC:
AAAVcbAAPAAAAALAAD AAAVcb: AAP: AAAAAL: AAD:
AAAVcbAAPAAAAALAAE AAAVcb: AAP: AAAAAL: AAE:
AAAVcbAAPAAAAALAAF AAAVcb: AAP: AAAAAL: AAF:
AAAVcbAAPAAAAALAAG AAAVcb: AAP: AAAAAL: AAG:
AAAVcbAAPAAAAALAAH AAAVcb: AAP: AAAAAL: AAH:
AAAVcbAAPAAAAALAAI AAAVcb: AAP: AAAAAL: AAI:
AAAVcbAAPAAAAALAAJ AAAVcb: AAP: AAAAAL: AAJ:
这个结果对不对呢?我们可以这样验证注意以下查询需要DBA权限
首先是object_id
select
owner object_name object_id
from dba_objects
where object_name= TEST_TABLE;
OWNER OBJECT_NAME OBJECT_ID
TEST TEST_TABLE
然后是文件编号和块编号
select
owner segment_name segment_type extent_id
file_id block_id blocks bytes
from dba_extents
where segment_name= TEST_TABLE;
OWNER SEGMENT_NAME SEGMENT_TYPE EXTENT_ID FILE_ID BLOCK_ID BLOCKS BYTES
TEST TEST_TABLE TABLE
TEST TEST_TABLE TABLE
编号为的块落在了编号为的exntent上只能说是验证了一半接下来我们将数据块dump出来看看不过做之前先为这一行打上标记看以下过程
test$logdw@logdw SQL> select rowid t* from test_table t where rownum<=;
ROWID ID DATA
AAAVcbAAPAAAAALAAA Q
AAAVcbAAPAAAAALAAB Q
AAAVcbAAPAAAAALAAC Q
AAAVcbAAPAAAAALAAD Q
AAAVcbAAPAAAAALAAE Q
rows selected
test$logdw@logdw SQL> update test_table set data=lpad( killkill) where id=;
row updated
test$logdw@logdw SQL> select rowid t* from test_table t where rownum<=;
ROWID ID DATA
AAAVcbAAPAAAAALAAA killkill
AAAVcbAAPAAAAALAAB Q
AAAVcbAAPAAAAALAAC Q
AAAVcbAAPAAAAALAAD Q
AAAVcbAAPAAAAALAAE Q
rows selected
test$logdw@logdw SQL> mit;
做好了标记可以dump数据块了
sys$logdw@logdw SQL> select get_trace_name() from dual;
GET_TRACE_NAME()
/u/app/oracle/diag/rdbms/logdw/logdw/trace/logdw_ora_ trc
sys$logdw@logdw SQL> alter system dump datafile block;
System altered
打开trc文件摘录如下
Start dump data blocks tsn: file#: minblk maxblk
Dump of memory from x A F A to x A F A
A F F C B [ kil]
A F F C B C C C E C [lkill ]
block_row_dump:
tab row@ x ac
tl: fb: H FL lb: x cc:
col: [ ] c
col: [ ]
b c
c b c c
lishixinzhi/Article/program/Oracle/201311/17417好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!