Oracle資料庫物件_序列

來源:互聯網
上載者:User

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';

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.