1. 程式人生 > >Oracle資料庫中序列(SEQUENCE)的用法和例項需求

Oracle資料庫中序列(SEQUENCE)的用法和例項需求

Oracle資料庫中,什麼是序列呢?它的用途是什麼?序列(SEQUENCE)其實是序列號生成器,可以為表中的行自動生成序列號,產生一組等間隔的數值(型別為數字)。其主要的用途是生成表的主鍵值,可以在插入語句中引用,也可以通過查詢檢查當前值,或使序列增至下一個值。

建立序列需要CREATE SEQUENCE系統許可權。序列的建立語法如下:

CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [] [{CACHE n|NOCACHE}];

INCREMENT BY 用於定義序列的步長,如果省略,則預設為1,如果出現負值,則代表序列的值是按照此步長遞減的。

START WITH 定義序列的初始值(即產生的第一個值),預設為1。

MAXVALUE 定義序列生成器能產生的最大值。選項NOMAXVALUE是預設選項,代表沒有最大值定義,這時對於遞增序列,系統能夠產生的最大值是10的27次方;對於遞減序列,最大值是-1。

MINVALUE定義序列生成器能產生的最小值。選項NOMAXVALUE是預設選項,代表沒有最小值定義,這時對於遞減序列,系統能夠產生的最小值是?10的26次方;對於遞增序列,最小值是1。

CYCLE和NOCYCLE 表示當序列生成器的值達到限制值後是否迴圈。CYCLE代表迴圈,NOCYCLE代表不迴圈。如果迴圈,則當遞增序列達到最大值時,迴圈到最小值;對於遞減序列達到最小值時,迴圈到最大值。如果不迴圈,達到限制值後,繼續產生新值就會發生錯誤。

CACHE(緩衝)定義存放序列的記憶體塊的大小,預設為20。NOCACHE表示不對序列進行記憶體緩衝。對序列進行記憶體緩衝,可以改善序列的效能。

刪除序列的語法是:

DROP SEQUENCE 序列名;

其中:

刪除序列的人應該是序列的建立者或擁有DROP ANY SEQUENCE系統許可權的使用者。序列一旦刪除就不能被引用了。

序列的某些部分也可以在使用中進行修改,但不能修改SATRT WITH選項。對序列的修改隻影響隨後產生的序號,已經產生的序號不變。

修改序列的語法如下:

建立和刪除序列

例1:建立序列:

CREATE SEQUENCE ABC INCREMENT BY 1 START WITH 10 MAXVALUE 9999999 NOCYCLE NOCACHE;

執行結果:

序列已建立。

步驟2:刪除序列:

DROP SEQUENCE ABC;

執行結果:

序列已丟棄。

說明:以上建立的序列名為ABC,是遞增序列,增量為1,初始值為10。該序列不迴圈,不使用記憶體。沒有定義最小值,預設最小值為1,最大值為9 999 999。

序列的使用

如果已經建立了序列,怎樣才能引用序列呢?方法是使用CURRVAL和NEXTVAL來引用序列的值。

在編號的過程中,產生間隙的原因多種多樣。如果一個儲存過程從一個序列中挑選某個數字,定為本地變數,但是從來不用它,這個數字就丟失了。它將不能再返回到原序列中,結果就造成數值序列中存在一個間隙。關係型資料庫模型中不必擔心這一點。但是有時候人們在意這一點,這些人想知道是哪些數字丟失了。

呼叫NEXTVAL將生成序列中的下一個序列號,呼叫時要指出序列名,即用以下方式呼叫:

序列名.NEXTVAL

CURRVAL用於產生序列的當前值,無論呼叫多少次都不會產生序列的下一個值。如果序列還沒有通過呼叫NEXTVAL產生過序列的下一個值,先引用CURRVAL沒有意義。呼叫CURRVAL的方法同上,要指出序列名,即用以下方式呼叫:

序列名.CURRVAL.

產生序列的值。

步驟1:產生序列的第一個值:

SELECT ABC.NEXTVAL FROM DUAL;

執行結果:

NEXTVAL ------------------ 10

步驟2:產生序列的下一個值:

SELECT ABC.NEXTVAL FROM DUAL;

執行結果:

NEXTVAL ------------------- 11

產生序列的當前值:

SELECT ABC.CURRVAL FROM DUAL;

