SYS@ prod>select rowid from scott.emp;ROWID
------------------
AAASPXAAEAAAACVAAA
AAASPXAAEAAAACVAAB
AAASPXAAEAAAACVAAC
AAASPXAAEAAAACVAAD
AAASPXAAEAAAACVAAE 

ROWID的格式如下:

数据对象编号 文件编号 块编号 行编号
AAASPX AAE AAAACV AAA

我们可以看出,从上面的rowid可以得知:
AAASPX 是数据对象编号 (data_object)
AAE 是数据文件编号 (datafile)
AAAACV 是块编号 (block)
AAA 是行编号 (row)

怎么依据这些编号得到具体的十进制的编码值呢

这里需要明白rowid的是基于64位编码的18个字符显示(数据对象编号(6) +文件编号(3) +块编号(6)+ 行编号 (3)=18位),其中
A-Z <==> 0 - 25 (26)
a-z <==> 26 - 51 (26)
0-9 <==> 52 - 61 (10)
+/ <==> 62 - 63 (2)

共64位,明白这个后,就可以计算出10进制的编码值,计算公式如下:
d * (b ^ p)
其中:b就是基数,这里就是64,p就是从右到左,以0开始的位置数
比如:上面的例子
对象号AAASPX ,具体的计算应该是:
0*(64^5)=5;0*(64^4)=0;0*(64^3)=0;18*(64^2)=73728;15*(64^1)=960;23*(64^0)=23;

对象号就是73728+960+23=74711

刚才提到的是rowid的显示方式:基于64位编码的18个字符显示,其实rowid的存储方式是:10 个字节即80位存储,其中数据对象编号需要32 位,相关文件编号需要10 位,块编号需要22,位行编号需要16 位,由此,我们可以得出:
32bit的object number,每个数据库最多有4G个对象
10bit的file number,每个对象最多有1022个文件(2个文件预留)
22bit的block number,每个文件最多有4M个BLOCK
16bit的row number,每个BLOCK最多有64K个ROWS

2. rowid相关的有用的sql

通过dbms_rowid这个包,可以直接的得到具体的rowid包含的信息:

SYS@ prod>select dbms_rowid.rowid_object(rowid) object_id, dbms_rowid.rowid_relative_fno(rowid) file_id,2  dbms_rowid.rowid_block_number(rowid) block_id ,dbms_rowid.rowid_row_number(rowid) num from scott.emp 3  where rownum<5;OBJECT_ID    FILE_ID   BLOCK_ID        NUM
---------- ---------- ---------- ----------74711          4        149          0
     74711          4        149          174711          4        149          274711          4        149          3 

一些使用ROWID的函数
ROWIDTOCHAR(rowid) :将ROWID转换成STRING
CHARTOROWID('rowid_string') :将STRING转换成ROWID

如果没有dbms包的权限可以用下面的方法

