点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!某日应用侧反馈说程序报错了,获取的序列值插入不到表里去,超出了字段长度限制。我当时就蚌埠住了,这序列长度能有多长嘛,字段长度得设置的多小?随后应用就提出了要求,为了避免类似情况再次发生,要求统计全网程序账号的序列名,最小值、最大值、当前值,使用率,是否循环,长度,长度位数是否会增加等。我心想,行吧,那就统计吧。这么多库,不可能一个一个去查,肯定要想点省事的办法。于是我想的是写个循环,每个库生成一个序列信息的文件,然后取关键信息,再对比一下序列的最大值和最小值的长度,给个判断结果,也就完成了。查看序列视图,发现我们所需要的信息基本都有,但是唯独无法获取序列的当前值,没有当前值,使用率也无法计算,难受,难道还要查完dba_sequence再去查一次序列当前值?那就有点麻烦的感觉。而且如果使用正常的sequence_name.CURRVAL去获取当前值,还可能碰到序列没有被初始化,获取会报错的问题,如下:就是如果序列没有被使用过的话,需要先通过sequence_name.NEXTVAL获取一次值,才能使用。这样看的话,如果存在序列未使用的情况,循环肯定会报错,我又不可能先去nextval一下,这会改变序列的值,万一应用哪天又要使用怎么办。要不就遇到这个报错的时候,就以最小值来当做序列的当前值,感觉很不靠谱的样子。最后,我还是以取序列定义的方式来实现吧,取出定义,格式统一,想要的值都有,又不会对序列本身造成影响,岂不是美滋滋。取出序列定义,剩下的就比较简单了,我们来看一个序列的定义通常是什么样的:sql>set lin 200 pagesize 0 longc 9999999 long 9999999sql>exec DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',TRUE);sql>select dbms_metadata.get_ddl('SEQUENCE',SEQUENCE_NAME,SEQUENCE_OWNER) STR from dba_SEQUENCES where SEQUENCE_NAME='INDEX_ID';--DDL内容:CREATE SEQUENCE "SYS"."INDEX_ID" MINVALUE 1 MAXVALUE 9999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL ;CREATE SEQUENCE "SYS"."INDEX_ID" MINVALUE 1 MAXVALUE 9999 INCREMENT BY 1 START WITH 1 NOCACHE NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL ;
*唯一需要注意的地方就是:cache和nocache的序列定义有细微差别,cache的话后面会有数值,批量处理的时候需要注意一下。通过序列定义,可以直接得出账号,序列名,最小值、最大值、当前值,是否循环,而通过简单处理,就可以得到序列使用率,长度以及长度是否增加等信息,于是,很快就把全网数据库的序列信息采集完了,交差。
最后修改时间:2022-05-06 09:15:23
文章转载自
IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。