執行結果:

CURRVAL -------------------- 11

說明:第一次呼叫NEXTVAL產生序列的初始值,根據定義知道初始值為10。第二次呼叫產生11,因為序列的步長為1。呼叫CURRVAL,顯示當前值11,不產生新值。Oracle的解析函式為檢查間隙提供了一種要快捷得多的方法。它們使你在使用完整的、面向集合的SQL處理的同時,仍然能夠看到下一個行(LEAD)或者前一行(LAG)的數值。

舉例分析:確保序列號的連續。

  有時候,如在財務憑證編號上,系統要確保這個流水號必須是連續的。此時如果使用這個序列來作為流水號的生成機制的話,那麼能否實現所有的序列號都是連續的呢?為了保證實現這個目的,那麼就需要設定CACHE引數。
  CACHE這個引數主要用來指定在快取記憶體中可以預先分配的序列號個數。這是什麼意思呢?也就是說,如果這個數字為20的話(預設為20),那麼Oracle一啟動的時候就會自動生成20個序列號放在快取記憶體中。當應用程式需要使用的時候,就可以馬上從快取記憶體中拿來使用。從而可以提高應用程式的效能。當這個20個序列號用完以後,資料庫會再生成20個序列號存入到資料庫的快取記憶體中。很明顯,這麼設計就是為了提高資料庫的效能。可是也會帶來一個副作用。如系統在快取記憶體中已經生成了20個序列號(從1991到2010)。而實際上只用了15個(如用到2005)。此時如果資料庫因為維護或者其他原因需要重新啟動資料庫。此時高速資料快取中的內容就會丟失。重新啟動後Oracle資料庫又會生成20個序列號,此時序列號的順序為2011到2030。很明顯此時2006到2010中間就會斷號。為此如果需要保證連號的話,就需要把這個引數設定為Nocache,即不允許預先在快取記憶體中生成序列號。這會降低資料庫的效能,但是可以保證序列號的連續性。不會因為資料庫重新啟動或者其他原因而導致序列號(流水號)斷號。

相關推薦

Oracle資料庫序列(SEQUENCE)的用法例項需求

在Oracle資料庫中,什麼是序列呢?它的用途是什麼?序列(SEQUENCE)其實是序列號生成器,可以為表中的行自動生成序列號,產生一組等間隔的數值(型別為數字)。其主要的用途是生成表的主鍵值,可以在插入語句中引用,也可以通過查詢檢查當前值,或使序列增至下一個值。 建立

Oracle資料庫複製表結構表資料

1. 複製表結構及其資料: create table new_table as select * from old_table 2. 只複製表結構: create table new_tableas select * from old_tablewhere 1=2; 或者:

Pythonsplit()函式用法例項

一、描述 split()通過指定分隔符對字串進行切片,如果引數num 有指定值,則僅分隔 num 個子字串 函式形式:str.split(str="", num=string.count(str)) 引數: str -- 分隔符,預設為所有的空字元,包括空格、換行(\n)、製表

oracle資料庫選擇桌面類伺服器類的區別

在以前的學習過程中,一直用到的都是sql server資料庫,之後接觸到了oracle資料庫。在安裝過程中,有兩個選項,桌面類和伺服器類,當時按照網上的安裝步驟,選擇了桌面類,後來公司裡他們安裝都是用的伺服器類,後來查了查兩者的區別。 桌面類――這種安裝方式一般適用於桌上型電腦和筆記本。它包含一

詳解PHPforeach的用法例項

在PHP中經常會用到foreach的使用,而要用到foreach,就必須用到陣列。因此,在這篇文章中,我們一邊講陣列,一邊講foreach。 foreach有兩種語法: 第一種:遍歷給定的 陣列語句 array_expression 陣列。每次迴圈中,當前單元的值被賦給

oracle資料庫序列使用講解

oracle資料庫中序列使用講解 定義:    序列(SEQUENCE)是序列號生成器,可以為表中的行自動生成序列號,產生一組等間隔的數值(型別為數字)。    其主要的用途是生成表的主鍵值,可以在插入語句中使用,也可以通過查詢檢查當前值,或使序列增至下一個值。  

Oracle資料庫的listener.oratnsnames.ora的作用

