需求二:設置開始的序列號。
有時候程序員對于序列開始的數字也有額外的要求。如有些是為了序列的為數的統一,如序列號都是10位數等等。但是如果需要號從1開始,就不能夠保證關鍵字長度的統一。如從1開始到10000,其長度就會長短不一,這對于應用程序取值為造成一定的難度。為此程序員在開發的時候可能會要求所有的關鍵字都必須是10位數字。此時就需要指定序列號開始的值。如可以把序列號開始的值設置為1000000001。那么在以后遞增的時候,就,能夠保證其關鍵字都為10位數字。如果不放心的話,可以再設置一個最大值。不過筆者不建議這么做。雖然對于大部分企業來說,這個十位數字已經足夠其應用。但是為了保險起見,還是不要設置最大值為好。雖然不設置最大值可能會造成關鍵字位數的不統一,但是相比其關鍵字耗竭超過最大值從而造成應用程序錯誤來說,這個統一原則還是可以退一步的。
另外,有時候在流水號編制的時候,可能還需要區分擔據的類別。此時也需要管理員指定序列的起始值。如選擇有這種情況,企業的銷售訂單主要分為正常訂單與特價訂單,而企業現在銷售訂單是通過流水號來進行編碼。為了區分兩種不同的訂單情況,在生成流水號的時候有要求。如對于正常的訂單,則流水號從100000到899999;而如果是特價的銷售訂單,則流水號從900001到999999。每個月周而復始一次。此時,就需要把序列功能跟其他應用結合。不過主要還是靠序列在發揮作用。為此需要為每種情況設置一個起始值。然數據庫自從根據單據類別的不同調用不同的序列。
如果要實現對于起始值的控制,則需要利用參數START WITH。在這后面設置起始值,可以方便用戶根據實際情況來設置起始值。筆者以前遇到過一個系統,在這方面設計的很好。這個系統有一個應用字典平臺。用戶可以通過這個平臺來設置Oracle數據庫序列的起始值。而不需要每次調整都從數據庫中去調整。這大大提高了程序設計的靈活性。
在設置這個起始值的時候,需要跟上面提到的這個參數掛鉤。如果序列是從小到大生成的,則在這里就是要設置其最小值。相反如果序列是從大到小生成的,則這里設置的就是其最大值。以前有人就在這里犯過一個愚蠢的錯誤。他設置的時候是讓序列從小到大生成的,并且有邊界的設置。但是這里初始值設置的時候,則設置了一個最大值。結果這個值還沒怎么用系統就報錯了。這主要是筆誤。為此管理員在設置這個初始值的時候,最好能夠再回過頭去看看序列的生成模式,是按順序生成還是倒序生成。
需求三:要確保序列號的連續。
有時候,如在財務憑證編號上,系統要確保這個流水號必須是連續的。此時如果使用這個序列來作為流水號的生成機制的話,那么能否實現所有的序列號都是連續的呢?為了保證實現這個目的,那么就需要設置CACHE參數。
CACHE這個參數主要用來指定在高速緩存中可以預先分配的序列號個數。這是什么意思呢?也就是說,如果這個數字為20的話(默認為20),那么Oracle一啟動的時候就會自動生成20個序列號放在高速緩存中。當應用程序需要使用的時候,就可以馬上從高速緩存中拿來使用。從而可以提高應用程序的性能。當這個20個序列號用完以后,數據庫會再生成20個序列號存入到數據庫的高速緩存中。很明顯,這么設計就是為了提高數據庫的性能?墒且矔䦷硪粋副作用。如系統在高速緩存中已經生成了20個序列號(從1991到2010)。而實際上只用了15個(如用到2005)。此時如果數據庫因為維護或者其他原因需要重新啟動數據庫。此時高速數據緩存中的內容就會丟失。重新啟動后Oracle數據庫又會生成20個序列號,此時序列號的順序為2011到2030。很明顯此時2006到2010中間就會斷號。為此如果需要保證連號的話,就需要把這個參數設置為Nocache,即不允許預先在高速緩存中生成序列號。這會降低數據庫的性能,但是可以保證序列號的連續性。不會因為數據庫重新啟動或者其他原因而導致序列號(流水號)斷號。
文章來源于領測軟件測試網 http://www.kjueaiud.com/