EF中創建、使用Oracle數據庫的Sequence(序列)功能

** 背景 **

項目中訂單號原來的生成規則由日期加隨機數組成,后期需求決定將訂單號生成規則更改為生成日期加當天當前訂單數。

每天的訂單數都是從0開始的,每生成一個訂單,訂單數就應該加1.訂單數應該是持久的,寫在Session中或者Memcached緩存中,當網站重啟或者服務器重啟時都會面臨丟失的問題,所以只能存在數據庫中。幸好Oracle數據庫提供了Sequence(序列)功能,我們來看下Sequence(序列)的概述及其用法。

** 概述 **

Oracle提供了Sequence對象,由系統提供自增長的序列號,通常用于生成數據庫的自增長主鍵或序號的地方。
Sequence是數據庫系統按照一定規則自動增加的數字序列。這個序列一般作為代理主鍵(因為不會重復),沒有其他任何意義。1

** 基本用法 **

CREATE SEQUENCE emp_sequence -序列名
INCREMENT BY 1 — 每次遞增數值
START WITH 1 — 從1開始計數
MAXVALUE 999999 --最大值 || NOMAXVALUE — 不設置最大值
CYCLE - 循環,達到最大值從最小值開始||NOCYCLE — 一直累加,不循環
CACHE 10;-緩存數值

下面我們就來看EF的DbContext具體使用:
** 1. 判斷是否存在名為ODORDER的序列 **

int count = context.Database.SqlQuery<int>("SELECT count(*) FROM All_Sequences where Sequence_name='ODORDER'").FirstOrDefault()

如數據庫中存在該序列,則返回的數值應大于0。
** 2. 每天的訂單數都應該是從新開始的,所以簡單做法如果存在ODORDER該序列,我們先刪除. **

context.Database.ExecuteSqlCommand("DROP SEQUENCE ODORDER")

** 3. 創建名為ODORDER的序列 **

 context.Database.ExecuteSqlCommand("CREATE SEQUENCE ODORDER INCREMENT BY 1 START WITH 100000 MAXVALUE 900000 MINVALUE 100000 CYCLE CACHE 20 ");

** 4. 獲取最新訂單數 **

context.Database.SqlQuery<int>("select ODORDER.nextval from dual").FirstOrDefault()

原創文章,如有轉摘請注明來源!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容