Oracle伪列ROWID和ROWNUM

1.ROWID

ROWID数据类型介绍:

ROWID伪劣是BASE64编码的,oracle表的每行数据都有一个rowid值。与数据类型ROWID含义有所不同。

官网介绍:http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements001.htm#i46148

ROWID类型组成详解:

ROWID伪劣值由18位组成,其中末三位,表示该行数据在表中的位置。如下所示:

ROWID结构变过过程:http://www.orafaq.com/wiki/ROWID

第一行数据的位置标记AAA,其中A在base64编码中表示0,即是0。所以说表行数据的ROWID是从0(base64 表示为:AAA)开始的。

SQL> select rowid,substr(rowid, 1, 6) "#objct", substr(rowid, 7, 3) "#file",
  2  substr(rowid, 10, 6) "#block", substr(rowid, 16, 3) "#row"
  3  from clobtest where id =1;

ROWID              #objct       #file  #block       #row
------------------ ------------ ------ ------------ ------
AAANfCAAGAAAP3XAAA AAANfC       AAG    AAAP3X       AAA

rowid AAANFC AAG AAAP3X AAA
说明 数据对象号 相对文件号 数据块号 行号

base 64编码

索  引

对应字符

索  引

对应字符

索  引

对应字符

索  引

对应字符

0

A

17

R

34

i

51

z

1

B

18

S

35

l

52

0

2

C

19

T

36

k

53

1

3

D

20

U

37

l

54

2

4

E

21

V

38

m

55

3

5

F

22

W

39

n

56

4

6

G

23

X

40

o

57

5

7

H

24

Y

41

p

58

6

8

I

25

Z

42

q

59

7

9

J

26

a

43

r

60

8

10

K

27

b

44

s

61

9

11

L

28

c

45

t

62

+

12

M

29

d

46

u

63

/

13

N

30

e

47

v

 

 

14

O

31

f

48

w

 

 

15

P

32

g

49

x

 

 

16

Q

33

h

50

y

 

 


参考资料: http://blog.csdn.net/chiclewu/article/details/25782619


ROWID能作为行标记,不能作为顺序行号,其中一个原因是rowid实在行数据插入时确定的,如果中间出现删除,那么该行后面的行的rowid不能改变,如下:

SQL> create table bb(id int);

表已创建。

SQL> insert into bb values(1);

已创建 1 行。

SQL> insert into bb values(2);

已创建 1 行。

SQL> insert into bb values(3);

已创建 1 行。

SQL> insert into bb values(4);

已创建 1 行。

SQL> select rowid,id from bb;

ROWID                      ID
------------------ ----------
AAANe0AAGAAAHEoAAA          1
AAANe0AAGAAAHEoAAB          2
AAANe0AAGAAAHEoAAC          3
AAANe0AAGAAAHEoAAD          4

SQL> delete from bb where id=3
  2  ;

已删除 1 行。

SQL> select rowid,id from bb;

ROWID                      ID
------------------ ----------
AAANe0AAGAAAHEoAAA          1
AAANe0AAGAAAHEoAAB          2
AAANe0AAGAAAHEoAAD          4

SQL>


ROWID类型转换成十进制数字类型:

http://www.oracleonlinux.cn/2011/11/whats-oracle-rowid/


2.ROWNUM

rownum是查询结果集的行编号,但是结果集中必须包含rownum=1的情况,否则查询不到结果。

通过rownum伪列可以查询查询行号在某一区间的行数据,比如:查询出表tab1的【51,100】的行的数据:

方法一,通过结果集的minus操作:

select xx from tab1 where rownum<=100 minus select xx from tab1 where rownum<=50;

但是clob类型不支持minus,所以包含clob类型字段的表不能使用基于rownum结果集的minus操作。

方法二,通过重新查询子查询的结果集:

该方法的特点是必须知道表的所有列名字,否则会结果只能是多出一列rownum来。

SELECT t.* FROM (SELECT f.*, rownum num FROM tab1 f) t
where num >= 51 and num <= 100;

参考:http://blog.csdn.net/wushanyun1989/article/details/10353229


3.用rowid分块实现非分区表的并行update与delete

http://www.oracledatabase12g.com/archives/%E5%88%A9%E7%94%A8rowid%E5%88%86%E5%9D%97%E5%AE%9E%E7%8E%B0%E9%9D%9E%E5%88%86%E5%8C%BA%E8%A1%A8%E7%9A%84%E5%B9%B6%E8%A1%8Cupdate%E4%B8%8Edelete.html

你可能感兴趣的:(oracle,base64,rowid,rownum)