oracle如何设置序列当前值

oracle 改变序列当前值

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

方法:

做个循环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 设置序列当前值 谷歌

附加

你可能感兴趣的:(oracle如何设置序列当前值)