您的位置:首页 > 数据库 > Oracle

ORACLE 序列

2016-01-05 13:53 393 查看
1)创建序列

Oracle序列的语法格式为:

CREATE SEQUENCE 序列名

[INCREMENT BY n]

[START WITH n]

[{MAXVALUE/ MINVALUE n|NOMAXVALUE}]

[{CYCLE|NOCYCLE}]

[{CACHE n|NOCACHE}];

a.INCREMENT BY用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表Oracle序列的值是按照此步长递减的。
b.START WITH 定义序列的初始值(即产生的第一个值),默认为1。
c.MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增Oracle序列,系统能够产生的最大值是10的27次方
d.MINVALUE定义序列生成器能产生的最小值。选项NOMINVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是-10的26次方
e.CYCLE和NOCYCLE 表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。
f.CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。当序列走到LAST_NUMBER时,即缓存的值已用完,自动生成下一个LAST_NUMBER,LAST_NUMBER=当前值+CACHE
SIZE
2)删除序列

语法:DROP SEQUENCE 序列名;

3)修改序列

ALTER SEQUENCE 序列名

  [INCREMENT BY n]

  [{MAXVALUE/ MINVALUE n|NOMAXVALUE}]

  [{CYCLE|NOCYCLE}]

  [{CACHE n|NOCACHE}];

不能修改序列的初始值

4)使用

1.直接调用
调用NEXTVAL将生成序列中的下一个序列号,调用时要指出序列名,即用以下方式调用: 序列名.NEXTVAL
CURRVAL用于产生序列的当前值,无论调用多少次都不会产生序列的下一个值。如果序列还没有通过调用NEXTVAL产生过序列的下一个值,先引用CURRVAL没有意义。调用CURRVAL的方法同上,要指出序列名,即用以下方式调用:序列名.CURRVAL
2.建立触发器使用

假设有表TEST,其主键为TEST_ID
(1)建立递增序列SEQ_WUHEN:
create sequence SEQ_WUHEN
increment by 1

start with 1
minvalue 1 nomaxvalue
nocycle;

(2)建立触发器,当有数据插入表TEST时,使用Oracle序列为其去的递增的主键值

create trigger TRG_WUHEN before insert on WUHEN

for each row

begin

select SEQ_WUHEN.nextval into :new.WUHEN_ID from dual;
end;

5)查询

[align=left]SQL> desc dba_sequences;[/align]
[align=left]Name           Type         Nullable Default Comments                                    [/align]
[align=left]-------------- ------------ -------- ------- --------------------------------------------[/align]
[align=left]SEQUENCE_OWNER VARCHAR2(30)                  Name of the owner of the sequence           [/align]
[align=left]SEQUENCE_NAME  VARCHAR2(30)                  SEQUENCE name                               [/align]
[align=left]MIN_VALUE      NUMBER       Y                Minimum value of the sequence               [/align]
[align=left]MAX_VALUE      NUMBER       Y                Maximum value of the sequence               [/align]
INCREMENT_BY   NUMBER                        Value by which sequence is incremented      
[align=left]CYCLE_FLAG     VARCHAR2(1)  Y                Does sequence wrap around on reaching limit?[/align]
[align=left]ORDER_FLAG     VARCHAR2(1)  Y                Are sequence numbers generated in order?    [/align]
[align=left]CACHE_SIZE     NUMBER                        Number of sequence numbers to cache         [/align]
[align=left]LAST_NUMBER    NUMBER                        Last sequence number written to disk      [/align]

5)序列复位

[align=left]create or replace procedure pkg_seq_reset(v_seqname varchar2 ) as[/align]
[align=left]n number( 10);[/align]
[align=left]tsql varchar2( 100);[/align]
[align=left]begin[/align]
execute immediate 'alter
sequence '||v_seqname|| ' minvalue
0'; --若序列最小值等于初始值,需修改序列使最小值小于初始值
execute immediate 'select
'||v_seqname|| '.nextval from dual' into n;
[align=left]  n:=-(n);[/align]
  tsql:='alter sequence '||v_seqname|| '
increment by '|| n; --使序列负增长
[align=left]execute immediate tsql;[/align]
execute immediate 'select
'||v_seqname|| '.nextval from dual' into n; --序列回到最初值。注意n不能省略,省略后这步的执行将在下一步被回退,判断为动态sql造成的,原因未知。
execute immediate 'alter
sequence '||v_seqname|| ' increment
by 1';
[align=left]end pkg_seq_reset;[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle plsql 序列