【问题标题】:Reset sequence in Oracle annually每年在 Oracle 中重置序列
【发布时间】:2021-09-30 17:01:04
【问题描述】:

我的表的列(不是主键)有一个序列,每次插入都会递增。

我希望新年的每一天都将该序列重置为值 1。

我已经看到了一些删除和重新创建序列的解决方案。但我想每年安排一次。

这怎么可能?

提前致谢

【问题讨论】:

  • 您为什么不简单地在 crontab 中安排一次(假设您使用的是 unix),它会启动一个小 sql 脚本来重新创建您的序列?或者更简单:使用 DBMS_SCHEDULER

标签: sql oracle sequence


【解决方案1】:

您可以使用DBMS_SCHEDULER Oracle 包来安排作业。在此处查看更多详细信息:https://docs.oracle.com/cd/B28359_01/server.111/b28310/scheduse.htm

创建一个重置序列的过程,并将该过程作为每年的计划作业运行。以下是此类过程的示例:How do I reset a sequence in Oracle?

【讨论】:

    【解决方案2】:

    试试我自己的程序

        create or replace procedure reset_seq_hh_ww(p_seq_name in varchar2,
                                                num_seq    in Number) is
      l_val     number;
      curr_se   number;
      min_l_val number;
    begin
    
      execute immediate 'select ' || p_seq_name || '.nextval from dual'
        INTO l_val;
      DBMS_OUTPUT.PUT_LINE('1-l_val='||l_val);
      if l_val > num_seq then
        min_l_val := -1 * l_val;
        
        execute immediate
        
         'alter sequence ' || p_seq_name || ' increment by ' ||  min_l_val || ' minvalue 0';
          DBMS_OUTPUT.PUT_LINE('alter sequence ' || p_seq_name || ' increment by ' ||  min_l_val || ' minvalue 0');
    
      
      
        execute immediate
        
         'select ' || p_seq_name || '.nextval from dual'  INTO l_val;
         DBMS_OUTPUT.PUT_LINE('select ' || p_seq_name || '.nextval from dual');
         DBMS_OUTPUT.PUT_LINE('2-min_l_val='||min_l_val);
        
        DBMS_OUTPUT.PUT_LINE('3-l_val='||l_val);
        
    
        curr_se := num_seq-1;
        if curr_se=0 then curr_se:=2-num_seq;
        else
         curr_se := num_seq-1;
         end if; 
        DBMS_OUTPUT.PUT_LINE('4-curr_se='||curr_se);
        
        
      else
      
        curr_se := num_seq - l_val-1;
        if curr_se =0 then curr_se:=curr_se+num_seq;
        else
          curr_se:=curr_se;
          end if;
        DBMS_OUTPUT.PUT_LINE('5-curr_se='||curr_se);
      end if;
      execute immediate
      /*'alter sequence ' || p_seq_name || ' increment by -' || l_val ||
                                                                ' minvalue 0';
              DBMS_OUTPUT.PUT_LINE (l_val);
      
      
                execute immediate*/
       'alter sequence ' || p_seq_name || ' increment by ' || curr_se ||
       ' minvalue 0';
      DBMS_OUTPUT.PUT_LINE('6-l_val='||l_val);
    
      execute immediate 'select ' || p_seq_name || '.nextval from dual'
        INTO l_val;
    
      DBMS_OUTPUT.PUT_LINE('7-l_val='||l_val);
    
      
      execute immediate 
      'alter sequence ' || p_seq_name ||   ' increment by 1 minvalue 0';
    end;
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多