×

rowid

前端技术网 前端技术网 发表于2024-01-08 19:15:20 浏览1257 评论0

抢沙发发表评论

一、oracle中怎么修改数据rowid

rowid是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置。

rowid可以分为物理rowid和逻辑rowid两种。普通的堆表中的rowid是物理rowid,索引组织表(iot)的rowid是逻辑rowid。oracle提供了一种urowid的数据类型,同时支持物理和逻辑rowid。

rowid

物理rowid又分为扩展rowid(extended

rowid)和限制rowid(restricted

rowid)两种格式。限制rowid主要是oracle7以前的rowid格式,现在已经不再使用,保留该类型只是为了兼容性。

1.创建一临时表

create

table

rowid

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

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!