重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
s.nextval 不要直接放insert into里面
成都创新互联公司-云计算及IDC服务提供商,涵盖公有云、IDC机房租用、联通服务器托管、等保安全、私有云建设等企业级互联网基础服务,来电联系:028-86922220
select s.nextval into l_seq from dual;
insert into table(seq) values(l_seq);
批量的话用数组
for i in 1 .. 10000 loop
select s.nextval into l_seq(i) from dual;
end loop;
or:
服务器端直接写一个function,执行insert into 返回当前插入结果插入的seq
or...方法很多很多
在oracle中sequence就是序号,每次取的时候它会自动增加。sequence与表没有关系。
1、Create Sequence
首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限。
创建语句如下:
CREATE SEQUENCE seqTest
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXvalue -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
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,否则会出错。
select 序列名.Nextval from dual;--生成并获得下一个序列
select 序列名.CURRVAL from dual;--如果与上述语句为同一会话,可以通过此句获得上面生成的序列。
sequence.CURRVAL 是获得最后一次引用sequence.NEXTVAL时返回的值。
因此在当前会话中,如果是第一次访问某个序列,在引用 sequence.CURRVAL 之前必须先引用 sequence.NEXTVAL。
1. oracle的逻辑是,同一会话中,必须先通过NEXTVAL后,才能获取CURRVAL值
2. 关于跳号,应该是cache的作用
你可以在SQL窗口打出sequence名称,右键- 属性,或右键-查看,来查看SEQ信息
3. oracle的逻辑sequence是不会rollback的,如果想要改变start值(或当前值),必须 drop sequence 再 re-create .
给你个说明:
CREATE SEQUENCE test_sequence
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10;
一旦定义了test_sequence,你就可以用CURRVAL,NEXTVAL
CURRVAL=返回 sequence的当前值(第一查询时会报未初始化,调用一次NEXTVAL后可用)
NEXTVAL=增加sequence的值,然后返回 sequence 值
比如:
test_sequence.CURRVAL
test_sequence.NEXTVAL
可以使用sequence的地方:
- 不包含子查询、snapshot、VIEW的 SELECT 语句
- INSERT语句的子查询中
- NSERT语句的VALUES中
- UPDATE 的 SET中