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序列的语法格式为:
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]
相关文章推荐
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Oracle 10g R2不能使用EM的问题
- 表空间操作
- PreparedStatement中in子句的处理
- VMware下RedHat4.8_64位安装Oracle 10g RAC--简略脚本
- oracle sql日期比较
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- OS block size和Oracle block size,查找OS Blocksize的方法
- oracle中创建数据库和表空间的几点总结
- 数据库自动备份脚本
- oracle的nvl函数的使用介绍
- 解决oracle用户连接失败的解决方法
- oracle的一些tips技巧
- Oracle 下的开发日积月累
- Oracle存储过程之数据库中获取数据实例
- Windows下ORACLE 10g完全卸载的方法分析
- plsql与tsql的语法不同
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页