a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 95|回复: 0

[考试辅导] Oracle装配置:AlterSequence

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
  你或者是该sequence的owner,或者有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 re-create .
( E1 w( z' L; `* |$ b; u+ o! g  Alter sequence 的例子
! ^8 v& M7 ~0 P  ALTER SEQUENCE emp_sequence 8 r& W; |* |5 S0 M
  INCREMENT BY 10
4 M' I; J+ W- v% D! @! D$ V  MAXVALUE 10000
* J' s0 P- R  `% y' r0 S  CYCLE — 到10000后从头开始
( C& _2 q+ Y  \) L( i  NOCACHE ; 3 E# h+ F7 ^( t1 Z1 l
  影响Sequence的初始化参数:
' J1 Q) q3 Q& v  SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。
3 i7 y9 c' I. p1 P  可以很简单的Drop Sequence
- T4 F+ ^4 f9 K& ?6 F, k  DROP SEQUENCE order_seq;
/ ]" ~3 s( y9 K( F8 s' |! U' H  下面详细介绍NEXTVAL和CURRVAL用法以及sequence用法的限制
: _9 M* c  Z) e* u- I* ^. n  使用 NEXTVAL 4 I( P6 k3 {: y/ ]2 {
  第一次访问一个序列,在引用 sequence.CURRVAL 之前必须先引用 sequence.NEXTVAL。第一次引用 NEXTVAL,返回序列的初始值。后面每次引用 NEXTVAL,用已定义的 step 增加序列值并返回序列新的增加以后的值。 ' e/ n( ^' x% ~
  在一个 SQL 语句中只能对给定的序列增加一次。即使在一个语句中多次指定 sequence.NEXTVAL,序列也只增加一次,所以每次 sequence.NEXTVAL 出现在同一 SQL 语句中返回相同的值。除了在同一语句中多次出现这种情况以外,每个sequence.NEXTVAL表达式都会增加序列,无论后来是否提交或回滚当前事务。如果在最终回滚的事务中指定sequence.NEXTVAL,某些序列数可能被跳过。 + P9 O' n9 h6 q# f4 L" e
  如在PL/SQL中: - a4 y0 k9 E) q. F
  查询nextval的值等于151
' C$ D9 E; h. x* D- I/ r  D  select cheng.nextval from test1234
0 t& y" y$ `* c, O$ m  执行insert语句
- R4 D3 ]. A' a; y  insert into test1234 values(cheng.nextval,’bb’,22);
' Q9 `  s3 w& l  commit或rollback后再查询nextval的值会增加到153 5 |  b* n% R9 N! K/ h/ y# G
  使用 CURRVAL % \+ f+ @# M. |/ B
  任何对CURRVAL的引用返回指定序列的当前值,该值是最后一次对NEXTVAL的引用所返回的值。用NEXTVAL生成一个新值以后,可以继续使用 CURRVAL访问这个值,不管另一个用户是否增加这个序列。如果sequence.CURRVAL和 sequence.NEXTVAL都出现在一个 SQL语句中,则序列只增加一次。在这种情况下,每个sequence.CURRVAL和 sequence.NEXTVAL表达式都返回相同的值,不管在语句中sequence.CURRVAL和sequence.NEXTVAL的顺序。 & D) x, C+ u* H/ w# A/ |8 x
  如在PL/SQL中: ! S- Z5 T! N& z& h. m) @
  select cheng.nextval,cheng.currval from test1234
7 @) `0 B$ T3 J8 [  nextval和currval的值都是160 / _1 l7 X# Y" Q2 E
  序列的并发访问 6 o0 i  e* o  d2 o; w& t, c' c
  序列总是在数据库中生成唯一值,即使当多个用户并发地引用同一序列时也没有可察觉的等待或锁定。当多个用户使用 NEXTVAL 来增长序列时,每个用户生成一个其他用户不可见的唯一值。当多个用户并发地增加同一序列时,每个用户看到的值是有差异的。例如,一个用户可能从一个序列生成一组值,如 11、14、16 和 18,而另一个用户并发地从同一序列生成值 12、13、15 和 17。   x  S) U  `/ F6 N" J
  sequence使用的限制
1 N$ y  i# E& N4 f% \1 C, O  NEXTVAL 和 CURRVAL 只在 SQL 语句中有效,并不在 SPL 语句中直接有效。(但是使用NEXTVAL 和CURRVAL的SQL语句可用于SPL例程)以下限制应用于 SQL 语句中的这些运算符:
& c4 k4 L7 r; a% Q: N  [1]在 CREATE TABLE 或 ALTER TABLE 语句中,在下列上下文中不能指定 NEXTVAL 或 CURRVAL: 9 Z: n' C1 n2 g. B$ z
  在 DEFAULT 子句中。
" G) g" D0 y# ?# D* L$ g4 X  在检查约束中。   I- f4 I- d% ^
  [2]在 SELECT 语句中,下列上下文中不能指定 NEXTVAL 或 CURRVAL: 1 p6 Q# n2 W9 P. ~
  使用 DISTINCT 关键字时在投影列表中。
( g: J) T) A/ F9 e2 E. R  }  在 WHERE、GROUP BY 或 ORDER BY 子句中。
! }$ Z. c) ~% w$ P  在子查询中。 * C$ p- n& e/ B% z
  在 UNION 运算符结合 SELECT 语句时。
* L1 |5 \" a) _9 x( _( n8 A4 \' f  [3]在下列这些上下文中也不能指定 NEXTVAL 或 CURRVAL: & H- w6 v/ O% I: Z! F6 A
  在分段存储表达式中
- T0 Z# S8 k- `5 G% G$ ~) k  在对另一个数据库中的远程序列对象的引用中。
  T0 E" n1 \/ _  Oracle中实现类似自动增加 ID 的功能   \6 F3 G) x& |; B8 w0 Z% p
  我们经常在设计数据库的时候用一个系统自动分配的ID来作为我们的主键,但是在ORACLE 中没有这样的 功能,我们可以通过采取以下的功能实现自动增加ID的功能.
' l- L/ b" ~) `0 Y( A5 T4 o. ?  1.首先创建 sequence
, }6 [# ^% k4 \2 ?0 T# _  n, N  create sequence seqmax increment by 1
, C4 _& k5 P3 D" p  x9 Q  2.使用方法 ( C; K! j5 l6 [* j: v7 M
  select seqmax.nextval id from dual : f0 B% T' y( Z- {# i3 ^
  就得到了一个和ms sql的自动增加ID相同的功能id值
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-2 10:45 , Processed in 0.825574 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表