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