1. 程式人生 > >oracle序列號、

oracle序列號、

建立即將使用的表

create table supplier
(s_codde number(6),
sname varchar2(25),
contact varchar2(15),
phone varchar2(15),
fax varchar2(15)); 

序列號的特點

  1. 可以由多個使用者共享的資料庫物件.
  2. 序列號生產機器,專為表中的資料自動產生序列號.
  3. 由oracle內部例程產生和維護.
  4. 獨立於使用它的表.
  5. 通常是用來產生主鍵
  6. 可以取代生產序列號的應用程式.
  7. 如果讓它常駐記憶體,可以提高訪問序列號的效率.

建立序列號的語法


CREATE SEQUENCE 序列號名字  [START WITH n] [INCREMENT BY n]  [{MAXVALUE n | NOMAXVALUE}]  [{MINVALUE n | NOMINVALUE}] [{CACHE n | NOCACHE}] [{CYCLE n | NOCYCLE | CYCLE 20}];
其中:
  1. 序列號的名字::序列號產生器的名字, 也即是該序列的名字
  2. START WITH n:定義了所產生的第一個序列號碼,這裡 n 為整數。如果該字句省略,那麼序列就從1開始
  3. INCREMENT BY n : 定義了序列號增加的步長(序列號之間的間隔,當前序列號與下一個序列號之間的差),如果該字句省略,序列號增加步長為1.
  4. MAXVALUE n :定義了該序列號可產生的序列號的最大值
  5. NOMAXVALUE : 說明升序的序列號的最大值為 10的27次方。而降序的序列號的最大值為 -1 (這也是預設值)。
  6. MINVALUE :定義了可產生序列號的最小值。
  7. NOMINVALUE : 說明升序序列號的最小值為1,而降序的序列號的最小值為負10的26次方(這也是預設值)。
  8. CACHE n :說明將有n個序列號碼被oracle 伺服器預分配和儲存在記憶體中。
  9. NOCACHE:說明沒有序列號被oracle伺服器預分配和儲存在記憶體當中。
  10. CACHE20:這是預設值。不需要說明。
  11. CYCLE n:說明在序列號達到最大或最小值後,將繼續產生序列號。
  12. NOCYCLE:說明在序列號達到最大或最小值之後,將不再產生序列號(這也是預設值)。
該語句也是 DDL 語句。DDL語句是用於定義或管理資料庫物件的語句。

使用


建立序列號

create sequence supplier_s_code
 start with 2000
 INCREMENT by 10
 maxvalue 100000
 nocache
 nocycle;

該語句意思為:從2000開始,步長為 10 最大值為 100000, 沒有預分配,最大值之後不在產生序列號

檢視序列號資訊

 SELECT * FROM user_sequences;

如果想檢視當前序列號的值,與序列號下一次的值,可以利用SELECT 語句 加2個位列來查詢。NEXTVAL 以及 CURRVAL
  1. NEXTVAL:返回序列號下一次可獲得的值
  2. CURRVAL:返回序列號當前的值
使用 CURRVAL時需要注意,在使用之前,必須在當前會話(賬號下)使用過 NEXTVAL產生一個序列號的值,或者曾經使用過該序列號產生過值。否則會出現錯誤。

使用序列號插入資料

 INSERT INTO supplier
   (s_codde, sname, contact, phone, fax)
 VALUES
   (supplier_s_code.nextval, '仙客來百貨','張根發', 4444944, 4444844);

提示插入成功,那麼現在可以使用 CURRVAL 來獲取序列當前的值了。
SELECT supplier_s_code.currval FROM dual

建立新的序列。
CREATE SEQUENCE ord_ordno START WITH 1 INCREMENT BY 1 MAXVALUE 10000 NOCYCLE

通過查詢序列或發現,該序列號與上一個序列號之間有不同之處,
上一個序列號因為使用了 NOCACHE 所以oracle為分配快取任何序列號值,而這次建立的序列號在建立的時候為使用 NOCACHE 所以oracle預設快取了20個序列值。 orcle建議,在建立序列的時候儘量少了 NOCYCLE 。
利用 CREATE SEQUENCE 語句的 CACHE n 子句來說明讓oracle計算出 n 個序列號碼,並將它們放入記憶體當中,在一定程度上能加快訪問的速度。但是假如這個序列為共享的序列(多個使用者在使用)的話,那麼有可能某一個使用者獲得的序列號碼是有間隔的,並不是連貫性的。
使用該子句的話 oracle 做的操作包括
  1. 第一次引用這個序列時,oracle計算出 n 個序列號碼,並將它們放入記憶體當中。
  2. 每一個要求下一個序列號碼的請求,都將從記憶體中的序列號碼中得到。
  3. 當記憶體中的最後一個序列號碼用完之後,假如又收到下一個獲取序列號請求時,oracle伺服器再次計算出 n 個序列號並將它們放入記憶體當中。
