天天看點

oracle roenum,Oracle僞列ROWID和ROWNUM

1.ROWID

ROWID資料類型介紹:

ROWID僞劣是BASE64編碼的,oracle表的每行資料都有一個rowid值。與資料類型ROWID含義有所不同。

ROWID類型組成詳解:

ROWID僞劣值由18位組成,其中末三位,表示該行資料在表中的位置。如下所示:

第一行資料的位置标記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編碼

索  引

對應字元

索  引

對應字元

索  引

對應字元

索  引

對應字元

A

17

R

34

i

51

z

1

B

18

S

35

l

52

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

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類型轉換成十進制數字類型:

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;

3.用rowid分塊實作非分區表的并行update與delete