NCE [ schema. ]sequence
{ INCREMENT BY integer
| { MAXVALUE integer | NOMAXVALUE }
| { MINVALUE integer | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE integer | NOCACHE }
| { ORDER | NOORDER }
}
修改时的三个注意事项:
如果要使序列start with不同的数字,只能删除序列重建。
如果在使用NEXTVAL初始化序列前改变INCREMENT BY的值,一些序列号会被跳过。解决跳过问题的方法--删除重建
修改的各个参数的新值依然要满足create sequence各参数介绍中的描述。
NEXTVAL初始化序列前改变INCREMENT BY的值示例:
create sequence bys.seq3
increment by 3
start with 5
maxvalue 18
nominvalue
cycle
cache 4;
BYS@ bys3>alter sequence bys.seq3 increment by 5; --初始化前修改
Sequence altered.
BYS@ bys3>select seq3.nextval from dual; --初始化时确实跳过了一些数字。。
NEXTVAL
----------
7
BYS@ bys3>select seq3.nextval from dual;
NEXTVAL
----------
12
示例修改语句:
ALTER SEQUENCE customers_seq MAXVALUE 1500;
ALTER SEQUENCE customers_seq CYCLE CACHE 5;
删除序列语句:
DROP SEQUENCE [ schema. ]sequence_name ;
如:BYS@ bys3>drop sequence bys.seq2;
############################
ORACLE sequence使用示例
详见官方文档--http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns002.htm#i1006157
序列常见使用场景:
1可以在SELECT 语句,CREATE TABLE ... AS SELECT语句, CREATE MATERIALIZED VIEW ... AS SELECT中使用。
2在UPDATE的SET中,在INSERT 的子句或VALUES中。序列可以由多个用户同时访问而不产生等待或锁定。
3第一次查询要用 NEXTVAL,返回序列的初始值。
4查询当前序列号用:CURRVAL,返回的是最后一次引用NEXTVAL返回的值。
5查询下一个序列号用NEXTVAL--用此命令时,sequence会先增加1或increment by指定的值,然后返回sequence值
本实验中的查询:
BYS@ bys3>select test_seq.currval from dual; ---未使用NEXTVAL初始化,故报此错。
select test_seq.currval from dual
*
ERROR at line 1:
ORA-08002: sequence TEST_SEQ.CURRVAL is not yet defined in this session
BYS@ bys3>select test_seq.nextval from dual; 第一次使用NEXTVAL,显示的是创建时start with指定的值
NEXTVAL
----------
5
BYS@ bys3>select test_seq.currval from dual; 使用currval查到当前序列号---最后一次引用NEXTVAL返回的值
CURRVAL
----------
5
BYS@ bys3>select test_seq.nextval from dual; --一直执行nextval,观察序列达到maxvalue指定的值后如何循环使用
NEXTVAL
----------
17
BYS@ bys3>select test_seq.nextval from dual; --序列达到maxvalue指定的值后返回的是minvalue指定的值而不是start with了。如未指定minvalue或指定NOMINVALUE,则是返回1.
NEXTVAL
----------
4
BYS@ bys3>insert into test values(test_seq.nextval,'seqtest'); --使用INSERT语句调用序列
1 row created.
BYS@ bys3>select * from test;
OBJECT_NAME STATUS
------------ -------
10 seqtest
BYS@ bys3>insert into test values(test_seq.currval,'seqtest');
1 row created.
BYS@ bys3>select * from test;
OBJECT_NAME STATUS
------------ -------
10 seqtest
10 seqtest
BYS@ bys3>insert into test(object_name) select test_seq.nextval from dual; --使用INSERT子语调用序列
1 row created.
BYS@ bys3>select * from test;
OBJECT_NAME STATUS
------------ -------
10 13
10 16
4
BYS@ bys3>update test set status=test_seq.nextval; --使用UPDATE语句调用序列
2 rows updated.
BYS@ bys3>select * from test;
OBJECT_NAME STATUS
------------ -------
10 13
10 16
BYS@ bys3>delete test where status=test_seq.currval; --DELETE中不能使用sequence做条件
delete test where status=test_seq.currval
*
ERROR at line 1:
ORA-02287: sequence number not allowed here
利用解发器自动为表插入递增序列:---类似自增字段的作用
建解发器代码为:
create or replace trigger tri_test_id
before insert on test --test 是表名
for each row
declare
nextid number;
begin
IF :new.testid IS NULL or :new.testid=0 THEN --DepartId是列名
select seq1.nextval --seq1是提前创建好的序列的名字
into nextid from sys.dual;
:new.testid:=nextid;
end if;
end tri_test_id;
|