Oracle序列

  • 格式:doc
  • 大小:55.00 KB
  • 文档页数:8

在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方。

1、Create Sequence

(注释:你需要有CREATE SEQUENCE或CREATE ANY SEQUENCE权限)

CREATE SEQUENCE emp_sequence

INCREMENT BY 1 —— 每次加几个

START WITH 1 —— 从1开始计数

MAXVALUE —— 最大值值

NOMAXVALUE —— 不设置最大值

NOCYCLE —— 一直累加,不循环

CYCLE

CACHE 10;

只要定义了emp_sequence,你就可以用使CURRVAL,NEXTVAL

CURRVAL=返回 sequence的当前值

NEXTVAL=增加sequence的值,然后返回 sequence 值

例如:

emp_sequence.CURRVAL

emp_sequence.NEXTVAL

insert into dept (deptno, dname, loc) values

(emp_sequence.nextval, '物流部', '苏州');

//查询序列的当前值

select emp_sequence.currval from dual;

可以使用sequence的地方: 。 不包含子查询、snapshot、VIEW的 SELECT 语句

。INSERT语句的子查询中

。NSERT语句的VALUES中

。UPDATE 的 SET中

可以看如下例子:

INSERT INTO emp VALUES

(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);

SELECT empseq.CURRVAL FROM DUAL;

需要注意的是:

第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次 SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就会是不一样的。

- 假如指定CACHE值,Oracle就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,Oracle自动再取一组 到cache. 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失。 所以可以在create sequence的时候用nocache防止这种情况。

2、Alter Sequence

你需要有sequence的owner,或者拥有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数。如果想要改变start值,必须 drop sequence 再 re-create .

Alter sequence示例: ALTER SEQUENCE emp_sequence INCREMENT BY 10 MAXVALUE 10000

CYCLE -- 到10000后从头开始 NOCACHE ;

可以影响Sequence的初始化参数:

SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。

3、Drop Sequence

DROP SEQUENCE order_seq;

异常: 由于已经达到了序列的最大值,如果继续添加,会报出下面的异常信息!

java.sql.SQLException: ORA-08004: 序列 EMP_SEQUENCE.NEXTVAL

exceeds MAXVALUE 无法实例化

at

oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)

at

oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112)

at

oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173)

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455)

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413)

at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1030)

at

oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194)

at

oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:947)

at

oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1222)

at

oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3381)

at

oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3462)

at

oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1349)

at it.test.EmpDAO.addDept(EmpDAO.java:46)

at it.test.EmpDAO.main(EmpDAO.java:115)

主键冲突: 会报出下列异常!

java.sql.SQLIntegrityConstraintViolationException:

ORA-00001: 违反唯一约束条件 (SCOTT.PK_DEPT)

oracle 序列

序列经常用了,但是很快就忘记了,今天通过网上或者自己知道的一些,总结了一下,在这写一下,为了自己以后复习。

1.序列是什么

序列SEQUENCE 是解决并发和性能问题,避免发生重复值。它是一个原子事物,取了值就已经生成一个不可再重复的数据,保证每个请求生成唯一的值。

2.序列的特征

(1) 序列会按自动递增或者递减生成一个唯一的号,它是整型。

(2) 序列是共享对象,不同的会话可以去读取该SEQUENCE.

(3)它可以代替应用代码中实现唯一值的序列号。 (4)可以将序列的一部分值预分配到内从,这样就能更快的访问SEQUENCE.

3.序列的语法

I NCREMENT BY N 是增长频率N,表示每次增长多少,序列之间的间隔,序列器最终的值不能小于0.

START WITH N 表示从N开始,指定生成的第一个序列。

MAXVALUE N|NOMAXVALUE 表示最大值N|表示默认最大值,也就是10^27

CYCLE|NOCYLE 表示循环,当你到最大值时就又进行一次循环|表示没有循环

CACHE N|NOCACHE 表示有你每次在内存中存放了N个SEQUENCE|

4.举例创建序列

create sequence MY_SEQUENCEminvalue 1maxvalue 999start with 1increment by 1cache

20;

创建好了sequence,可以在user_sequences 中看到sequence的信息

序列的两个值 a.nextval 返回下一个值

b.currval 返回当前的值

注:currval必须区nextval后才会有值,否则没有值。

它们两个使用的地方

a.非子查询的select语句中

b.insert语句中查询的select列表

c.insert 语句的values中

d.update set字句中

不允许出现的地方

a.视图的select的列表

b.有distinct限制的select列表。

c.带有group by,having,order by的select语句中

d.delete,update操作可更新视图中,不允许出现。

e.default 表达式中

cache的一些问题

cache里可以存放一些序列,但是因为cache数字在内存中,那就可能有丢失的风险,比如回滚事物,删除一些序列号,系统奔溃,被别的共享池对象挤出去,这样就会造成GAP。

举例子:如上面创建的序列,那么它的cache是20

SQL> select my_sequence.nextval from dual;

NEXTVAL

----------