select
(case when to_number(utl_raw.cast_to_raw(substr(rowid,1,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,1,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,1,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,1,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,1,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,1,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,1,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,1,1)),'xxx') = 47 then 63 end)*power(64,5)+
(case when to_number(utl_raw.cast_to_raw(substr(rowid,2,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,2,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,2,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,2,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,2,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,2,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,2,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,2,1)),'xxx') = 47 then 63 end)*power(64,4)+
(case when to_number(utl_raw.cast_to_raw(substr(rowid,3,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,3,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,3,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,3,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,3,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,3,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,3,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,3,1)),'xxx') = 47 then 63 end)*power(64,3)+
(case when to_number(utl_raw.cast_to_raw(substr(rowid,4,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,4,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,4,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,4,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,4,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,4,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,4,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,4,1)),'xxx') = 47 then 63 end)*power(64,2)+
(case when to_number(utl_raw.cast_to_raw(substr(rowid,5,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,5,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,5,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,5,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,5,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,5,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,5,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,5,1)),'xxx') = 47 then 63 end)*power(64,1)+
(case when to_number(utl_raw.cast_to_raw(substr(rowid,6,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,6,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,6,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,6,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,6,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,6,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,6,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,6,1)),'xxx') = 47 then 63 end)*power(64,0) as object_cd,
(case when to_number(utl_raw.cast_to_raw(substr(rowid,7,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,7,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,7,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,7,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,7,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,7,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,7,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,7,1)),'xxx') = 47 then 63 end)*power(64,2)+
(case when to_number(utl_raw.cast_to_raw(substr(rowid,8,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,8,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,8,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,8,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,8,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,8,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,8,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,8,1)),'xxx') = 47 then 63 end)*power(64,1)+
(case when to_number(utl_raw.cast_to_raw(substr(rowid,9,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,9,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,9,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,9,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,9,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,9,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,9,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,9,1)),'xxx') = 47 then 63 end)*power(64,0) as file_no,
(case when to_number(utl_raw.cast_to_raw(substr(rowid,10,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,10,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,10,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,10,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,10,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,10,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,10,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,10,1)),'xxx') = 47 then 63 end)*power(64,5)+
(case when to_number(utl_raw.cast_to_raw(substr(rowid,11,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,11,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,11,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,11,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,11,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,11,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,11,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,11,1)),'xxx') = 47 then 63 end)*power(64,4)+
(case when to_number(utl_raw.cast_to_raw(substr(rowid,12,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,12,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,12,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,12,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,12,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,12,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,12,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,12,1)),'xxx') = 47 then 63 end)*power(64,3)+
(case when to_number(utl_raw.cast_to_raw(substr(rowid,13,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,13,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,13,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,13,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,13,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,13,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,13,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,13,1)),'xxx') = 47 then 63 end)*power(64,2)+
(case when to_number(utl_raw.cast_to_raw(substr(rowid,14,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,14,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,14,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,14,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,14,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,14,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,14,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,14,1)),'xxx') = 47 then 63 end)*power(64,1)+
(case when to_number(utl_raw.cast_to_raw(substr(rowid,15,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,15,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,15,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,15,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,15,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,15,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,15,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,15,1)),'xxx') = 47 then 63 end)*power(64,0) as block_no,
(case when to_number(utl_raw.cast_to_raw(substr(rowid,16,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,16,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,16,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,16,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,16,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,16,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,16,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,16,1)),'xxx') = 47 then 63 end)*power(64,2)+
(case when to_number(utl_raw.cast_to_raw(substr(rowid,17,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,17,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,17,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,17,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,17,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,17,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,17,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,17,1)),'xxx') = 47 then 63 end)*power(64,1)+
(case when to_number(utl_raw.cast_to_raw(substr(rowid,18,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,18,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,18,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,18,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,18,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,18,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,18,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,18,1)),'xxx') = 47 then 63 end)*power(64,0) as row_no
from scott.emp;

转载于:https://www.cnblogs.com/zhaochunyi/p/10931094.html

