Oracle伪列ROWID和ROWNUM
2019獨角獸企業重金招聘Python工程師標準>>>
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 | ? | ? |
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 4SQL> delete from bb where id=32 ;已刪除 1 行。SQL> select rowid,id from bb;ROWID ID ------------------ ---------- AAANe0AAGAAAHEoAAA 1 AAANe0AAGAAAHEoAAB 2 AAANe0AAGAAAHEoAAD 4SQL>
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
轉載于:https://my.oschina.net/liuyuanyuangogo/blog/318648
總結
以上是生活随笔為你收集整理的Oracle伪列ROWID和ROWNUM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: file_get_contents高級用
- 下一篇: WinAPI: midiOutGetNu