近期关于Oracle中如何创建使用SEQUENCES的讨论热度持续攀升,我们通过多方渠道收集整理了相关资讯,并进行了系统化的梳理。若这些内容恰好能为您提供参考,将是我们最大的荣幸。
Oracle提供了sequence对象,由系统提供自增长的序列号,通常用于生成数据库数据记录的自增长主键或序号的地方.
Oracle提供了sequence对象,由系统提供自增长的序列号,通常用于生成数据库数据记录的自增长主键或序号的地方.
下面介绍一下关于sequence 的生成,修改,删除等常用的操作:
1. 创建 Sequence
使用如下命令新建sequence(用户需要有CREATE SEQUENCE 或者CREATE ANY SEQUENCE权限):
CREATE SEQUENCE test_sequence
INCREMENT BY 1-- 每次加的个数据
START WITH 1-- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10 ;
[注意]
如果设置了CACHE值,ORACLE将在内存里预先放置一些sequence,以使存取速度更快。cache里面的取完后,oracle自动再取一组到cache。 但是,使用cache可能会跳号, 当遇到数据库突然异常down掉(shutdown abort),cache中的sequence就会丢失.
因此,推荐在create sequence的时候使用 nocache 选项。
2. 使用 sequence:
sequence.CURRVAL -- 返回 sequence的当前值
sequence.NEXTVAL -- 增加sequence的值,然后返回 sequence 值
[注意]
第一次NEXTVAL返回的是初始值;
随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。
CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,,否则会出错。
一次NEXTVAL会增加一次 SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。
sequence 存储在数据字典中,存储于user_sequences表
LAST_NUMBER 为最终序列号,也就是sequence游标当前所在的位置。
//get sequence last_number
SELECT LAST_NUMBER FROM USER_SEQUENCES WHERE SEQUENCE_NAME=TEST_SEQNAME
// NEXTVAL 使游标指向下一位(增一或减一)
SELECT SEQNAME.NEXTVAL FROM USER_SEQUENCES 得到下一位游标的值
3. 修改 Sequence
用户必须拥有ALTER ANY SEQUENCE 权限才能修改sequence. 可以alter除start至以外的所有sequence参数.
如果想要改变start值,必须 drop sequence 再 re-create.
命令格式如下:
ALTER SEQUENCE test_sequence
INCREMENT BY 10
MAXVALUE 10000
CYCLE-- 到10000后从头开始
NOCACHE ;
4. 删除 Sequence
DROP SEQUENCE order_seq;
更多Oracle相关信息见Oracle 专题页面 ?tid=12
ORACLE中怎么设置SEQUENCE权限?
好象它们两者没有依属联系,而确实在工作中又容易遇见此类问题.
从序列的角度来思考的话,仅跟用户相关。
以下步骤可以参考:
1 从系统视图中取得所有序列的相关信息。
注意相关权限。
select sequence_name,min_value,max_value,increment_by,last_number from all_sequences
如果能够能够排除 用户A的表数据,采用了用户B的sequence来生成数据的情况,那可以加上
where sequence_owner=' '; -----适合的用户
或者从USER_SEQUENCES中提取。
2 从关心的表中提取敏感字段的最大值
select max(id) from test;
3 将两者对比。或者将上述两个查询连接到一起来查询。如果当前该表没有被插入,并且,近期没有被删除,那么,该max(id)+1=last_number ;
如果非要弄清楚的话,那就将表数据保护起来,拒绝删除数据,当发现数据插入后,观察插入的频度和事务提交后序列列值变化的大小,由此最终能判断出是哪个序列号。基于非要准确的搞清楚的前提下,使用排出法,将上述最接近的序列按照从轻度怀疑到高度怀疑的顺序,再备份的情况下,依次删除、恢复.....这样肯定能搞准。
还有一个最好的办法以后遇到这种情况就简单了。在该表上建立基于插入后的触发器,在触发器中包含上面查询思想,将max(id)+1=last_number 的序列名返回。。。。则绝对不会错
.
知识有限,在此也期盼能学习到更高级的方法。
。.
ORACLE中怎么设置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?插入测试');
3、Alter Sequence?
拥有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 re-create。
4、Drop Sequence
DROP?SEQUENCE?seqTest;?
5、一个例子
create?or?replace?trigger?tri_test_id
before?insert?on?S_Depart--S_Depart?是表名
for?each?row
declare
nextid?number;
begin
IF?:new.DepartId?IS?NULLor?:new.DepartId=0?THEN?--DepartId是列名
select?SEQ_ID.nextval?--SEQ_ID正是刚才创建的
into?nextid
from?sys.dual;
:new.DepartId:=nextid;
end?if;
end?tri_test_id;
关于Oracle中如何创建使用SEQUENCES的探讨就到这里,您是否还有其他想了解的内容?欢迎在评论区留言告诉我们,同时别忘了点击关注哦!
评论列表(3条)
我是新益世纪的签约作者“新益世纪”
本文概览:近期关于Oracle中如何创建使用SEQUENCES的讨论热度持续攀升,我们通过多方渠道收集整理了相关资讯,并进行了系统化的梳理。若这些内容恰好能为您提供参考,将是我们最大的荣...
文章不错《Oracle中如何创建使用SEQUENCES》内容很有帮助