您的位置: 翼速应用 > 业内知识 > 数据库 > 正文

关于Oracle序列SEQUENCE的详细解析

本文是关于Oracle序列SEQUENCE的详细解析,通过示例代码给大家详细介绍一下,希望能给大家带来帮助,下面一起来看一下。


 关于Oracle序列SEQUENCE的详细解析


关于Oracle序列SEQUENCE的详细解析


一、序列介绍


Oracle的序列是一种数据库对象,主要作用是用来产生唯一值。序列被创建以后可以通过数据字典找到序列对象,因此序列可以被多个对象共享。


二、创建序列


序列使用CREATE SEQUENCE语法进行创建:


CREATE SEQUENCE sequence
[INCREMENT BY n]
 [START WITH n]
 [{MAXVALUE n | NOMAXVALUE}]
 [{MINVALUE n | NOMINVALUE}]
 [{CYCLE | NOCYCLE}]
 [{CACHE n | NOCACHE}];


●  NCREMENT BY:用于定义序列的步长,如果省略,则默认为1,如果是负值,则代表序列的值是递减的。


●  START WITH:定义序列的初始值(即产生的第一个值),默认为1。


●  MAXVALUE:定义序列能生成的最大值。NOMAXVALUE是默认选项,代表没有最大值,这时,对于递增序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。


●  MINVALUE:定义序列能生成的最小值。NOMINVALUE是默认选项,代表没有最小值,这时,对于递减序列,系统能够产生的最小值是负的10的26次方;对于递减序列,最小值是1。


●  CYCLE和NOCYCLE:表示当序列生成器的值达到限制后是否循环。如果循环,当递增序列达到最大值时,循环到最小值;对于递减序列,达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。


●  CACHE:定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。


例如:


CREATE SEQUENCE invoice_seq
INCREMENT BY 1
START WITH 1
MAXVALUE 9999999
NOCYCLE NOCACHE;


三、查询序列


一旦序列被创建,序列的创建代码就被文本化在数据字典中,可以在user_objects数据字典中看到,如:


SELECT object_name,object_id,object_type  FROM user_objects WHERE object_name = 'INVOICE_SEQ';


在user_sequences表中保存了序列明细信息:


SELECT sequence_name, min_value, max_value, increment_by, last_number  FROM user_sequences;


四、使用序列


NEXTVAL和CURRVAL伪列


●  NEXTVAL:返回下一个可用的序列值,它每次返回一个唯一的被引用值,实际对不同的用户也是如此。当使用sequence.NEXTVAL时,一个新的序列数被产生并且当前的序列数被放入CURRVAL。


●  CURRVAL:获得当前的序列值。在首次使用NEXTVAL之前就使用CURRVAL的话,会报错。


使用如下 :


SELECT invoice_seq.CURRVAL,invoice_seq.NEXTVAL FROM DUAL;
 
INSERT INTO invoice  (invoice_id, vendor_id, invoice_number, invoice_total  )
      VALUES (invoice_seq.NEXTVAL, 10, 'INV' || invoice_seq.CURRVAL, 100  );


可以在下面的上下文中使用NEXTVAL和CURRVAL:


●  不是子查询的一部分的SELECT语句的字段列表。

●  INSERT语句中子查询的SELECT列表。

●  INSERT语句中的VALUES子句。

●  UPDATE语句中的SET子句。


不能再以下的上下文中使用NEXTVAL和CURRVAL:


●  视图的SELECT列表。

●  带DISTINCT的SELECT语句。

●  带GROUP BY、HAVING或ORDER BY子句的SELECT语句。

●  在SELECT、DELETE或UPDATE语句中的子句。

●  在CREATE TABLE或ALTER TABLE语句中的DEFAULT表达式。


另外要注意,ROLLBACK并不能使序列值回滚。


五、修改序列


如:


ALTER SEQUENCE invoice_seq     INCREMENT BY 2 MAXVALUE 10   NOCACHE  NOCYCLE;


修改序列时,有如下几个限制:


●  不能该表序列的起始值。

●  最小值不能大于当前值。

●  最大值不能小于当前值。

●  修改后的序列规则不会影响以前的序列值,只有未来的序列值会受到影响。

●  用户必须具有ALTER SEQUENCE的权限。


六、删除序列


DROP SEQUENCE invoice_seq;


七、创建自增序列


1、创建一个序列


create sequence sq_recid 
minvalue 1 maxvalue 999999  increment by 1   start with 1 noCYCLE;


2、创建一个触发器


create or replace trigger  trg_test
  before  insert on test for each row
begin
  select sq_recid.nextval into :new.ID from dual;
end;
 
alter  trigger trg_test  enable;


3、在C#中也可以手工插入序列到表中


string sql="insert into test(ID,otherCol)value (Sql_recid.nextval,***)
    retuing ID into :ID"


 关于Oracle序列SEQUENCE的详细解析就到这里了,翼速应用平台内有更多相关资讯,欢迎查阅!


我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题