Oracle中的序列SEQUENCE詳解
一、序列介紹
Oracle的序列是一種數(shù)據(jù)庫(kù)對(duì)象,主要作用是用來(lái)產(chǎn)生唯一值。序列被創(chuàng)建以后可以通過(guò)數(shù)據(jù)字典找到序列對(duì)象,因此序列可以被多個(gè)對(duì)象共享。
二、創(chuàng)建序列
序列使用CREATE SEQUENCE語(yǔ)法進(jìn)行創(chuàng)建:
CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];- NCREMENT BY:用于定義序列的步長(zhǎng),如果省略,則默認(rèn)為1,如果是負(fù)值,則代表序列的值是遞減的。
- START WITH:定義序列的初始值(即產(chǎn)生的第一個(gè)值),默認(rèn)為1。
- MAXVALUE:定義序列能生成的最大值。NOMAXVALUE是默認(rèn)選項(xiàng),代表沒(méi)有最大值,這時(shí),對(duì)于遞增序列,系統(tǒng)能夠產(chǎn)生的最大值是10的27次方;對(duì)于遞減序列,最大值是-1。
- MINVALUE:定義序列能生成的最小值。NOMINVALUE是默認(rèn)選項(xiàng),代表沒(méi)有最小值,這時(shí),對(duì)于遞減序列,系統(tǒng)能夠產(chǎn)生的最小值是負(fù)的10的26次方;對(duì)于遞減序列,最小值是1。
- CYCLE和NOCYCLE:表示當(dāng)序列生成器的值達(dá)到限制后是否循環(huán)。如果循環(huán),當(dāng)遞增序列達(dá)到最大值時(shí),循環(huán)到最小值;對(duì)于遞減序列,達(dá)到最小值時(shí),循環(huán)到最大值。如果不循環(huán),達(dá)到限制值后,繼續(xù)產(chǎn)生新值就會(huì)發(fā)生錯(cuò)誤。
- CACHE:定義存放序列的內(nèi)存塊的大小,默認(rèn)為20。NOCACHE表示不對(duì)序列進(jìn)行內(nèi)存緩沖。對(duì)序列進(jìn)行內(nèi)存緩沖,可以改善序列的性能。
例如:
CREATE SEQUENCE invoice_seq INCREMENT BY 1 START WITH 1 MAXVALUE 9999999 NOCYCLE NOCACHE;
三、查詢序列
一旦序列被創(chuàng)建,序列的創(chuàng)建代碼就被文本化在數(shù)據(jù)字典中,可以在user_objects數(shù)據(jù)字典中看到,如:
SELECT object_name,object_id,object_type FROM user_objects WHERE object_name = 'INVOICE_SEQ';
在user_sequences表中保存了序列明細(xì)信息:
SELECT sequence_name, min_value, max_value, increment_by, last_number FROM user_sequences;
四、使用序列
NEXTVAL和CURRVAL偽列
- NEXTVAL:返回下一個(gè)可用的序列值,它每次返回一個(gè)唯一的被引用值,實(shí)際對(duì)不同的用戶也是如此。當(dāng)使用sequence.NEXTVAL時(shí),一個(gè)新的序列數(shù)被產(chǎn)生并且當(dāng)前的序列數(shù)被放入CURRVAL。
- CURRVAL:獲得當(dāng)前的序列值。在首次使用NEXTVAL之前就使用CURRVAL的話,會(huì)報(bào)錯(cuò)。
使用如下 :
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語(yǔ)句的字段列表。
- INSERT語(yǔ)句中子查詢的SELECT列表。
- INSERT語(yǔ)句中的VALUES子句。
- UPDATE語(yǔ)句中的SET子句。
不能再以下的上下文中使用NEXTVAL和CURRVAL:
- 視圖的SELECT列表。
- 帶DISTINCT的SELECT語(yǔ)句。
- 帶GROUP BY、HAVING或ORDER BY子句的SELECT語(yǔ)句。
- 在SELECT、DELETE或UPDATE語(yǔ)句中的子句。
- 在CREATE TABLE或ALTER TABLE語(yǔ)句中的DEFAULT表達(dá)式。
另外要注意,ROLLBACK并不能使序列值回滾。
五、修改序列
如:
ALTER SEQUENCE invoice_seq INCREMENT BY 2 MAXVALUE 10 NOCACHE NOCYCLE;
修改序列時(shí),有如下幾個(gè)限制:
- 不能該表序列的起始值。
- 最小值不能大于當(dāng)前值。
- 最大值不能小于當(dāng)前值。
- 修改后的序列規(guī)則不會(huì)影響以前的序列值,只有未來(lái)的序列值會(huì)受到影響。
- 用戶必須具有ALTER SEQUENCE的權(quán)限。
六、刪除序列
DROP SEQUENCE invoice_seq;
七、創(chuàng)建自增序列
1、創(chuàng)建一個(gè)序列
create sequence sq_recid minvalue 1 maxvalue 999999 increment by 1 start with 1 noCYCLE;
2、創(chuàng)建一個(gè)觸發(fā)器
create or replace trigger trg_test before insert on test for each row begin select sq_recid.nextval into :new.ID from dual; end; alter trigger trg_test enable;
3、在C#中也可以手工插入序列到表中
string sql="insert into test(ID,otherCol)value (Sql_recid.nextval,***)
retuing ID into :ID"到此這篇關(guān)于Oracle序列SEQUENCE的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Navicat連接Oracle數(shù)據(jù)庫(kù)報(bào)錯(cuò):Oracle library is not&nb
這篇文章主要介紹了解決Navicat連接Oracle數(shù)據(jù)庫(kù)提示oracle library is not loaded的問(wèn)題,本文通過(guò)圖文結(jié)合的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-06-06
oracle ORA-01114、ORA-27067錯(cuò)誤解決方法
本文章總結(jié)了關(guān)于ORA-01114、ORA-27067錯(cuò)誤解決方法,有需要學(xué)習(xí)的朋友可參考一下下哦2012-10-10
Oracle 存儲(chǔ)過(guò)程總結(jié) 二、字符串處理相關(guān)函數(shù)
項(xiàng)目中有涉及存儲(chǔ)過(guò)程對(duì)字符串的處理,所以就將在網(wǎng)上查找到的資料匯總,做一個(gè)信息拼接式的總結(jié)。2009-07-07
ORACLE常見(jiàn)錯(cuò)誤代碼的分析與解決(一)
ORACLE常見(jiàn)錯(cuò)誤代碼的分析與解決(一)...2007-03-03
ORACLE實(shí)現(xiàn)自定義序列號(hào)生成的方法
這篇文章主要為大家詳細(xì)介紹了ORACLE實(shí)現(xiàn)自定義序列號(hào)生成的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
oracle中關(guān)于case?when?then的使用
這篇文章主要介紹了oracle中關(guān)于case?when?then的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
深入探討:oracle中row_number() over()分析函數(shù)用法
本篇文章是對(duì)oracle中row_number() over()分析函數(shù)的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Oracle中直方圖對(duì)執(zhí)行計(jì)劃的影響詳解
這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫(kù)中直方圖對(duì)執(zhí)行計(jì)劃的影響的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09

