Oracle的序列是一种数据库对象,主要作用是用来产生唯一值。序列被创建以后可以通过数据字典找到序列对象,因此序列可以被多个对象共享。
序列使用CREATE SEQUENCE语法进行创建:
- CREATE SEQUENCE sequence
- [INCREMENT BY n]
- [START WITH n]
- [{MAXVALUE n | NOMAXVALUE}]
- [{MINVALUE n | NOMINVALUE}]
- [{CYCLE | NOCYCLE}]
- [{CACHE n | NOCACHE}];
- 1
- 2
- 3
- 4
- 5
- 6
- 7
如:
- CREATE SEQUENCE invoice_seq
- INCREMENT BY 1
- START WITH 1
- MAXVALUE 9999999
- NOCYCLE NOCACHE;
- 1
- 2
- 3
- 4
- 5
一旦序列被创建,序列的创建代码就被文本化在数据字典中,可以在
数据字典中看到,如:
- user_objects
- SELECT object_name,object_id,object_type
- FROM user_objects
- WHERE object_name = 'INVOICE_SEQ';
- 1
- 2
- 3
在
表中保存了序列明细信息:
- user_sequences
- SELECT sequence_name, min_value, max_value, increment_by, last_number
- FROM user_sequences;
- 1
- 2
在首次使用NEXTVAL之前就使用CURRVAL的话,会报错。
使用如下 :
- SELECT invoice_seq.CURRVAL,invoice_seq.NEXTVAL FROM DUAL;
- INSERT INTO invoice
- (invoice_id, vendor_id, invoice_number, invoice_total
- )
- VALUES (invoice_seq.NEXTVAL, 10, 'INV' || invoice_seq.CURRVAL, 100
- );
- 1
- 2
- 3
- 4
- 5
- 6
- 7
可以在下面的上下文中使用NEXTVAL和CURRVAL:
- 不是子查询的一部分的SELECT语句的字段列表。
- INSERT语句中子查询的SELECT列表。
- INSERT语句中的VALUES子句。
- UPDATE语句中的SET子句。
不能再以下的上下文中使用NEXTVAL和CURRVAL:
- 视图的SELECT列表。
- 带DISTINCT的SELECT语句。
- 带GROUP BY、HAVING或ORDER BY子句的SELECT语句。
- 在SELECT、DELETE或UPDATE语句中的子句。
- 在CREATE TABLE或ALTER TABLE语句中的DEFAULT表达式。
另外要注意,ROLLBACK并不能使序列值回滚。
如:
- ALTER SEQUENCE invoice_seq
- INCREMENT BY 2
- MAXVALUE 10
- NOCACHE
- NOCYCLE;
- 1
- 2
- 3
- 4
- 5
修改序列时,有如下几个限制:
- 不能该表序列的起始值。
- 最小值不能大于当前值。
- 最大值不能小于当前值。
- 修改后的序列规则不会影响以前的序列值,只有未来的序列值会受到影响。
- 用户必须具有ALTER SEQUENCE的权限。
如:
- DROP SEQUENCE invoice_seq;
- 1
百度搜索“就爱阅读”,专业资料,生活学习,尽在就爱阅读网92to.com,您的在线图书馆!
来源: http://www.92to.com/bangong/2017/10-17/30130172.html