oracle sequence产生的值不连续 10

我创建了一个存储过程,存储过程执行:createsequencetest5;updatetest1setvalue=test5.nextval;为什么表test1中val... 我创建了一个存储过程,存储过程执行:create sequence test5;update test1 set value=test5.nextval;为什么表test1中value的值不连续,而把创建存储过程的sql改成:create sequence test5 nocache就能连续,我知道这个是缓存的原因(不写cache默认20),但是这是一个sql一次性完成的,为什么还会出现跳跃,而且跳跃很怪,从46跳到61,然后连续到65,然后突然又变100多,为什么?
执行create和update是放在execute immediate ''里面执行的

补充一下,我用有权限直接用sql(create table 。。。)建表的用户运行含execute immediate 'create table ....'的存储过程,为什么会出现异常,提示用户没有权限
展开
 我来答
maclean_007
2011-08-29 · 超过34用户采纳过TA的回答
知道答主
回答量:108
采纳率:100%
帮助的人:90.9万
展开全部
sequence 本身是不能保证连续的,譬如你用insert语句插入一个sequence number,之后在将这个操作rollback掉,这个时候sequence就丢失了1次。
追问
你说的这个我当然明白,但是我这个sequence里面没有rollback操作,因为我写的这个存储过程执行的时候没有报错,而是一次性通过,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
spiderrobot
2011-08-29 · TA获得超过871个赞
知道小有建树答主
回答量:930
采纳率:0%
帮助的人:570万
展开全部
sequence如果你程序中动态生成的话,是需要控制起始值的,
比如让start value等于test1.value的最大值
后面这个问题应该是因为你用角色赋权限的原因,加上authid current_user可以处理
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
籍玉0ev
2011-08-29 · TA获得超过397个赞
知道小有建树答主
回答量:198
采纳率:0%
帮助的人:259万
展开全部
你的系统只是你一个人在编码测试吗,你的共享池(shared_pool)是不是会被别人flush过(类似执行了这样的sql语句:alter system flush shared_pool;),导致序列不连续?
如果要用cache,建议用exec dbms_shared_pool.keep('seq_test','Q')保存序列,可以解决不连续的问题
追问
这一个数据库只有我一个人在用,因为我是从另外的用户导出的,然后再新建了用户从新导入,我把sequence弄成nocache之后就连续了,但是这样牺牲了效率,实在不知道为什么一次性执行也出现跳跃,还有问题补充那个问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kj129
2011-08-29 · TA获得超过514个赞
知道小有建树答主
回答量:557
采纳率:0%
帮助的人:225万
展开全部
为什么要临时创建sequence?
追问
当然有临时创建的理由,比如对历史数据进行处理、从新生成主键或者某种编号、框架封装传入一个参数自动调用相应的sequence(先判断sequence有没有创建,创建了直接取值,没创建就新建)取值
追答
cache应该跟session有关,是不是你的存储过程并发较多。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式