序列好象不能直接修改当前值。
方法:
做个循环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 设置序列当前值 谷歌
附加