首页 新闻 会员 周边

Oracle 序列重置问题求解?

0
悬赏园豆:10 [已解决问题] 解决于 2019-05-28 16:36

我这边在工作中会有每天重置序列从1开始计数,但是运行了差不多两年后出现了问题。
我的重置代码如下:

create or replace procedure reset_seq(p_seq_name in varchar2) is
  l_val number;
begin
  execute immediate 'select ' || p_seq_name || '.nextval from dual'
    INTO l_val;   --1

  execute immediate 'alter sequence ' || p_seq_name || ' increment by -' ||
                    l_val || ' minvalue 0'; --2
  execute immediate 'select ' || p_seq_name || '.nextval from dual'
    INTO l_val;  --3

  execute immediate 'alter sequence ' || p_seq_name ||
                    ' increment by 1 minvalue 0';  --4

end;

出现的问题为,步长变成负值,起始值也变成了负值。
经过大致的分析,我认为问题应该是出现在来对序列的同时操作上
即步骤 3

  1. 在将起始值调整为0后步长还未改变前,
  2. 此时客户端请求了了一次序列值,导致起始值直接进行累加 0 +负值,变成负值。
  3. 等到存储过程继续执行 步骤4时出现了异常。

看起来是要给序列加上锁,但是目前对数据库的功底还是有点差,还请大神帮忙看看是否有更好的解决方案

问题补充:

貌似Oracle begin 和end之间是原子性的操作,但是为什么我观察到的现象确不是呢,求大佬解释!!!

GYY_顽石的主页 GYY_顽石 | 初学一级 | 园豆:143
提问于:2019-05-22 17:11
< >
分享
最佳答案
0

一个可能的解决方案 How to Reset Oracle Sequence Safely?
话说大佬就是大佬,问题分析的明明白白,解决方案也给的那么完善。感谢大佬 Alex Poole

GYY_顽石 | 初学一级 |园豆:143 | 2019-05-23 18:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册