listener.ora檔案 listener.ora是伺服器端用的,oracle監聽程式,就是讀的這個檔案,裡面有oracle伺服器端的socket監聽地址和埠(如果要想區域網中的其他人,能夠訪問我本地的oracle,要把我本機的地址寫進去,如10.11.19.19

javaList的用法例項詳解

的用法List包括List介面以及List介面的所有實現類。因為List介面實現了Collection介面,所以List介面擁有Collection介面提供的所有常用方法,又因為List是列表型別,所以List介面還提供了一些適合於自身的常用方法,如表1所示。表1 List介面定義的常用方法及功能從表1可以看

資料庫序列Sequence作用用法

通過jdbc對資料庫操作時,往往要通過特定的方式獲取某一個表中的欄位值,再將它賦予另外的欄位或組合成一種新的約束,這時,我們也就要從程式的角度出發,考慮應該如何通過程式達到這種預期的效果了。//建立語句物件並標明返回自動增長的主鍵的值 ps =con.prepareState

mybatis 在oracle資料庫插入資料時獲取自增ID sequence序列

在oracle中sequence就是序號,每次取的時候它會自動增加。sequence與表沒有關係。 Create Sequence 首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE許可權。 建立語句如下: CREATE SEQUEN

mybatis 在oracle資料庫插入資料時獲取自增ID sequence序列

在oracle中sequence就是序號,每次取的時候它會自動增加。sequence與表沒有關係。 Create Sequence 首先要有CREATE SEQUENCE或者CREATE

兩個Oracle資料庫的表的結構資料的複製方法

1. 複製表結構及其資料: create table table_name_new as select * from table_name_old 2. 只複製表結構: create table table_name_new as select * from table_name_old

Shell ${} 用法例項

Shell中 ${} 用法和例項 檔案路徑(如下): /dir1/dir2/dir3/my.file.txt 1. 截斷功能 ${file#*/}:   拿掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my

日期型別的資料在Oracle資料庫的儲存查詢

使用Oracle資料庫,mybatis的對映檔案中日期型別的資料,如果定義為<result column =“UPDATED_DATE" jdbcType =“DATE” property =“updatedDate”/>,即使在後臺你為日期賦予年月日時分秒,但儲存到資料庫中將只

如何使用Oracle SQLDeveloper 連線MS SQLServerMySQL資料庫(轉)

如何使用Oracle SQLDeveloper 中連線MS SQLServer和MySQL資料庫 一、連線至MySQL資料庫 1.下載mysql的jdbc驅動, [url]http://dev.mysql.com/downloads/[/url] 免費,嘿嘿。 2.解壓zip檔案(我下載

Oracle資料庫的函式、檢視索引

1. Oracle函式 Oracle SQL 提供了用於執行特定操作的專用函式。這些函式大大增強了 SQL 語言的功能。函式可以接受零個或者多個輸入引數,並返回一個輸出結果。 Oracle 資料庫中主要使用兩種型別的函式: 1. 單行函式: 對每一個函式應用在表的記錄中時,只能輸入一

java.sql.date 跟java.util.date的區別 怎麼在oracle資料庫顯示時分秒

java.sql.Date,java.sql.Time和java.sql.Timestamp三個都是java.util.Date的子類(包裝類)。 java.sql.Date是java.util.Date的子類,是一個包裝了毫秒值的瘦包裝器,允許 JDBC 將毫秒值標識

Oracle資料庫truncate命令delete命令的區別

首先講一下,truncate命令: 語法:TRUNCATE  TABLE  table; 表格裡的資料被清空,儲存空間被釋放。 執行後會自動提交,包括之前其它未提交的會話,因而一旦清空無法回退。 只有表格的建立者或者其他擁有刪除任意表格許可權的使用者(如DBA)才能清空表格。 TRUNCATE  TABL

Oracle資料庫的系統引數(包括隱藏廢棄的)

Oracle資料庫系統根據初始化引數檔案init.ora中設定的引數來配置自身的啟動,每個例項在啟動之前,首先讀取這些引數檔案中設定的不同引數。Oracle系統中的引數,根據系統使用情況可以簡單分為兩大類,普通引數,也就是Oracle系統正常使用的一些引數,另外一類就是特殊

使用c++Ado向Oracle資料庫插入圖片

    最近因為專案需要,需要將圖片插入至Oracle,現簡單總結如下:     1.引入ado #import "C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" no_namespace rename(