詳解ORACLE SEQUENCE用法
在oracle中sequence就是序號(hào),每次取的時(shí)候它會(huì)自動(dòng)增加。sequence與表沒(méi)有關(guān)系。
1、Create Sequence
首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE權(quán)限。
創(chuàng)建語(yǔ)句如下:
CREATE SEQUENCE seqTest INCREMENT BY 1 -- 每次加幾個(gè) START WITH 1 -- 從1開(kāi)始計(jì)數(shù) NOMAXvalue -- 不設(shè)置最大值 NOCYCLE -- 一直累加,不循環(huán) CACHE 10; --設(shè)置緩存cache個(gè)序列,如果系統(tǒng)down掉了或者其它情況將會(huì)導(dǎo)致序列不連續(xù),也可以設(shè)置為---------NOCACHE
2、得到Sequence值
定義好sequence后,你就可以用currVal,nextVal取得值。
CurrVal:返回 sequence的當(dāng)前值
NextVal:增加sequence的值,然后返回 增加后sequence值
得到值語(yǔ)句如下:
SELECT Sequence名稱.CurrVal FROM DUAL;
如得到上邊創(chuàng)建Sequence值的語(yǔ)句為:
select seqtest.currval from dual
在Sql語(yǔ)句中可以使用sequence的地方:
- 不包含子查詢、snapshot、VIEW的 SELECT 語(yǔ)句
- INSERT語(yǔ)句的子查詢中
- INSERT語(yǔ)句的values中
- UPDATE 的 SET中
如在插入語(yǔ)句中
insert into 表名(id,name)values(seqtest.Nextval,'sequence 插入測(cè)試');
注:
- 第一次NEXTVAL返回的是初始值;隨后的NEXTVAL會(huì)自動(dòng)增加你定義的INCREMENT BY值,然后返回增加后的值。
CURRVAL 總是返回當(dāng)前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否則會(huì)出錯(cuò)。
一次NEXTVAL會(huì)增加一次 SEQUENCE的值,所以如果你在同一個(gè)語(yǔ)句里面使用多個(gè)NEXTVAL,其值就是不一樣的。
- 如果指定CACHE值,ORACLE就可以預(yù)先在內(nèi)存里面放置一些sequence,這樣存取的快些。cache里面的取完后,oracle自動(dòng)再取一組 到cache。 使用cache或許會(huì)跳號(hào), 比如數(shù)據(jù)庫(kù)突然不正常down掉(shutdown abort),cache中的sequence就會(huì)丟失. 所以可以在create sequence的時(shí)候用nocache防止這種情況。
3、Alter Sequence
擁有ALTER ANY SEQUENCE 權(quán)限才能改動(dòng)sequence. 可以alter除start至以外的所有sequence參數(shù).如果想要改變start值,必須 drop sequence 再 re-create。
例:
alter sequence SEQTEST maxvalue 9999999;
另: SEQUENCE_CACHE_ENTRIES參數(shù),設(shè)置能同時(shí)被cache的sequence數(shù)目。
4、Drop Sequence
DROP SEQUENCE seqTest;
5、一個(gè)例子
create sequence SEQ_ID minvalue 1 maxvalue 99999999 start with 1 increment by 1 nocache order;
建解發(fā)器代碼為:
create or replace trigger tri_test_id before insert on S_Depart --S_Depart 是表名 for each row declare nextid number; begin IF :new.DepartId IS NULLor :new.DepartId=0 THEN --DepartId是列名 select SEQ_ID.nextval --SEQ_ID正是剛才創(chuàng)建的 into nextid from sys.dual; :new.DepartId:=nextid; end if; end tri_test_id;
OK,上面的代碼就可以實(shí)現(xiàn)自動(dòng)遞增的功能了。
注::new 代表 數(shù)據(jù)改變后的新值,相對(duì)應(yīng)的有 :old 原值
:= 代表 賦值
:nextid表示引用sqlplus中定義的變量
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 通過(guò)實(shí)例了解Oracle序列Sequence使用方法
- Oracle中使用觸發(fā)器(trigger)和序列(sequence)模擬實(shí)現(xiàn)自增列實(shí)例
- 分享ORACLE SEQUENCE跳號(hào)總結(jié)
- oracle sequence語(yǔ)句重置方介紹
- oracle重置序列從0開(kāi)始遞增1
- oracle中創(chuàng)建序列及序列補(bǔ)零實(shí)例詳解
- ORACLE實(shí)現(xiàn)自定義序列號(hào)生成的方法
- oracle 重置序列從指定數(shù)字開(kāi)始的方法詳解
- Oracle中的序列SEQUENCE詳解
相關(guān)文章
PLSQL Developer連接oracle數(shù)據(jù)庫(kù)配置教程
這篇文章主要介紹了PLSQL Developer連接oracle數(shù)據(jù)庫(kù)配置步驟,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09Oracle實(shí)現(xiàn)分頁(yè)三種不同的方式
這篇文章主要給大家介紹了關(guān)于Oracle實(shí)現(xiàn)分頁(yè)三種不同的方式,oracle分頁(yè)與MySQL不同,MySQL是用關(guān)鍵字limit進(jìn)行分頁(yè),oracle是根據(jù)行號(hào),需要的朋友可以參考下2023-08-08Oracle數(shù)據(jù)庫(kù)中的基本建庫(kù)操作詳解
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)中的基本建庫(kù)操作詳解,其中包含了很多OMF下的命令操作實(shí)例,需要的朋友可以參考下2015-12-12expdp 中ORA-39002、ORA-39070錯(cuò)誤詳解及解決辦法
這篇文章主要介紹了expdp 中ORA-39002、ORA-39070錯(cuò)誤詳解及解決辦法的相關(guān)資料,需要的朋友可以參考下2017-02-02淺談PL/SQL批處理語(yǔ)句:BULK COLLECT與FORALL對(duì)優(yōu)化做出的貢獻(xiàn)
本篇文章小編為大家介紹一下,淺談PL/SQL批處理語(yǔ)句:BULK COLLECT與FORALL對(duì)優(yōu)化做出的貢獻(xiàn)。有需要的朋友可以參考一下2013-04-04