當我們在使用序列的時候,比如插入,更新當中使用了序列,那麼不管插入、更新是否成功,只要使用了序列,那麼當前序列的值就會消失,再次使用時就會是下一個序列的值。有3點,當使用序列號的事物被回滾,另外的表使用序列時,系統奔潰時,序列會丟失。

NEXTVAL 和 CURRVAL偽列的使用規則。

使用規則

  1. 序列必須先定義才能使用 NEXTVAL,CURRVAL。
  2. 使用偽列 NEXTVAL 時會產生下一個新的序列號碼,並將該序列號碼放入 CURRVAL 偽列當中。
  3. 使用偽列 CURRVAL 可以獲取當前序列的系列號碼,使用之前必須在當前會話當中使用過 NEXTVAL 偽列產生過一個序列值。

使用場景

可使用場景
  1. 查詢語句的 SELECT 子句中,但不包括子查詢的 SELECT 子句。
  2. 在 UPDATE 語句的 SET 子句當中。
  3. 在 INSERT 語句中的子查詢的 SELECT 列表中。
  4. 在 INSERT 語句的 VALUES 子句中。
不能使用的場景
  1. 檢視的 SELECT 子句中,
  2. 在 SELECT 語句的子查詢中。
  3. 在 UPDATE 語句的子查詢當中。
  4. 在 DELETE 語句的子查詢中。
  5. 在包含 DISTINCT 關鍵字的查詢 SELECT 語句中。
  6. 在包含 ORDER BY 子句的查詢 SELECT 語句中。
  7. 在包含 GROUP BY 子句的查詢 SELECT 語句中。
  8. 在包含 HAVING 子句的查詢 SELECT 語句中。
  9. 在包含 DEFAULT 表示式的 CREATE TABLE 語句中。
  10. 在包含 DEFAULT 表示式的 ALTER TABLE 語句中。

序列的修改

修改序列號的語法跟建立序列的語法差不多,只不過 CREATE SEQUENCE 要變成 ALTER SEQUENCE,並且去掉了 START WITH 子句。 修改序列要注意幾點:
  • 必須要有 ALTER ANY SEQUENCE 系統許可權。
  • 不能修改 START WITH 選項,如果一定要修改,只能刪掉序列,重新建立。
  • ALTER SEQUENCE 只能影響以後的序列號碼。
  • 修改後的 MAXVALUE 不能小於序列號當前的值。比如當縣序列號的值為 1000 ,那麼久不能修改 MAXVALUE 的值為 999。

刪除序列號

語法: DROP SEQUENCE 序列號名

同義詞

在世紀工作中,我們經常會碰到一些表名稱很長的表,這個時候如果需要對該表進行查詢的話,那麼每一次查詢都需要輸入一次這個很長的表名,這無疑會使人感到很鬱悶,那麼oracle的同義詞就能幫我們解決這個問題。
比如我們查詢一個表,表名比較長
SELECT * FROM supplier

有了同義詞之後可以這樣
SELECT * FROM s

建立同義詞

語法:
CREATE [PUBLIC] SYNONYM 同義詞名字 FOR 物件名
  • PUBLIC:使用了該欄位的話,那麼表明所有使用者都可以訪問這個同義詞
  • 物件名:建立的同義詞基於的物件名。比如我們要為 supplier 表建立同義詞,那麼物件名就是該表名。
建立同義詞需要注意的是,所基於的物件下個不能包含在任何軟體包中。而且一個私有的同義詞不能與當前使用者下的任何同義詞重名。而且必須要有建立同義詞的
可以通過 user_synonym 表來查詢相關的同義詞資訊。
建立同義詞
 CREATE SYNONYM s FOR supplier;

查詢同義詞資訊
 CREATE SYNONYM s FOR supplier;

通過同義詞來查詢真是的表資料
 SELECT * FROM s

可以看到 通過同義詞,我們查詢到了真是的 supplier 表中的資料。
因為沒有使用 PUBLIC 欄位,所以切換到別的使用者的時候,我們無法使用該同義詞。但是可以使用另外的方法來使用,比如該同義詞屬於 SCOTT 使用者,那麼在別的使用者下面我們可以使用 SCOTT.s 來使用該同義詞。
oracle沒有提供修改同義詞的方法,如果想要修改 ,只能刪除之後重新建立同義詞。

刪除同義詞


DROP SYNONYM 同義詞名稱