這篇文章為大家帶來了關於Oracle的相關知識,詳細講解了Oracle中的序列SEQUENCE,文中透過範例程式碼介紹的非常詳細。對大家的學習或工作有一定的參考借鏡價值,希望對大家有幫助。
推薦教學:《Oracle影片教學》
一、序列介紹
Oracle的序列是一種資料庫對象,主要作用是用來產生唯一值。序列被創建以後可以透過資料字典找到序列對象,因此序列可以被多個對象共用。
二、建立序列
序列使用CREATE SEQUENCE語法進行建立:
1 2 3 4 5 6 7 | CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
|
登入後複製
- NCREMENT BY:用於定義序列的步長,如果省略,則預設為1,如果是負值,則代表序列的值是遞減的。
- START WITH:定義序列的初始值(即產生的第一個值),預設為1。
- MAXVALUE:定義序列能產生的最大值。 NOMAXVALUE是預設選項,代表沒有最大值,這時,對於遞增序列,系統能夠產生的最大值是10的27次方;對於遞減序列,最大值是-1。
- MINVALUE:定義序列能產生的最小值。 NOMINVALUE是預設選項,代表沒有最小值,這時,對於遞減序列,系統能夠產生的最小值是負的10的26次方;對於遞減序列,最小值是1。
- CYCLE和NOCYCLE:表示當序列產生器的值達到限制後是否會循環。如果循環,當遞增序列達到最大值時,循環到最小值;對於遞減序列,達到最小值時,循環到最大值。如果不循環,達到限制值後,繼續產生新值就會發生錯誤。
- CACHE:定義存放序列的記憶體區塊的大小,預設為20。 NOCACHE表示不對序列進行記憶體緩衝。對序列進行記憶體緩衝,可以改善序列的效能。
例如:
1 2 3 4 5 | CREATE SEQUENCE invoice_seq
INCREMENT BY 1
START WITH 1
MAXVALUE 9999999
NOCYCLE NOCACHE;
|
登入後複製
三、查詢序列
一旦序列被創建,序列的創建程式碼就被文字化在資料字典中,可以在user_objects數據字典中看到,如:
1 | SELECT object_name,object_id,object_type FROM user_objects WHERE object_name = 'INVOICE_SEQ';
|
登入後複製
在user_sequences表中保存了序列明細資訊:
1 | SELECT sequence_name, min_value, max_value, increment_by, last_number FROM user_sequences;
|
登入後複製
四、使用序列
NEXTVAL和CURRVAL偽列
- NEXTVAL:傳回下一個可用的序列值,它每次傳回一個唯一的被引用值,實際上對不同的使用者也是如此。當使用sequence.NEXTVAL時,一個新的序列數被產生並且當前的序列數被放入CURRVAL。
- CURRVAL:取得目前的序列值。在首次使用NEXTVAL之前就使用CURRVAL的話,會報錯。
使用如下:
1 2 3 4 | 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語句的欄位清單。 INSERT語句中子查詢的SELECT清單。 INSERT語句中的VALUES子句。 UPDATE語句中的SET子句。
不能再以下的上下文中使用NEXTVAL和CURRVAL:
視圖的SELECT清單。 帶有DISTINCT的SELECT語句。 帶有GROUP BY、HAVING或ORDER BY子句的SELECT語句。 在SELECT、DELETE或UPDATE語句中的子句。 在CREATE TABLE或ALTER TABLE語句中的DEFAULT表達式。
另外要注意,ROLLBACK並不能使序列值回滾。
五、修改序列
如:
1 | ALTER SEQUENCE invoice_seq INCREMENT BY 2 MAXVALUE 10 NOCACHE NOCYCLE;
|
登入後複製
修改序列時,有以下幾個限制:
不能該表序列的起始值。 最小值不能大於目前值。 最大值不能小於目前值。 修改後的序列規則不會影響先前的序列值,只有未來的序列值會受到影響。 使用者必須具有ALTER SEQUENCE的權限。
六、刪除序列
1 | DROP SEQUENCE invoice_seq;
|
登入後複製
七、建立自增序列
#1、建立一個序列
1 2 | create sequence sq_recid
minvalue 1 maxvalue 999999 increment by 1 start with 1 noCYCLE;
|
登入後複製
2、建立一個觸發器
1 2 3 4 5 6 7 | 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#中也可以手動插入序列到表中
1 2 | string sql="insert into test(ID,otherCol)value (Sql_recid.nextval,***)
retuing ID into :ID"
|
登入後複製
#推薦教學:《
Oracle影片教學》
以上是Oracle的序列SEQUENCE解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!