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)查询
SQL> desc dba_sequences;
Name Type Nullable Default Comments
-------------- ------------ -------- ------- --------------------------------------------
SEQUENCE_OWNER VARCHAR2(30) Name of the owner of the sequence
SEQUENCE_NAME VARCHAR2(30) SEQUENCE name
MIN_VALUE NUMBER Y Minimum value of the sequence
MAX_VALUE NUMBER Y Maximum value of the sequence
INCREMENT_BY NUMBER Value by which sequence is incremented
CYCLE_FLAG VARCHAR2(1) Y Does sequence wrap around on reaching limit?
ORDER_FLAG VARCHAR2(1) Y Are sequence numbers generated in order?
CACHE_SIZE NUMBER Number of sequence numbers to cache
LAST_NUMBER NUMBER Last sequence number written to disk
5)序列复位
create
or
replace
procedure
pkg_seq_reset(v_seqname
varchar2
)
as
n
number
(
10
);
tsql
varchar2
(
100
);
begin
execute
immediate
'alter sequence '
||v_seqname||
' minvalue 0'
;
--若序列最小值等于初始值,需修改序列使最小值小于初始值
execute
immediate
'select '
||v_seqname||
'.nextval from dual'
into
n;
n:=-(n);
tsql:=
'alter sequence '
||v_seqname||
' increment by '
|| n;
--使序列负增长
execute
immediate
tsql;
execute
immediate
'select '
||v_seqname||
'.nextval from dual'
into
n;
--序列回到最初值。注意n不能省略,省略后这步的执行将在下一步被回退,判断为动态sql造成的,原因未知。
execute
immediate
'alter sequence '
||v_seqname||
' increment by 1'
;
end
pkg_seq_reset;