当前位置:Gxlcms > 数据库问题 > ORACLE SEQUENCE用法 (自增长)

ORACLE SEQUENCE用法 (自增长)

时间:2021-07-01 10:21:17 帮助过:5人阅读

1、Create Sequence

    首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限。

    创建语句如下:

  

  1. <span style="color: #0000ff;">CREATE</span><span style="color: #000000;"> SEQUENCE seqTest
  2. INCREMENT </span><span style="color: #0000ff;">BY</span> <span style="color: #800000; font-weight: bold;">1</span> <span style="color: #008080;">--</span><span style="color: #008080;"> 每次加几个</span>
  3. START <span style="color: #0000ff;">WITH</span> <span style="color: #800000; font-weight: bold;">1</span> <span style="color: #008080;">--</span><span style="color: #008080;"> 从1开始计数</span>
  4. NOMAXvalue <span style="color: #008080;">--</span><span style="color: #008080;"> 不设置最大值</span>
  5. NOCYCLE <span style="color: #008080;">--</span><span style="color: #008080;"> 一直累加,不循环</span>
  6. CACHE <span style="color: #800000; font-weight: bold;">10</span>; <span style="color: #008080;">--</span><span style="color: #008080;">设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE</span>

2、得到Sequence值 

定义好sequence后,你就可以用currVal,nextVal取得值。
    CurrVal:返回 sequence的当前值 
    NextVal:增加sequence的值,然后返回 增加后sequence值 

  得到值语句如下: SELECT Sequence名称.CurrVal FROM DUAL; 

  如得到上边创建Sequence值的语句为:

select seqtest.currval from dual

 

在Sql语句中可以使用sequence的地方: 
    - 不包含子查询、snapshot、VIEW的 SELECT 语句 
    - INSERT语句的子查询中 
    - INSERT语句的values中 
    - UPDATE 的 SET中

如在插入语句中

 

insert into 表名(id,name)values(seqtest.Nextval,sequence 插入测试);

 

 

 注:

    - 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。

      CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。

       一次NEXTVAL会增加一次 SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。
    - 如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组 到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。

 

 

 

 

3、Alter Sequence 
    拥有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 re-create。

 

例:

alter sequence SEQTEST maxvalue 9999999;     另: SEQUENCE_CACHE_ENTRIES参数,设置能同时被cache的sequence数目。

 

4、Drop Sequence DROP SEQUENCE seqTest; 

 

 

5、一个例子

 

  1. <span style="color: #0000ff;">create</span><span style="color: #000000;"> sequence SEQ_ID
  2. minvalue </span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">
  3. maxvalue </span><span style="color: #800000; font-weight: bold;">99999999</span><span style="color: #000000;">
  4. start </span><span style="color: #0000ff;">with</span> <span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">
  5. increment </span><span style="color: #0000ff;">by</span> <span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">
  6. nocache
  7. </span><span style="color: #0000ff;">order</span><span style="color: #000000;">;
  8. 建解发器代码为:
  9. </span><span style="color: #0000ff;">create</span> <span style="color: #808080;">or</span> <span style="color: #ff00ff;">replace</span> <span style="color: #0000ff;">trigger</span><span style="color: #000000;"> tri_test_id
  10. before </span><span style="color: #0000ff;">insert</span> <span style="color: #0000ff;">on</span> S_Depart <span style="color: #008080;">--</span><span style="color: #008080;">S_Depart 是表名</span>
  11. <span style="color: #0000ff;">for</span><span style="color: #000000;"> each row
  12. </span><span style="color: #0000ff;">declare</span><span style="color: #000000;">
  13. nextid </span><span style="color: #0000ff;">number</span><span style="color: #000000;">;
  14. </span><span style="color: #0000ff;">begin</span>
  15. <span style="color: #0000ff;">IF</span> :new.DepartId <span style="color: #0000ff;">IS</span> NULLor :new.DepartId<span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">0</span> <span style="color: #0000ff;">THEN</span> <span style="color: #008080;">--</span><span style="color: #008080;">DepartId是列名</span>
  16. <span style="color: #0000ff;">select</span> SEQ_ID.nextval <span style="color: #008080;">--</span><span style="color: #008080;">SEQ_ID正是刚才创建的</span>
  17. <span style="color: #0000ff;">into</span><span style="color: #000000;"> nextid
  18. </span><span style="color: #0000ff;">from</span><span style="color: #000000;"> sys.dual;
  19. :new.DepartId:</span><span style="color: #808080;">=</span><span style="color: #000000;">nextid;
  20. </span><span style="color: #0000ff;">end</span> <span style="color: #0000ff;">if</span><span style="color: #000000;">;
  21. </span><span style="color: #0000ff;">end</span> tri_test_id;

 

 OK,上面的代码就可以实现自动递增的功能了。

 

 

 

    注::new 代表 数据改变后的新值,相对应的有 :old 原值

          := 代表 赋值

          :nextid表示引用sqlplus中定义的变量

                                                        参考文档:http://www.cnblogs.com/scottckt/archive/2011/09/20/2182168.html

 

ORACLE SEQUENCE用法 (自增长)

标签:

人气教程排行