日期:2014-05-16  浏览次数:20614 次

Oracle中,何种情况下Sequence被限制使用
  Oracle中,何种情况下Sequence被限制使用

1、在使用Oracle序列的currval和nextval时的限制

创建一个序列
create sequence test_seq
minvalue 1
maxvalue 10000000
start with 1
increment by 1
cache 20;

2、在delete,select,update语句的子查询中不能使用sequence的值

SQL>  delete from test_jy where test_id <(select test_seq.currval from dual);
delete from test_jy where test_id <(select test_seq.currval from dual)
ORA-02287: 此处不允许序号
SQL>  select * from test_jy where test_id <(select test_seq.currval from dual);
select * from test_jy where test_id <(select test_seq.currval from dual)
ORA-02287: 此处不允许序号
SQL>  update test_jy set test_id=0 where test_id <(select test_seq.currval from dual);
update test_jy set test_id=0 where test_id <(select test_seq.currval from dual)
ORA-02287: 此处不允许序号

3、在查询视图或物化视图时

SQL> select a.* from test_v a where a.userid<test_seq.currval  ;
select a.* from test_v a where a.userid<test_seq.currval
ORA-02287: 此处不允许序号

4、带有distinct操作符的select语句不能使用

SQL> select distinct a.*,test_seq.currval from test_v a ;
select distinct a.*,test_seq.currval from test_v a
ORA-02287: 此处不允许序号

5、有group by,order by操作的select语句不能使用

SQL>  select  test_jy.*,test_seq.currval from test_jy group by test_jy.test_id;
select  test_jy.*,test_seq.currval from test_jy group by test_jy.test_id
ORA-02287: 此处不允许序号
SQL>  select  test_jy.*,test_seq.currval from test_jy order by test_jy.test_id;
select  test_jy.*,test_seq.currval from test_jy order by test_jy.test_id
ORA-02287: 此处不允许序号

6、有UNION, INTERSECT, MINUS操作符的语句不能使用

SQL> select  test_jy.*,test_seq.currval from test_jy where test_id=1
union
select  test_jy.*,test_seq.currval from test_jy where test_id=2;
select  test_jy.*,test_seq.currval from test_jy where test_id=1
union
select  test_jy.*,test_seq.currval from test_jy where test_id=2
ORA-02287: 此处不允许序号
SQL> select  test_jy.*,test_seq.currval from test_jy where test_id=1
intersect
select  test_jy.*,test_seq.currval from test_jy where test_id=2;
select  test_jy.*,test_seq.currval from test_jy where test_id=1
intersect
select  test_jy.*,test_seq.currval from test_jy where test_id=2
ORA-02287: 此处不允许序号
SQL> select  test_jy.*,test_seq.currval from test_jy where test_id=1
minus
select  test_jy.*,test_seq.currval from test_jy where test_id=2;
select  test_jy.*,test_seq.currval from test_jy where test_id=1
minus
select  test_jy.*,test_seq.currval from test_jy where test_id=2
ORA-02287: 此处不允许序号

7、在select语句中的where子句中

SQL> select  test_jy.* from test_jy where test_id<test_seq.currval;
select  test_jy.* from test_jy where test_id<test_seq.currval
ORA-02287: 此处不允许序号

8、在create table或alter table语句的中default值是不能使用sequence

SQL> alter table test_jy modify test_id number(20) default test_seq.currval;
alter table test_jy modify test_id number(20) default test_seq.currval
ORA-00984: 列在此处不允许

9、还有就在check约束中不能使用

本文来源:[url]http://www.55linux.com/oracle/DBA/536.html | 55linux[/url]