当前位置:  数据库>oracle

Oracle数据库对象_序列

    来源: 互联网  发布时间:2017-06-22

    本文导语: 序列是一种数据库对象,用来自动产生一组唯一的序号。 序列是一种共享式的对象,多个用户可以共同使用序列中的序号。一般将序列应用于表的主键列,这样当向表中插入数据时,主键列就使用了序列中的序号,从而保证主...

序列是一种数据库对象,用来自动产生一组唯一的序号。

序列是一种共享式的对象,多个用户可以共同使用序列中的序号。
一般将序列应用于表的主键列,这样当向表中插入数据时,主键列就使用了序列中的序号,从而保证主键列的值不会重复。
用这种方式可以代替在应用程序中产生主键值的方法,可以获得更可靠的主键值。
注:在序列指定最大值和可循环属性后,序列中的序号是可以循环使用的。

 

序列的创建、修改和删除

默认情况下,用户可以在自己的模式中创建序列。如果希望在其他用户的模式中创建序列,
则必须具有CREATE ANY SEQUENCE这个系统权限。

创建序列的命令为CREATE SEQUENCE,它的完整语法格式为:

CREATE SEQUENCE 序列名

INCREMENT BY n

START WITH n

MINVALUE n | NOMINVALUE

MAXVALUE n | NOMAXVALUE

CYCLE | NOCYCLE

CACHE | NOCACHE

ORDER | NOORDER

在这个命令的语法格式中,除序列名以外,其余各选项都是可选的。

各选项中的n是一个整数。

其中START WITH选项指定序列中的序号从哪个数字开始,默认情况下从它的最小值开始。
INCREMENT BY选项指定了序列中序号递增的幅度,也就是后一个序号比前一个序号大多少。
序号可以递增,也可以递减,所以INCREMENT BY选项中的数字n可以是正整数,也可以是负整数。
MAXVALUE用来指定序列中序号的最大值。

如果没有最大值,可用NOMAXVALUE选项代替这个选项。
同样, MINVALUE用来指定序列中序号的最小值,序列中的最小值必须小于或等于它的开始值。
如果为序列指定了最大值,那么当序列中的序号被悄耗完时,用户将无法从这个序列中取得序号。
选项CYCLE使得序列中的序号可以循环使用。

当用户正在使用序列中的最大值时,下一个可以使用的序号就是它的最小值。
用户每使用序列一次,都要对序列进行一次查询。

如果把序列中的序号放在内存中进行缓冲,那么用户获得序号的速度将大大加快。
选项CACHE的作用就是将序列中接下来的n个序号在内存中进行缓冲。
如果不希望进行缓冲,可以用NOCACHE选项代替它。

序列在创建之后,在使用的过程中,可以对其进行修改。

比如修改它的最大值、最小值、增幅等,但是不能修改开始值。
需要注意的是,如果已经有部分序号被使用,那么对序列的修改只影响以后的序号,对以前已经使用的序号不起作用。

修改序列的命令是ALTER SEQUENCE。

用户可以修改自己的序列,如果希望修改其他用户的序列,则需要具有ALTER ANY SEQUENCE这个系统权限。
ALTER SEQUENCE命令的用法与CREATE SEQUENCE命令的用法基本相同,只要将关键字CREATE替换为ALTER即可。

删除序列的命令是DROP SEQUENCE。

用户可以删除自己创建的序列,如果要删除其他用户的序列,则要具有DROP ANY SEQUENCE 系统权限。
序列被删除后,它的相关信息就被从数据字典中删除。


序列的使用

对用户而言,序列中的可用资源是其中包含的序号。

用户可以通过SELECT命令获得可用的序号,也可以将序号应用于DML语句和表达式中。
如果要使用其他用户的序列,则 必须具有对该序列的SELECT权限。

序列提供了两个伪列,即NEXTVAL 和CURRVAL,用来访问序列中的序号。
其中NEXTVAL代表下一个可用的序号, CURRYAL代表当前的序号。
序列可以认为是包含了一系列序号的一个指针。
序列刚被创建时,这个指针位于第一个序号之前,以后每获得一个序号,指针就向后移动一个位置,这时就可以用CURRVAL访问序列中的当前序号,用NEXTVAL访问下一个序号。

在第一次使用序列中的序号时,必须首先访问NEXTVAL伪列,使指针指向第一个序号。

 

通过SELECT语句可以从序列中获得一个可用的序号。

例如:

SELECT seq1.nextval FROM dual;

在SELECT语句中使用表dual是必要的,因为SELECT语句将根据表中数据的行数返回若干个序号,并且每访问一次NEXTVAL 伪列,指针就向后移动一个序号。

CURRVAL伪列代表序列中的当前序号,访问这个伪列时指针并不向后移动。

CURRVAL伪列的引用方法与NEXTVAL伪列相同,引用格式为:序列名.currval 。
序列还可应用于SELECT语句的其他形式。

例如:

