-1

我当前的序列号是 203 我需要跳到 1203 而不丢弃序列。

4

3 回答 3

3

您可以在所需的 DB 模式上创建这样的过程,如下所示:

SQL>Create or Replace Procedure Pr_Set_Sequence( i_seq_name varchar2, i_val pls_integer ) is
   v_val     pls_integer;
begin
  for c in (
            Select u.sequence_name seq
              From User_Sequences u
             Where u.sequence_name = upper(i_seq_name)
           ) 
  loop  
    execute immediate 'select '||i_seq_name||'.nextval from dual' INTO v_val;
    execute immediate 'alter sequence '||i_seq_name||' increment by ' ||
                                               to_char(-v_val+i_val) || ' minvalue 0';
    execute immediate 'select '||i_seq_name||'.nextval from dual' INTO v_val;
    execute immediate 'alter sequence '||i_seq_name||' increment by 1 minvalue 0';
  end loop;  
end;

并使用所需的值调用(在我的情况下,创建一个名为的新值my_seq):

SQL> create sequence my_seq;

Sequence created

SQL> select my_seq.nextval from dual;

   NEXTVAL
----------
         1

SQL> begin
  2     pr_set_sequence('my_seq',1203);
  3  end;
  4  /

PL/SQL procedure successfully completed

SQL> select my_seq.currval from dual;

   NEXTVAL
----------
      1203
于 2018-07-20T14:10:32.583 回答
3

首先改变序列增量,给定你说的203到1203,我加1000,酌情调整。

ALTER SEQUENCE yourSequence INCREMENT BY 1000;

然后请求一个值

SELECT yourSequence.NextVal FROM dual;

然后将其改回以 1 递增(假设它首先是 1)

ALTER SEQUENCE yourSequence INCREMENT BY 1;

如果序列正在使用中,您真的不想这样做 - 因为它可能会跳跃数千。

于 2018-07-20T13:45:10.270 回答
0

只需执行一个 WHILE 循环,从序列中进行选择,直到达到您需要的值。它相当快。

declare
  v_sequence_value       number;
begin
  while v_sequence_value <= 1203 loop
    select my_sequence.nextval into v_sequence_value from dual;
  end loop;
end;
/
于 2018-07-23T20:44:41.570 回答