昨天做了一个Oracle PL/SQL 相关的测试,其中有一道这样的题目:
 
下列那些是Oracle的伪列(ACD) 
A、ROWID  
B、ROW_NUMBER() 
C、LEVEL 
D、ROWNUM 
E、COLUMN
 
虽然我坚持认为Oracle的技术是用来实际应用的,而非用于进行类似于出题,但是作为学生,考试必须是一个提升自己细节把控的最好途径。
 
那么什么是Oracle的伪列呢?寻遍能找到的中文资料,并没有对Oracle所谓的伪列有明确的解释,最终在Oracle官方文档的Oracle  Database SQL Language Reference 11g Release 2 (11.2) E41084-02找到了对伪劣的定义:
 
pseudocolumn behaves like a table column, but is not actually stored in the table. You can select from pseudocolumns, but you cannot insert, update, or delete their values. A pseudocolumn is also similar to a function without arguments . However, functions without arguments typically return the same value for every row in the result set, whereas pseudocolumns typically return a different value for each row.
 
大致的意思如下:
 
伪列的操作类似于表中的列,但是它并不存实际保存在表中。你可以对其进行查询操作,但是你却不能对其进行增加、修改或者是删除,一个伪列也类似于一个没有参数的函数。但是,没有参数的函数通常在结果集中为每一列返回相同的结果,伪列通常为每一列返回不同的值。
 
然后,Oracle的官方给出了如下几个伪列:
 
Hierarchical Query Pseudocolumns
Sequence Pseudocolumns
Version Query Pseudocolumns
COLUMN_VALUE Pseudocolumn
OBJECT_ID Pseudocolumn
OBJECT_VALUE Pseudocolumn
ORA_ROWSCN Pseudocolumn
ROWID Pseudocolumn
ROWNUM Pseudocolumn
XMLDATA Pseudocolumn
 
相关的地址放在这个地方,有需要继续深入研究的可以点击其相关的链接,继续看其详细介绍的部分:
 
但是我觉着分析函数ROW_NUMBER()的结果也应该算作一个伪列,例如分层查询当中的CONNECT_BY_ISCYCLE  或者是CONNECT_BY_ISLEAF 亦或是LEVEL 与分析函数ROW_NUMBER()OVER()有本质的区别么?
 
但是至少有一点是明确的,Oracle明确的说明ROWID属于其伪列的范畴:
 
ROWID Pseudocolumn
 
For each row in the database, the ROWID pseudocolumn returns the address of the row. Oracle Database rowid values contain information necessary to locate a row:
 
The data object number of the object
 
The data block in the data file in which the row resides
 
The position of the row in the data block (first row is 0)
 
The data file in which the row resides (first file is 1). The file number is relative to the tablespace.
 
Usually, a rowid value uniquely identifies a row in the database. However, rows in different tables that are stored together in the same cluster can have the same rowid.
 
Values of the ROWID pseudocolumn have the data type ROWID or UROWID. Refer to "Rowid Data Types" and "UROWID Data Type" for more information.
 
Rowid values have several important uses:
 
They are the fastest way to access a single row.
They can show you how the rows in a table are stored.
They are unique identifiers for rows in a table.
 
You should not use ROWID as the primary key of a table. If you delete and reinsert a row with the Import and Export utilities, for example, then its rowid may change. If you delete a row, then Oracle may reassign its rowid to a new row inserted later.
 
Although you can use the ROWID pseudocolumn in the SELECT and WHERE clause of a query, these pseudocolumn values are not actually stored in the database. You cannot insert, update, or delete a value of the ROWID pseudocolumn.
 
(尽管你可以在SELECT..WHERE..查询语句中得到ROWID,但是该列的值并不是实际存储在数据库当中的,你不能够插入、修改或者删除ROWID伪列的值)。
 
 
之所以会感觉ROWID是实实在在存储在数据库当中,是因为受到两个方面的影响:
 
1、感觉在调优计划中ACCESS BY INDEX ROWID的速度是最快的,那么经验盒子告诉我,ROWID极有可能是存在数据块中的。
 
2、在数据块BLOCK的结构中,存在数据块头、表目录区、行目录区、可用空间区一级行数据区。不求甚解,理所当然认为行目录区中存放的就是ROWID的信息。现在回想一下,应该是存放了ROWID的部分相关信息,例如应该保存的是类似于C语言中的物理地址信息,而不是我们可见的形如ROWID的信息。
 
需要跳出自己的经验盒子,千万不能不求甚解。