SELECT seq1.nextval, empno FROM scott.emp;

在更多情况下序列的作用为表中的主键列或其他列提供一个唯一的序号。

例如:

INSERT INTO scott.dept(deptno, dname) VALUES(seq1.nextval, 'lili');

序列是一种共享式的数据库对象,用户可以直接使用自己创建的序列,其他用户也可以访问当前用户的序列,只要具有对这个序列的SELECT权限即可。
如果一个序号被某个用户获得,那么其他用户就不能再获得这个序号了。
也就是说,序列是可以共享的,但序列中的序号却是不能共享的。
对序列中序号的访问操作是作为一个单独的事务实现的,这个事务的执行与其他事务的执行成功与否无关。
如果包含一条DML语句的事务被回滚了,那么对序列的操作是无法回滚的。

注:如果是在可循环的序列中,序号可被其他用户循环使用。

在访问序列中的序号时,可能会发生序号不连续的情况,不连续的原因可能是事务发生了回滚,或者多个用户共同访问同一个序列。
一个用户要访问其他用户的序列时,不仅要具有对这个序列的SELECT权限,在访问时还要在序列的名称前以用户名进行限定。
例如:

SELECT sys.seq1.nextval FROM dual;

如果要将一个序列的SELECT权限授予其他用户,相应的GRANT命令格式为:

GRANT SELECT ON 序列名 TO 用户名;

序列信息的查询

序列作为一种数据库对象,它的相关信息也存储在数据字典中。

与序列相关的数据字典有三个: USER_SEQUENCES 、ALL SEQUENCES和DBA_SEQUENCES 。
其中数据字典USER SEQUENCES 的各列及意义如下所示:

SEQUENCE_NAME 序列名

MIN_VALUE 最小值

MAX_VALUE 最大值

INCREMENT_BY 增幅

CYCLE_FLAG 是否循环

ORDER_FLAG 是否按顺序

CACHE_SIZE 缓存大小

LAST_NUMBER 下一个可用值

注:ORDER_FLAG的解释:

Note that the ORDER option is only necessary to guarantee ordered generation if you are using Oracle with the Parallel Server option in parallel mode.
If you are using exclusive mode, sequence numbers are always generated in order.
LAST_NUMBER的解释:

使用的或缓存的最后一个序列号,一般大于缓冲区中的最后一个值。

LAST_NUMBER列在普通的数据库操作过程中不被更新,它在数据库的重新启动/恢复操作中使用。

CACHE_SIZE的解释:

在内存中缓存的序号用完之后,再向内存中添加序号。

例如:

SELECT order_flag, last_number,max_value,cache_size from user_sequences where sequence_name='SEQ1';


    
 
 

您可能感兴趣的文章:

  • Oracle sequence序列的用法
  • Oracle中使用触发器(trigger)和序列(sequence)模拟实现自增列实例
  • Oracle查询表、视图、序列等信息查询
  • Oracle中的概念:同义词、序列与视图
  • oracle 重置序列从指定数字开始的方法详解
  • Oracle exp 导出用户对象
  • oracle查看会话锁定的所有对象代码分享
  • 测试添加Oracle中Blob数据类型对象
  • 基于Oracle的面向对象技术入门基础简析开发者网络Oracle
  • Oracle中关数据库对象的统计分析
  • Oracle使用PL/SQL操作COM对象
  • 浅析Oracle对象和数据的导入导出
  • Oracle PL/SQL编程有关的数据库对象
  • Oracle中重新编译无效的存储过程, 或函数、触发器等对象
  • 大家帮帮忙解决oracle大对象的问题吧。来者有分。
  • ORACLE 常用的SQL语法和数据对象
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • Oracle 数据库开发工具 Oracle SQL Developer
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • 关于JDBC连接Oracle数据库,是否必须有Oracle客户端
  • ORACLE数据库常用字段数据类型介绍
  • win2000+jbuilder6+oracle817编出的程序,在win2000下执行很好,在win98下却访问不了oracle数据库
  • oracle数据库导出和oracle导入数据的二种方法(oracle导入导出数据)
  • Oracle发布Oracle SQL Developer 1.2数据库开发工具 帮助用户简化开发工作
  • 怎样调出ORACLE数据库中的数据,该如何连接?
  • Oracle收购TimesTen 提高数据库软件性能
  • 卸载oracle数据库
  • Oracle数据库恢复后心得
  • linux上安装oracle 数据库后,是否能写shell程序实现数据库的自动启动。
  • Linux下如何用C语言操作Oracle数据库相关的图书推荐
  • Oracle数据库运行Oracle form时避免出现提示信息
  • Oracle欲收购开源数据库MySQL未果
  • 如何在JBuilder中连接Oracle数据库?
  • Oracle数据库访问参数文件的顺序
  • 循序渐进学习Oracle数据库
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle 10g和Oracle 11g网格技术介绍
  • Oracle EBS R12 支持 Oracle Database 11g
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3