序列介紹
序列(SEQUENCE)是序列號生成器,可以為表中的行自動生成序列號,產(chǎn)生一組等間隔的數(shù)值(類型為數(shù)字)。其主要的用途是生成表的主鍵值就轧,可以在插入語句中引用,也可以通過查詢檢查當(dāng)前值田度,或使序列增至下一個值妒御。
序列是一個計數(shù)器,它并不會與特定的表關(guān)聯(lián)镇饺。通過創(chuàng)建Oracle序列和觸發(fā)器實現(xiàn)表的主鍵自增乎莉。 序列的用途一般用來填充主鍵和計數(shù)。
序列的創(chuàng)建語法如下:
CREATE SEQUENCE 序列名
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}]
[{CYCLE|NOCYCLE}]
[{CACHE n|NOCACHE}];
INCREMENT BY 用于定義序列的步長,如果省略惋啃,則默認(rèn)為1哼鬓,如果出現(xiàn)負值,則代表序列的值是按照此步長遞減的边灭。
START WITH 定義序列的初始值(即產(chǎn)生的第一個值)异希,默認(rèn)為1。
MAXVALUE 定義序列生成器能產(chǎn)生的最大值绒瘦。選項NOMAXVALUE是默認(rèn)選項称簿,代表沒有最大值定義,這時對于遞增序列惰帽,系統(tǒng)能夠產(chǎn)生的最大值是10的27次方;對于遞減序列憨降,最大值是-1。
MINVALUE定義序列生成器能產(chǎn)生的最小值该酗。選項NOMAXVALUE是默認(rèn)選項券册,代表沒有最小值定義,這時對于遞減序列垂涯,系統(tǒng)能夠產(chǎn)生的最小值是?10的26次方;對于遞增序列,最小值是1航邢。
CYCLE和NOCYCLE 表示當(dāng)序列生成器的值達到限制值后是否循環(huán)耕赘。CYCLE代表循環(huán),NOCYCLE代表不循環(huán)膳殷。如果循環(huán)操骡,則當(dāng)遞增序列達到最大值時,循環(huán)到最小值;對于遞減序列達到最小值時赚窃,循環(huán)到最大值册招。如果不循環(huán),達到限制值后勒极,繼續(xù)產(chǎn)生新值就會發(fā)生錯誤是掰。
CACHE(緩沖)定義存放序列的內(nèi)存塊的大小,默認(rèn)為20辱匿。NOCACHE表示不對序列進行內(nèi)存緩沖键痛。對序列進行內(nèi)存緩沖,可以改善序列的性能匾七。CACHE(緩沖)定義存放序列的內(nèi)存塊的大小絮短,默認(rèn)為20。NOCACHE表示不對序列進行內(nèi)存緩沖昨忆。對序列進行內(nèi)存緩沖丁频,可以改善序列的性能。 緩存選項會造成數(shù)據(jù)丟失,當(dāng)實例異常關(guān)閉時席里。
創(chuàng)建和刪除序列
-- 創(chuàng)建序列
CREATE SEQUENCE SEQ_BATCH_CODE INCREMENT BY 1 START WITH 1 MAXVALUE 9999 CYCLE NOCACHE;
CREATE SEQUENCE SEQ_PAPER_CODE INCREMENT BY 1 START WITH 1 MAXVALUE 999 CYCLE NOCACHE;
CREATE SEQUENCE SEQ_ORG_CODE INCREMENT BY 1 START WITH 1 MAXVALUE 999 CYCLE NOCACHE;
-- 刪除序列:
DROP SEQUENCE SEQ_BATCH_CODE;
序列的使用
-- 步驟1:產(chǎn)生序列的第一個值.
SELECT SEQ_BATCH_CODE.NEXTVAL FROM DUAL;
-- 步驟2:產(chǎn)生序列的下一個值.
SELECT SEQ_BATCH_CODE.NEXTVAL FROM DUAL;
-- 產(chǎn)生序列的當(dāng)前值.
SELECT SEQ_BATCH_CODE.CURRVAL FROM DUAL;
-- 查看序列
-- 同過數(shù)據(jù)字典USER_OBJECTS可以查看用戶擁有的序列.
-- 通過數(shù)據(jù)字典USER_SEQUENCES可以查看序列的設(shè)置.
SELECT SEQUENCE_NAME,MIN_VALUE,MAX_VALUE,INCREMENT_BY,LAST_NUMBER FROM USER_SEQUENCES;
示例
public string GetSequenceByBatchCode()
{
const string sqlQuery = @"SELECT SEQ_BATCH_CODE.NEXTVAL SequenceId FROM DUAL";
var results = "";
var getSequenceOutput = Context.Database
.SqlQuery<GetSequenceOutput>(sqlQuery).FirstOrDefault();
if (getSequenceOutput != null)
results = getSequenceOutput.SequenceId.ToString(CultureInfo.InvariantCulture);
return results;
}
// 生成批次編碼
var batchCode = _scanRepository.GetSequenceByBatchCode();
batchCode = batchCode.PadLeft(4, '0');