Oracle 中的伪列的更多相关文章

  1. Oracle中的伪列

    分页查询中,需要用到伪列rownum,代码如下: select * from (select rownum rn, name from cost where rownum <= 6) where ...

  2. Oracle中ROWNUM伪列和ROWID伪列的用法与区别

    做过Oracle分页的人都知道由于Oracle中没有像MySql中limit函数以及SQLServer中的top关键字等,所以只能通过伪列的方式去满足分页功能,在此,不谈分页方法,只从根本上去介绍这两 ...

  3. 浅析SQL Server数据库中的伪列以及伪列的含义

    SQL Server中的伪列 下午看QQ群有人在讨论(非聚集)索引的存储,说,对于聚集索引表,非聚集索引存储的是索引键值+聚集索引键值:对于非聚集索引表,索引存储的是索引键值+RowId,这应该是一个 ...

  4. Oracle中“行转列”的实现方式

    在报表的开发当中,难免会遇到行转列的问题. 以Oracle中scott的emp为例,统计各职位的人员在各部门的人数分布情况,就可以用“行转列”: scott的emp的原始数据为: EMPNO ENAM ...

  5. oracle中的rowid--伪列-删除表中的重复内容-实用

    1.rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行. 2.rowid是存储在索引中的一组既定的值(当行确定后).我们可以像表中普通的列一样将它选出来. 3 ...

  6. Oracle Schema Objects——伪列ROWID Pseudocolumn(ROWNUM、ROWID)

    Oracle Schema Objects Oracle Schema Objects——Tables——Oracle Data Types Oracle伪列 在Oracle数据库之中为了实现完整的关 ...

  7. 用运oracel中的伪列rownum分页

    在实际应用中我们经常碰到这样的问题,比如一张表比较大,我们只要其中的查看其中的前几条数据,或者对分页处理数据.在这些情况下我们都需要用到rownum.因此我们要理解rownum的原理和使用方法. Or ...

  8. Oracle中"行转列"的实现方式

    在报表的开发当中,难免会遇到行转列的问题. 以Oracle中scott的emp为例,统计各职位的人员在各部门的人数分布情况,就可以用"行转列": scott的emp的原始数据为: ...

  9. oracle 事务 数据伪列

    在用户进行数据更新操作(DML)事务一定会起作用. 事务的出现会保证数据的完整性.一致性.在整个事务的处理过程之中主要使用两个操作命令: · 事务的提交(COMMIT):是真正的向数据库之中发出更新指 ...

随机推荐

  1. SQL Server创建索引(转)

    什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K .为了加快查找的速度,汉语字(词)典一般都有按拼音. ...

  2. 低调奢华 CSS3 transform-style 3D旋转

    点击这里查看效果:http://keleyi.com/a/bjad/s89uo4t1.htm 效果图: CSS3 transform-style 属性 以下是代码: <!DOCTYPE html ...

  3. JQuery实现一个简单的鼠标跟随提示效果

    效果体验:http://hovertree.com/texiao/jsstudy/2/ 实现思路 1 鼠标移入标题(这里是<a>标签) 创建一个div,div的内容为鼠标位置的文本 将创建 ...

  4. angularjs—指令input

    input[text] input一般和ngModel结合使用来实现双向绑定,同时angular提供了很多表单校验的指令 required 必填 ngRequired 必填(ngRequired可以控 ...

  5. 调用百度地图API

    http://lbsyun.baidu.com/index.php?title=jspopular

  6. C# PPT Operator

    来自:http://blog.csdn.net/lxzh12345/article/details/47047491 最近在写一个工具,设计到将界面内容到处到PPT中,且导出的内容能够编辑.网上搜了很 ...

  7. iOS之开发支付功能概述

    前言:本随笔将对IOS开发的支付功能进行一个概述. 内容大纲: 一.常见的支付方案简介 二.第三方支付SDK 三.苹果官方支付方案 四.Web支付方案 正文: 一.常见的支付方案简介 在微信支付中 微 ...

  8. Objective-C Runtime 运行时之四:Method Swizzling

    理解Method Swizzling是学习runtime机制的一个很好的机会.在此不多做整理,仅翻译由Mattt Thompson发表于nshipster的Method Swizzling一文. Me ...

  9. UITableview中怎么找到每个cell

    一个朋友问我:我在每个cell中都添加了两个按钮(记为btnA和btnB),点击btnA时,对应的cell中添加一个子控件,再点击btnB时,对应的cell中的子控件就移除,怎么做到? 百度了一下,发 ...

  10. 初学HTML 常见的标签(二) 列表标签

    上次介绍了一些简单的文本标签设计, 这篇介绍列表类标签, 通过列表能写出很好看的, 多元化的网络页面. ul-li 列表标签 <ul> <li>列表1</li> & ...