第3章Oracle特色功能介绍
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第2章 oracle伪列 rownum用法详解 章 伪列 用法详解
【2.2】rownum用法详解 】 用法详解 (2.2.4)采用嵌套3层的查询语句结合rownum来实现分页 看net.sf.hibernate.dialect.Oracle9Dialect:代码: public boolean supportsLimit() { return true; } public String getLimitString(String sql) { StringBuffer pagingSelect = new StringBuffer(100); pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( "); pagingSelect.append(sql); pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?"); return pagingSelect.toString(); } Oracle采用嵌套3层的查询语句结合rownum来实现分页,这在Oracle上是最快的方 式, 如果只是一层或者两层的查询语句的rownum不能支持order by。
第2章 oracle伪列 rownum用法详解 章 伪列 用法详解
【2.2】rownum用法详解 】 用法详解 (2.2.2)rownum对于大于某值的查询条件 如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因 是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然 数)这种条件依旧不成立,所以查不到记录。 查找到第二行以后的记录可使用以下的子查询方法来解决。注意子查询中的 rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个 表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。 SQL>select * from(select rownum no ,id,name from student) where no>2; NO ID NAME ---------- ------ --------------------------------------------------3 200003 李三 4 200004 赵四
第2章 oracle伪列 rownum用法详解 章 伪列 用法详解
【2.2】rownum用法详解 】 用法详解 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一 行分配的是1,第二行是2,依此类推,这个伪字段可 以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。 (2.2.1) rownum 对于等于某值的查询条件 如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想 找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为 rownum rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是 1 1 rownum false条件,所以无法查到rownum = n(n>1的自然数)。 SQL> select rownum,id,name from student where rownum=1;(可以用在限制返 回记录条数的地方,保证不出错,如:隐式游标) SQL> select rownum,id,name from student where rownum =2; ROWNUM ID NAME ---------- ------ ---------------------------------------------------
第2章 oracle伪列 rowid介绍 章 伪列 介绍
【2.1】rowid简介 】 通过dbms_rowid这个包,可以直接的得到具体的rowid包含的信息: select dbms_rowid.rowid_object(rowid) object_id, dbms_rowid.rowid_relative_fno(rowid) file_id, dbms_rowid.rowid_block_number(rowid) block_id ,dbms_rowid.rowid_row_number(rowid) num ,A.id from A
1.1序列 序列
在很多数据库系统中都存在一个自动增长的列,如果现在要想在Oracle中 完成自动增长的功能,则只能依靠序列完成,所有的自动增长操作,需要用户手 工完成处理。
1.1.1创建序列 创建序列
语法格式: 语法格式: CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [{CYCLE|NOCYCLE}] [{CACHE n|NOCACHE}];
Rowid伪列有以下重要用途: 1)能以最快的方式访问表中的一行; 2)能显示表的行是如何存储的。 3)可以作为表中行的唯一标识。 (查找和删除重复记录)
第2章 oracle伪列 和伪表 章 伪列
伪列:指的是在物理上这个列并不存在,只是在查询时才构造出来。伪列通常是自 由分配的,用户无法执行修改等操作。比如Oracle中的RowID字段,使用RowID 可以快速地定位到某个对应的数据,因为它标记了记录所对应的物理地址,是唯 一的。 CURRVAL AND NEXTVAL 使用序列号的保留字 LEVEL 查询数据所对应的级 ROWID 记录的唯一标识 ROWNUM 限制查询结果集的数量 伪表 DUAL 该表主要目的是为了保证在使用SELECT语句中的语句的完整性而提供的。
1.1.1创建序列并在插入表记录时使用 创建序列并在插入表记录时使用
【例1.1】创建一个序列articleseq 并通过articleseq.nextval来使用: 例 create SEQUENCE articleseq increment by 1 start with 1; create table article ( id NUMBER, pid NUMBER, rootid NUMBER, title varchar(255), cont varchar(2000), pdate date, isleaf NUMBER , PRIMARY KEY(id) );
insert into article values (articleseq.nextval, 0, 1, '蚂蚁大战大象', '内容蚂蚁大战大象', sysdate, 1);
第2章 oracle伪列 rowid介绍 章 伪列 介绍
【2.1】rowid简介 】 rowid就是唯一标志记录物理位置的一个id,rowid确定了每条记录是在Oracle中的 哪一个数据对象,数据文件、块、行上。 ROWID 的格式如下: 数据对象编号 文件编号 块编号 行编号 OOOOOO FFF BBBBBB RRR 由 data_object_id# + rfile# + block# + row# 组成,占用10个bytes的空间, 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 oracle中数据文件的大小是有限制的,就是每个数据文件最多只能包含2^22-1个数 据块 对于2k的块的数据文件,最大的数据文件是8G 32k块的数据文件,最大的数据文件是16*8G
第1章 CREATE SEQUENCE创建序列 章 创建序列
1.1.1其中:
INCREMENT BY 用于定义序列的步长,如果省略,则默认为1,如果出现负 值,则代表序列的值是按照此步长递减的。 START WITH 定义序列的初始值(即产生的第一个值),默认为1。 MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选 项,代表没有最大值定义,这时对于递增序列,系统能够产生的最大值是10的 27次方;对于递减序列,最大值是-1。 MINVALUE定义序列生成器能产生的最小值。选项NOMAXVALUE是默认选 项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是?10的 26次方;对于递增序列,最小值是1。 CYCLE和NOCYCLE 表示当序列生成器的值达到限制值后是否循环。CYCLE 代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值时,循 环到最小值;对于递减序列达到最小值时,循环到最大值。如果不循环,达到限 制值后,继续产生新值就会发生错误。 CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不 对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。
第2章 oracle伪列 rownum用法详解 章 伪列 用法详解
【2.2】rownum用法详解 】 用法详解 (2.2.3)rownum对于小于某值的查询条件 rownum对于rownum<n((n>1的自然数)的条件认为是成立的,所以可以找到记 录。 SQL> select rownum,id,name from student where rownum <3; ROWNUM ID NAME ---------- ------ --------------------------------------------------1 200001 张一 2 200002 王二 查询rownum在某区间的数据,必须使用子查询。例如要查询rownum在第二行到 第三行之间的数据,包括第二行和第三行数据,那么我们只能写以下语句,先让 它返回小于等于三的记录行,然后在主查询中判断新的rownum的别名列大于等 于二的记录行。但是这样的操作会在大数据集中影响速度。 SQL> select * from (select rownum no,id,name from student where rownum<=3 ) where no >=2; NO ID NAME ---------- ------ --------------------------------------------------2 200002 王二 3 200003 李三
第1章 序列的使用 章
1.2如果已经创建了序列,怎样才能引用序列呢?方法是使用CURRVAL和
NEXTVAL来引用序列的Hale Waihona Puke Baidu。
调用NEXTVAL将生成序列中的下一个序列号,调用时要指出序列名,即用以 下方式调用: 序列名.NEXTVAL CURRVAL用于产生序列的当前值,无论调用多少次都不会产生序列的下一个 值。如果序列还没有通过调用NEXTVAL产生过序列的下一个值,先引用 CURRVAL没有意义。调用CURRVAL的方法同上,要指出序列名,即用以下方 式调用: 序列名.CURRVAL.
第2章 oracle伪列 rowid介绍 章 伪列 介绍
【2.1】rowid简介 】 oracle 10g开始支持bigfile大文件的表空间,这种表空间只能有一个数据文件。 rowid中省去了rfile#的10bit,将这10bit给block#,所以bigfile文件可以支持更大的 文件,可支持4g的block。如果系统一个block的大小为8k,则最大文件为: 4g(block#)*8k(blocksize)=32T,不过还要受操作系统文件大小的限制。 理论上的 BFT 可以达到下面所列的值: 数据块大小(单位:K) BFT 最大值(单位:T) 2k 8T 4k 16T 8k 32T 16k 64T 32k 128T
For Oracle employees and authorized partners only. Do not distribute to third parties. © 2008 Oracle Corporation – Proprietary and Confidential
第1章 CREATE SEQUENCE创建序列 章 创建序列