Oracle rowid相关推荐

  1. oracle由rowid查找表,Oracle ROWID与RDBA

    Oracle ROWID与RDBA 1.1     Rowid的意义 1.      Rowid就是用来标记表中每一行的行地址的,分为逻辑rowid,物理rowid和外部rowid,一般索引组织表的行 ...

  2. KingbaseES CTID 与 Oracle ROWID

    熟悉oracle的人都知道ROWID可用于快速的数据访问,KingbaseES 由于自身MVCC机制的原因,ctid 作为 oracle rowid 的替代方案不合适,但currtid 还是基本可以满 ...

  3. oracle rowid and postgresql ctid

    首先介绍一下oracle rowid,数据库表行中的物理标识 SQL> select rowid from book_info where rownum<=1; ROWID ------- ...

  4. oracle rowID切片,Oracle中ROWID详解

    Oracle的ROWID用来唯一标识表中的一条记录,是这条数据在数据库中存放的物理地址. Oracle的ROWID分为两种:物理ROWID和逻辑ROWID.索引组织表使用逻辑ROWID,其他类型的表使 ...

  5. oracle rowID切片,Oracle中的rowid

    ROWID是ORACLE中的一个重要的概念.用于定位数据库中一条记录的一个相对唯一地址值.通常情况下,该值在该行数据插入到数据库表时即被确定且唯一.ROWID它是一个伪列,它并不实际存在于表中.它是O ...

  6. Oracle rowid和rownum的区别

    rowid和rownum在本质上有区别: rowid rowid是物理结构上的,每插入一行数据,都会生成一条唯一的编号.可以说默认排序是根据rownum升序的,但是本质上还是根据rowid升序排列的. ...

  7. oracle rowid与rownum的使用

    一.rowid的定义:  1.rowid是数据库的一个伪列,建立表的时候数据库会自动为每个表建立ROWID列,是数据库中每一条记录的唯一标识,存储每条记录的实际物理地址,对记录的访问是基于ROWID. ...

  8. oracle的rowid和rownum,【oracle rowid与rownum的使用与区别 】

    一.rowid的定义: 1.rowid是数据库的一个伪列,建立表的时候数据库会自动为每个表建立ROWID列,是数据库中每一条记录的唯一标识,存储每条记录的实际物理地址,对记录的访问是基于ROWID.但 ...

  9. Oracle RowID与RowNum的区别

    Rowid和Rownum对于数据库开发人员来说基本很少用到,因为在企业数据库开发中大多都是进行数据批处理,但是对于其他数据库人员来说还是会用到的. rowid和rownum都是虚列,但含义完全不同.r ...

  10. oracle return rowid,Oracle rowid 详解

    本文讨论的是关于oracle从8i开始引进object的概念后的rowid,即扩展(extended)的rowid: Oracle6,ROWID中仅用6 bit代表文件号Oracle8,ROWID组成 ...

最新文章

  1. java 鸡兔统统_Java内存泄露介绍
  2. [BZOJ2730][HNOI2012]矿场搭建(求割点)
  3. [翻译] Shimmer
  4. 复杂性思维 中文第二版 翻译完成
  5. 乐高机器人编程和编程的区别
  6. STM32F205VCT6主控PLC控制器板,已批量生产
  7. 查看CPU和其他硬件温度的软件
  8. 从国家统计局爬取山东省市区县乡镇
  9. 华为ensp模拟企业网(校园网),总分公司(总分校区),多区域互联,代码有详细注释
  10. mp3怎么转换成m4r(iPhone铃声制作)
  11. leetcode题刷250天(84)——454. 四数相加 II(加法分配律)
  12. SSM框架 基于Bootstrap fileinput 实现文件上传功能
  13. Mybatis—— 使用注解实现一对一复杂关系映射及延迟加载
  14. qemu 的 win98 plus 镜像
  15. gm 1 n 模型matlab,灰色预测模型GM1,n模型的matlab源...
  16. 互联网金融做大数据风控的九种维度
  17. 市值3万亿的facebook再出丑闻,你的数据,到底应该归谁?
  18. Android app实现录播(边录边播)功能
  19. Direct3D 初始化
  20. java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承, 请说出他们分别是哪些类?

热门文章

  1. [机器学习 ] RandomForest、GBDT、XGBoost、lightGBM 原理与区别
  2. 【IT笔试面试题整理】给定二叉树,给每层生成一个链表
  3. (2)stm32开发之使用Keil MDK以及标准外设库创建STM32工程
  4. chmod g+s 、chmod o+t 、chmod u+s
  5. Java字符串编码和转换操作
  6. matlab调用C程序
  7. 【Transformer】DETR: End-to-End Object Detection with Transformers
  8. 【python 9】python注册器
  9. ubuntu安装 ftpd server(vsftpd)
  10. 上半年银行罚单不断,7月越早贷款越有利