﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-贫以智为贵,富以仁为贵.-文章分类-关系数据库</title><link>http://www.blogjava.net/LeungXin/category/26555.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 15 Oct 2007 07:08:39 GMT</lastBuildDate><pubDate>Mon, 15 Oct 2007 07:08:39 GMT</pubDate><ttl>60</ttl><item><title>ORACLE SEQUENCE的简单介绍</title><link>http://www.blogjava.net/LeungXin/articles/152896.html</link><dc:creator>梁昕</dc:creator><author>梁昕</author><pubDate>Mon, 15 Oct 2007 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/LeungXin/articles/152896.html</guid><description><![CDATA[在oracle中sequence就是所谓的序列号，每次取的时候它会自动增加，一般用在需要按序列号排序的地方。&nbsp; <br />
1、Create&nbsp;Sequence&nbsp; <br />
你首先要有CREATE&nbsp;SEQUENCE或者CREATE&nbsp;ANY&nbsp;SEQUENCE权限，&nbsp; <br />
CREATE&nbsp;SEQUENCE&nbsp;emp_sequence&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;INCREMENT&nbsp;BY&nbsp;1&nbsp;&nbsp;--&nbsp;每次加几个&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;START&nbsp;WITH&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;从1开始计数&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;NOMAXVALUE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;不设置最大值&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;NOCYCLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;一直累加，不循环&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;CACHE&nbsp;10;&nbsp; <br />
<br />
一旦定义了emp_sequence，你就可以用CURRVAL，NEXTVAL&nbsp; <br />
&nbsp;CURRVAL=返回&nbsp;sequence的当前值&nbsp; <br />
&nbsp;NEXTVAL=增加sequence的值，然后返回&nbsp;sequence&nbsp;值&nbsp; <br />
比如：&nbsp; <br />
&nbsp;&nbsp;emp_sequence.CURRVAL&nbsp; <br />
&nbsp;&nbsp;emp_sequence.NEXTVAL&nbsp; <br />
<br />
可以使用sequence的地方：&nbsp; <br />
-&nbsp;不包含子查询、snapshot、VIEW的&nbsp;SELECT&nbsp;语句&nbsp; <br />
-&nbsp;INSERT语句的子查询中&nbsp; <br />
-&nbsp;NSERT语句的VALUES中&nbsp; <br />
-&nbsp;UPDATE&nbsp;的&nbsp;SET中&nbsp;&nbsp;&nbsp; <br />
<br />
可以看如下例子：&nbsp; <br />
INSERT&nbsp;INTO&nbsp;emp&nbsp;VALUES&nbsp;&nbsp; <br />
(empseq.nextval,&nbsp;'LEWIS',&nbsp;'CLERK',7902,&nbsp;SYSDATE,&nbsp;1200,&nbsp;NULL,&nbsp;20);&nbsp; <br />
<br />
SELECT&nbsp;empseq.currval&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;DUAL;&nbsp; <br />
<br />
但是要注意的是：&nbsp; <br />
-&nbsp;第一次NEXTVAL返回的是初始值；随后的NEXTVAL会自动增加你定义的INCREMENT&nbsp;BY值，然后返回增加后的值。CURRVAL&nbsp;总是返回当前SEQUENCE的值，但是在第一次NEXTVAL初始化之后才能使用CURRVAL，否则会出错。一次NEXTVAL会增加一次SEQUENCE的值，所以如果你在同一个语句里面使用多个NEXTVAL，其值就是不一样的。明白？&nbsp; <br />
<br />
-&nbsp;如果指定CACHE值，ORACLE就可以预先在内存里面放置一些sequence，这样存取的快些。cache里面的取完后，oracle自动再取一组到cache。&nbsp;使用cache或许会跳号，&nbsp;比如数据库突然不正常down掉（shutdown&nbsp;abort),cache中的sequence就会丢失.&nbsp;所以可以在create&nbsp;sequence的时候用nocache防止这种情况。&nbsp; <br />
<br />
2、Alter&nbsp;Sequence&nbsp; <br />
你或者是该sequence的owner，或者有ALTER&nbsp;ANY&nbsp;SEQUENCE&nbsp;权限才能改动sequence.&nbsp;可以alter除start至以外的所有sequence参数.如果想要改变start值，必须&nbsp;drop&nbsp;&nbsp;sequence&nbsp;再&nbsp;re-create&nbsp;.&nbsp; <br />
Alter&nbsp;sequence&nbsp;的例子&nbsp; <br />
ALTER&nbsp;SEQUENCE&nbsp;emp_sequence&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;INCREMENT&nbsp;BY&nbsp;10&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;MAXVALUE&nbsp;10000&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;CYCLE&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;到10000后从头开始&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;NOCACHE&nbsp;;&nbsp; <br />
<br />
<br />
影响Sequence的初始化参数：&nbsp; <br />
SEQUENCE_CACHE_ENTRIES&nbsp;=设置能同时被cache的sequence数目。&nbsp;&nbsp; <br />
<br />
可以很简单的Drop&nbsp;Sequence&nbsp; <br />
DROP&nbsp;SEQUENCE&nbsp;order_seq;&nbsp; <br />
<br />
<br />
好吧，就到这里
<img src ="http://www.blogjava.net/LeungXin/aggbug/152896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LeungXin/" target="_blank">梁昕</a> 2007-10-15 10:29 <a href="http://www.blogjava.net/LeungXin/articles/152896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>