序列好象不能直接修改当前值。

方法:


做个循环select,


或者重建这个序列,

或者修改这个序列的increment,然后做一次select,然后再把increment 修改回来。


修改这个序列的increment,然后做一次select,然后再把increment 修改回来:


SQL> select seq.nextval from dual;


NEXTVAL

----------

21


SQL> alter sequence seq increment by 79;


序列已更改。



SQL> select seq.nextval from dual;


NEXTVAL

----------

100


SQL> alter sequence seq increment by 1;


序列已更改。


SQL> select seq.nextval from dual;


NEXTVAL

----------

101


SQL>






做个循环select:


用 隐式游标来实现做个循环select 这种方法的,其中select seq_article.nextval into indexnum from dual中的变量indexnum 是多余的:

DECLARE

indexnum number;

begin

  for ind in 1..(52243-51538) loop

  select seq_article.nextval into indexnum from dual;/*这是隐式游标,可以用显示游标来执行同一个select语句的多次执行*/

   end loop ;

   end;

或是

我们可以用显示游标来实现做个循环select 这种方法:


DECLARE


l_cursor INTEGER;

l_retval INTEGER;

BEGIN

l_cursor := dbms_sql.open_cursor;  //打开游标

dbms_sql.parse(l_cursor,'select seq_article.nextval from dual;’,1); //解析游标,此时,游标与某一SQL语句相关联了

for ind in 1..(52243-51538) loop

l_retval := dbms_sql.execute(l_cursor); //执行游标(发现select seq_article.nextval from dual的值未变,这是因为执行游标这个步骤里的很多事情延迟到fetch那个步骤了,即execute(l_cursor)实际并未在执行该SQL语句)

end loop;

dbms_sql.close_cursor(l_cursor);//关闭游标

END;

故而改为:

DECLARE


l_cursor INTEGER;

l_retval INTEGER;

BEGIN

l_cursor := dbms_sql.open_cursor;  //打开游标

dbms_sql.parse(l_cursor,'select seq_article.nextval from dual’,1); //解析游标,此时,游标与某一SQL语句相关联了

l_retval := dbms_sql.execute(l_cursor); //执行游标


for ind in 1..(52243-51538) loop

dbms_sql.fetch_rows(l_cursor) ;

end loop;

dbms_sql.close_cursor(l_cursor);//关闭游标

END;



或是

select seq_article.nextval from 表T;//表T有几行记录,序列就被执行几次seq_article.nextval


参考:

oracle 设置序列当前值 谷歌


附加