利用序列减少Oracle数据库开发工作量

发表于:2009-4-09 10:27

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:网络转载

  要求一:增量以10位单位递增。

  通常情况下,序列是以1为单位递增的。如1001、1002、1003等等。但是有些时候,程序员希望这个增量以10(或者以任何一个整数)为单位递增。如在销售订单订单明细中,其各个项目就是以10为单位进行递增。这主要是为了后续的调整提供方便。不仅如此,在财务管理系统中也都有类似的要求。那么Oracle数据库的序列能否实现以10为单位或者以任何一个整数为递增单位呢?答案当然是肯定的。在创建序列的时候,默认情况下其递增单位为1。但是数据库管理员可以利用INCREMENT BY参数指定序列的增量,其默认值为1。如果程序员希望能够实现按10来递增的话,只要把这个参数设置为10即可。

  这个参数不仅控制了递增的单位,而且还控制了递增的方向。即按从大到小递减还是按从小到大递增。如这个值设置为10,则其就是按10、20、30如此递增。如果这个数值设置为-10,其就是按10000(假设最大值为10000)、9990、99980等顺序递减。也就是说如果利用这个字段来做为表的关键字的话,那么这个关键字可以从大到小生成,也可以从小到大生成。

  要求二:设置开始的序列号。

  有时候程序员对于序列开始的数字也有额外的要求。如有些是为了序列的为数的统一,如序列号都是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,即不允许预先在高速缓存中生成序列号。这会降低数据库的性能,但是可以保证序列号的连续性。不会因为数据库重新启动或者其他原因而导致序列号(流水号)断号。

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号