Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1011277
  • 博文数量: 584
  • 博客积分: 2293
  • 博客等级: 大尉
  • 技术积分: 3045
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-28 11:15
文章分类

全部博文(584)

文章存档

2012年(532)

2011年(47)

2009年(5)

我的朋友

分类:

2012-07-09 10:16:45

原文地址:Oracle中的sequence 作者:icybay

1、Create Sequence
  首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,
  CREATE SEQUENCE emp_sequence
  INCREMENT BY 1 — 每次加几个
  START WITH 1 — 从1开始计数
  NOMAXVALUE — 不设置最大值
  NOCYCLE — 一直累加,不循环
  CACHE 10;
  一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL
  CURRVAL=返回 sequence的当前值
  NEXTVAL=增加sequence的值,然后返回 sequence 值
  比如:
  emp_sequence.CURRVAL
  emp_sequence.NEXTVAL
  可以使用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的值,所以如果你在不同的SQl语句里面使用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数目。
  可以很简单的Drop Sequence
  DROP SEQUENCE order_seq;
  下面详细介绍NEXTVAL和CURRVAL用法以及sequence用法的限制
  使用 NEXTVAL
  第一次访问一个序列,在引用 sequence.CURRVAL 之前必须先引用 sequence.NEXTVAL。第一次引用 NEXTVAL,返回序列的初始值。后面每次引用 NEXTVAL,用已定义的 step 增加序列值并返回序列新的增加以后的值。
  在一个 SQL 语句中只能对给定的序列增加一次。即使在一个语句中多次指定 sequence.NEXTVAL,序列也只增加一次,所以每次 sequence.NEXTVAL 出现在同一 SQL 语句中返回相同的值。除了在同一语句中多次出现这种情况以外,每个sequence.NEXTVAL表达式都会增加序列,无论后来是否提交或回滚当前事务。如果在最终回滚的事务中指定sequence.NEXTVAL,某些序列数可能被跳过。
  如在PL/SQL中:
  查询nextval的值等于151
  select cheng.nextval from test1234
  执行insert语句
  insert into test1234 values(cheng.nextval,’bb’,22);
  commit或rollback后再查询nextval的值会增加到153
  使用 CURRVAL
  任何对CURRVAL的引用返回指定序列的当前值,该值是最后一次对NEXTVAL的引用所返回的值。用NEXTVAL生成一个新值以后,可以继续使用 CURRVAL访问这个值,不管另一个用户是否增加这个序列。如果sequence.CURRVAL和 sequence.NEXTVAL都出现在一个 SQL语句中,则序列只增加一次。在这种情况下,每个sequence.CURRVAL和 sequence.NEXTVAL表达式都返回相同的值,不管在语句中sequence.CURRVAL和sequence.NEXTVAL的顺序。
  如在PL/SQL中:
  select cheng.nextval,cheng.currval from test1234
  nextval和currval的值都是160
  序列的并发访问
  序列总是在数据库中生成唯一值,即使当多个用户并发地引用同一序列时也没有可察觉的等待或锁定。当多个用户使用 NEXTVAL 来增长序列时,每个用户生成一个其他用户不可见的唯一值。当多个用户并发地增加同一序列时,每个用户看到的值是有差异的。例如,一个用户可能从一个序列生成一组值,如 11、14、16 和 18,而另一个用户并发地从同一序列生成值 12、13、15 和 17。
  sequence使用的限制
  NEXTVAL 和 CURRVAL 只在 SQL 语句中有效,并不在 SPL 语句中直接有效。(但是使用NEXTVAL 和CURRVAL的SQL语句可用于SPL例程)以下限制应用于 SQL 语句中的这些运算符:
  [1]在 CREATE TABLE 或 ALTER TABLE 语句中,在下列上下文中不能指定 NEXTVAL 或 CURRVAL:
  在 DEFAULT 子句中。
  在检查约束中。
  [2]在 SELECT 语句中,下列上下文中不能指定 NEXTVAL 或 CURRVAL:
  使用 DISTINCT 关键字时在投影列表中。
  在 WHERE、GROUP BY 或 ORDER BY 子句中。
  在子查询中。
  在 UNION 运算符结合 SELECT 语句时。
  [3]在下列这些上下文中也不能指定 NEXTVAL 或 CURRVAL:
  在分段存储表达式中
  在对另一个数据库中的远程序列对象的引用中。
  Oracle中实现类似自动增加 ID 的功能
  我们经常在设计数据库的时候用一个系统自动分配的ID来作为我们的主键,但是在ORACLE 中没有这样的 功能,我们可以通过采取以下的功能实现自动增加ID的功能.
  1.首先创建 sequence
  create sequence seqmax increment by 1
  2.使用方法
  select seqmax.nextval id from dual
  就得到了一个和ms sql的自动增加ID相同的功能id值

转自:
阅读(507) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~