Oracle中如何创建使用SEQUENCES

近期关于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)

猜你喜欢

发表回复

本站作者才能评论

评论列表(3条)

  • 新益世纪的头像
    新益世纪 2026年06月06日

    我是新益世纪的签约作者“新益世纪”

  • 新益世纪
    新益世纪 2026年06月06日

    本文概览:近期关于Oracle中如何创建使用SEQUENCES的讨论热度持续攀升,我们通过多方渠道收集整理了相关资讯,并进行了系统化的梳理。若这些内容恰好能为您提供参考,将是我们最大的荣...

  • 新益世纪
    用户060605 2026年06月06日

    文章不错《Oracle中如何创建使用SEQUENCES》内容很有帮助

联系我们:

邮件:新益世纪@gmail.com

工作时间:周一至周五,9:30-17:30,节假日休息

关注微信