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