时间:2021-07-01 10:21:17 帮助过:5人阅读
1、Create Sequence
首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限。 创建语句如下:
- <span style="color: #0000ff;">CREATE</span><span style="color: #000000;"> SEQUENCE seqTest
- 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>
- 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>
- NOMAXvalue <span style="color: #008080;">--</span><span style="color: #008080;"> 不设置最大值</span>
- NOCYCLE <span style="color: #008080;">--</span><span style="color: #008080;"> 一直累加,不循环</span>
- 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值
如得到上边创建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 sequence SEQTEST maxvalue 9999999; 另: SEQUENCE_CACHE_ENTRIES参数,设置能同时被cache的sequence数目。4、Drop Sequence DROP SEQUENCE seqTest;
5、一个例子
- <span style="color: #0000ff;">create</span><span style="color: #000000;"> sequence SEQ_ID
- minvalue </span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">
- maxvalue </span><span style="color: #800000; font-weight: bold;">99999999</span><span style="color: #000000;">
- start </span><span style="color: #0000ff;">with</span> <span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">
- increment </span><span style="color: #0000ff;">by</span> <span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">
- nocache
- </span><span style="color: #0000ff;">order</span><span style="color: #000000;">;
- 建解发器代码为:
- </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
- 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>
- <span style="color: #0000ff;">for</span><span style="color: #000000;"> each row
- </span><span style="color: #0000ff;">declare</span><span style="color: #000000;">
- nextid </span><span style="color: #0000ff;">number</span><span style="color: #000000;">;
- </span><span style="color: #0000ff;">begin</span>
- <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>
- <span style="color: #0000ff;">select</span> SEQ_ID.nextval <span style="color: #008080;">--</span><span style="color: #008080;">SEQ_ID正是刚才创建的</span>
- <span style="color: #0000ff;">into</span><span style="color: #000000;"> nextid
- </span><span style="color: #0000ff;">from</span><span style="color: #000000;"> sys.dual;
- :new.DepartId:</span><span style="color: #808080;">=</span><span style="color: #000000;">nextid;
- </span><span style="color: #0000ff;">end</span> <span style="color: #0000ff;">if</span><span style="color: #000000;">;
- </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用法 (自增长)
标签: