Oracle PL/SQL开发基础(第十四弹:序列)

序列简介

Oracle的序列是一种数据库对象,主要作用是用来产生唯一值。序列被创建以后可以通过数据字典找到序列对象,因此序列可以被多个对象共享。

创建序列

序列使用CREATE SEQUENCE语法进行创建:

CREATE SEQUENCE sequence 
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
  • sequence:指定序列的名称。
  • INCREMENT BY:用于定义序列的步长,如果省略,则默认为1,如果是负值,则代表序列的值是递减的。
  • START WITH:定义序列的初始值(即产生的第一个值),默认为1。
  • MAXVALUE:定义序列能生成的最大值。NOMAXVALUE是默认选项,代表没有最大值,这时,对于递增序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。
  • MINVALUE:定义序列能生成的最小值。NOMINVALUE是默认选项,代表没有最小值,这时,对于递减序列,系统能够产生的最小值是负的10的26次方;对于递减序列,最小值是1。
  • CYCLE和NOCYCLE:表示当序列生成器的值达到限制后是否循环。如果循环,当递增序列达到最大值时,循环到最小值;对于递减序列,达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。
  • CACHE:定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。

如:

CREATE SEQUENCE invoice_seq
INCREMENT BY 1
START WITH 1
MAXVALUE 9999999
NOCYCLE NOCACHE;

一旦序列被创建,序列的创建代码就被文本化在数据字典中,可以在user_objects数据字典中看到,如:

SELECT object_name,object_id,object_type
  FROM user_objects
 WHERE object_name = 'INVOICE_SEQ';

user_sequences表中保存了序列明细信息:

SELECT sequence_name, min_value, max_value, increment_by, last_number
  FROM user_sequences;

NEXTVAL和CURRVAL伪列

  • NEXTVAL:返回下一个可用的序列值,它每次返回一个唯一的被引用值,实际对不同的用户也是如此。当使用sequence.NEXTVAL时,一个新的序列数被产生并且当前的序列数被放入CURRVAL。
  • CURRVAL:获得当前的序列值。

在首次使用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
            );

可以在下面的上下文中使用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;

修改序列时,有如下几个限制:
- 不能该表序列的起始值。
- 最小值不能大于当前值。
- 最大值不能小于当前值。
- 修改后的序列规则不会影响以前的序列值,只有未来的序列值会受到影响。
- 用户必须具有ALTER SEQUENCE的权限。

删除序列

如:

DROP SEQUENCE invoice_seq;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值