程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle數據庫對象_序列,oracle數據庫對象

Oracle數據庫對象_序列,oracle數據庫對象

編輯:Oracle教程

Oracle數據庫對象_序列,oracle數據庫對象


Oracle數據庫對象_序列

序列是一種數據庫對象,用來自動產生一組唯一的序號。

序列是一種共享式的對象,多個用戶可以共同使用序列中的序號。
一般將序列應用於表的主鍵列,這樣當向表中插入數據時,主鍵列就使用了序列中的序號,從而保證主鍵列的值不會重復。
用這種方式可以代替在應用程序中產生主鍵值的方法,可以獲得更可靠的主鍵值。
注:在序列指定最大值和可循環屬性後,序列中的序號是可以循環使用的。

 

序列的創建、修改和刪除

默認情況下,用戶可以在自己的模式中創建序列。如果希望在其他用戶的模式中創建序列,
則必須具有CREATE ANY SEQUENCE這個系統權限。

創建序列的命令為CREATE SEQUENCE,它的完整語法格式為:

CREATE SEQUENCE 序列名

INCREMENT BY n

START WITH n

MINVALUE n | NOMINVALUE

MAXVALUE n | NOMAXVALUE

CYCLE | NOCYCLE

CACHE | NOCACHE

ORDER | NOORDER

在這個命令的語法格式中,除序列名以外,其余各選項都是可選的。

各選項中的n是一個整數。

其中START WITH選項指定序列中的序號從哪個數字開始,默認情況下從它的最小值開始。
INCREMENT BY選項指定了序列中序號遞增的幅度,也就是後一個序號比前一個序號大多少。
序號可以遞增,也可以遞減,所以INCREMENT BY選項中的數字n可以是正整數,也可以是負整數。
MAXVALUE用來指定序列中序號的最大值。

如果沒有最大值,可用NOMAXVALUE選項代替這個選項。
同樣, MINVALUE用來指定序列中序號的最小值,序列中的最小值必須小於或等於它的開始值。
如果為序列指定了最大值,那麼當序列中的序號被悄耗完時,用戶將無法從這個序列中取得序號。
選項CYCLE使得序列中的序號可以循環使用。

當用戶正在使用序列中的最大值時,下一個可以使用的序號就是它的最小值。
用戶每使用序列一次,都要對序列進行一次查詢。

如果把序列中的序號放在內存中進行緩沖,那麼用戶獲得序號的速度將大大加快。
選項CACHE的作用就是將序列中接下來的n個序號在內存中進行緩沖。
如果不希望進行緩沖,可以用NOCACHE選項代替它。

序列在創建之後,在使用的過程中,可以對其進行修改。

比如修改它的最大值、最小值、增幅等,但是不能修改開始值。
需要注意的是,如果已經有部分序號被使用,那麼對序列的修改只影響以後的序號,對以前已經使用的序號不起作用。

修改序列的命令是ALTER SEQUENCE。

用戶可以修改自己的序列,如果希望修改其他用戶的序列,則需要具有ALTER ANY SEQUENCE這個系統權限。
ALTER SEQUENCE命令的用法與CREATE SEQUENCE命令的用法基本相同,只要將關鍵字CREATE替換為ALTER即可。

刪除序列的命令是DROP SEQUENCE。

用戶可以刪除自己創建的序列,如果要刪除其他用戶的序列,則要具有DROP ANY SEQUENCE 系統權限。
序列被刪除後,它的相關信息就被從數據字典中刪除。


序列的使用

對用戶而言,序列中的可用資源是其中包含的序號。

用戶可以通過SELECT命令獲得可用的序號,也可以將序號應用於DML語句和表達式中。
如果要使用其他用戶的序列,則 必須具有對該序列的SELECT權限。

序列提供了兩個偽列,即NEXTVAL 和CURRVAL,用來訪問序列中的序號。
其中NEXTVAL代表下一個可用的序號, CURRYAL代表當前的序號。
序列可以認為是包含了一系列序號的一個指針。
序列剛被創建時,這個指針位於第一個序號之前,以後每獲得一個序號,指針就向後移動一個位置,這時就可以用CURRVAL訪問序列中的當前序號,用NEXTVAL訪問下一個序號。

在第一次使用序列中的序號時,必須首先訪問NEXTVAL偽列,使指針指向第一個序號。

 

通過SELECT語句可以從序列中獲得一個可用的序號。

例如:

SELECT seq1.nextval FROM dual;

在SELECT語句中使用表dual是必要的,因為SELECT語句將根據表中數據的行數返回若干個序號,並且每訪問一次NEXTVAL 偽列,指針就向後移動一個序號。

CURRVAL偽列代表序列中的當前序號,訪問這個偽列時指針並不向後移動。

CURRVAL偽列的引用方法與NEXTVAL偽列相同,引用格式為:序列名.currval 。
序列還可應用於SELECT語句的其他形式。

例如:

SELECT seq1.nextval, empno FROM scott.emp;

在更多情況下序列的作用為表中的主鍵列或其他列提供一個唯一的序號。

例如:

INSERT INTO scott.dept(deptno, dname) VALUES(seq1.nextval, 'lili');

序列是一種共享式的數據庫對象,用戶可以直接使用自己創建的序列,其他用戶也可以訪問當前用戶的序列,只要具有對這個序列的SELECT權限即可。
如果一個序號被某個用戶獲得,那麼其他用戶就不能再獲得這個序號了。
也就是說,序列是可以共享的,但序列中的序號卻是不能共享的。
對序列中序號的訪問操作是作為一個單獨的事務實現的,這個事務的執行與其他事務的執行成功與否無關。
如果包含一條DML語句的事務被回滾了,那麼對序列的操作是無法回滾的。

注:如果是在可循環的序列中,序號可被其他用戶循環使用。

在訪問序列中的序號時,可能會發生序號不連續的情況,不連續的原因可能是事務發生了回滾,或者多個用戶共同訪問同一個序列。
一個用戶要訪問其他用戶的序列時,不僅要具有對這個序列的SELECT權限,在訪問時還要在序列的名稱前以用戶名進行限定。
例如:

SELECT sys.seq1.nextval FROM dual;

如果要將一個序列的SELECT權限授予其他用戶,相應的GRANT命令格式為:

GRANT SELECT ON 序列名 TO 用戶名;

序列信息的查詢

序列作為一種數據庫對象,它的相關信息也存儲在數據字典中。

與序列相關的數據字典有三個: USER_SEQUENCES 、ALL SEQUENCES和DBA_SEQUENCES 。
其中數據字典USER SEQUENCES 的各列及意義如下所示:

SEQUENCE_NAME 序列名

MIN_VALUE 最小值

MAX_VALUE 最大值

INCREMENT_BY 增幅

CYCLE_FLAG 是否循環

ORDER_FLAG 是否按順序

CACHE_SIZE 緩存大小

LAST_NUMBER 下一個可用值

注:ORDER_FLAG的解釋:

Note that the ORDER option is only necessary to guarantee ordered generation if you are using Oracle with the Parallel Server option in parallel mode.
If you are using exclusive mode, sequence numbers are always generated in order.
LAST_NUMBER的解釋:

使用的或緩存的最後一個序列號,一般大於緩沖區中的最後一個值。

LAST_NUMBER列在普通的數據庫操作過程中不被更新,它在數據庫的重新啟動/恢復操作中使用。

CACHE_SIZE的解釋:

在內存中緩存的序號用用完之後,再向內存中添加序號。

例如:

SELECT order_flag, last_number,max_value,cache_size from user_sequences where sequence_name='SEQ1';

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved