序列介紹
序列(SEQUENCE)是序列號生成器,可以為表中的行自動生成序列號,產生一組等間隔的數值(類型為數字)。其主要的用途是生成表的主鍵值,可以在插入語句中引用,也可以通過查詢檢查當前值,或使序列增至下一個值。
序列是一個計數器,它并不會與特定的表關聯。通過創建Oracle序列和觸發器實現表的主鍵自增。 序列的用途一般用來填充主鍵和計數。
序列的創建語法如下:
CREATE SEQUENCE 序列名
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}]
[{CYCLE|NOCYCLE}]
[{CACHE n|NOCACHE}];
INCREMENT BY 用于定義序列的步長,如果省略,則默認為1,如果出現負值,則代表序列的值是按照此步長遞減的。
START WITH 定義序列的初始值(即產生的第一個值),默認為1。
MAXVALUE 定義序列生成器能產生的最大值。選項NOMAXVALUE是默認選項,代表沒有最大值定義,這時對于遞增序列,系統能夠產生的最大值是10的27次方;對于遞減序列,最大值是-1。
MINVALUE定義序列生成器能產生的最小值。選項NOMAXVALUE是默認選項,代表沒有最小值定義,這時對于遞減序列,系統能夠產生的最小值是?10的26次方;對于遞增序列,最小值是1。
CYCLE和NOCYCLE 表示當序列生成器的值達到限制值后是否循環。CYCLE代表循環,NOCYCLE代表不循環。如果循環,則當遞增序列達到最大值時,循環到最小值;對于遞減序列達到最小值時,循環到最大值。如果不循環,達到限制值后,繼續產生新值就會發生錯誤。
CACHE(緩沖)定義存放序列的內存塊的大小,默認為20。NOCACHE表示不對序列進行內存緩沖。對序列進行內存緩沖,可以改善序列的性能。CACHE(緩沖)定義存放序列的內存塊的大小,默認為20。NOCACHE表示不對序列進行內存緩沖。對序列進行內存緩沖,可以改善序列的性能。 緩存選項會造成數據丟失,當實例異常關閉時。
創建和刪除序列
-- 創建序列
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:產生序列的第一個值.
SELECT SEQ_BATCH_CODE.NEXTVAL FROM DUAL;
-- 步驟2:產生序列的下一個值.
SELECT SEQ_BATCH_CODE.NEXTVAL FROM DUAL;
-- 產生序列的當前值.
SELECT SEQ_BATCH_CODE.CURRVAL FROM DUAL;
-- 查看序列
-- 同過數據字典USER_OBJECTS可以查看用戶擁有的序列.
-- 通過數據字典USER_SEQUENCES可以查看序列的設置.
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');