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; 或者:
Python中split()函式用法和例項
一、描述 split()通過指定分隔符對字串進行切片,如果引數num 有指定值,則僅分隔 num 個子字串 函式形式:str.split(str="", num=string.count(str)) 引數: str -- 分隔符,預設為所有的空字元,包括空格、換行(\n)、製表
oracle資料庫中選擇桌面類和伺服器類的區別
在以前的學習過程中,一直用到的都是sql server資料庫,之後接觸到了oracle資料庫。在安裝過程中,有兩個選項,桌面類和伺服器類,當時按照網上的安裝步驟,選擇了桌面類,後來公司裡他們安裝都是用的伺服器類,後來查了查兩者的區別。 桌面類――這種安裝方式一般適用於桌上型電腦和筆記本。它包含一
詳解PHP中foreach的用法和例項
在PHP中經常會用到foreach的使用,而要用到foreach,就必須用到陣列。因此,在這篇文章中,我們一邊講陣列,一邊講foreach。 foreach有兩種語法: 第一種:遍歷給定的 陣列語句 array_expression 陣列。每次迴圈中,當前單元的值被賦給
oracle資料庫中序列使用講解
oracle資料庫中序列使用講解 定義: 序列(SEQUENCE)是序列號生成器,可以為表中的行自動生成序列號,產生一組等間隔的數值(型別為數字)。 其主要的用途是生成表的主鍵值,可以在插入語句中使用,也可以通過查詢檢查當前值,或使序列增至下一個值。  
Oracle資料庫中的listener.ora和tnsnames.ora的作用
listener.ora檔案 listener.ora是伺服器端用的,oracle監聽程式,就是讀的這個檔案,裡面有oracle伺服器端的socket監聽地址和埠(如果要想區域網中的其他人,能夠訪問我本地的oracle,要把我本機的地址寫進去,如10.11.19.19
java中List的用法和例項詳解
的用法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 SQLServer和MySQL資料庫(轉)
如何使用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(