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