两种alter sequence
说法都有效,只是两者之间的增量没有发生。循环中的nextval
调用没有被评估,因为 select 语句没有将其输出发送到任何地方。从文档中,恰好是指您正在做的事情的注释:
注意:
如果dynamic_sql_statement是一个SELECT
语句,并且您同时省略了into_clause和bulk_collect_into_clause,那么execute_immediate_statement永远不会执行。
例如,此语句从不增加序列:
EXECUTE IMMEDIATE 'SELECT S.NEXTVAL FROM DUAL'
因此,您需要将该值选择为:
declare
st VARCHAR(1024);
val number;
begin
for x in (SELECT sequence_name FROM USER_SEQUENCES) loop
st := 'ALTER SEQUENCE ' || x.sequence_name || ' INCREMENT BY 1000';
execute immediate st;
st := 'select ' || x.sequence_name || '.nextval from dual';
execute immediate st into val;
st := 'ALTER SEQUENCE ' || x.sequence_name || ' INCREMENT BY 1';
execute immediate st;
end loop;
end;
/
我在第二个立即执行时添加了一个val
变量和一个子句。into val
为了证明它现在可以工作:
create sequence s42;
Sequence s42 created.
declare
st VARCHAR(1024);
n number;
begin
for x in (SELECT sequence_name FROM USER_SEQUENCES) loop
st := 'ALTER SEQUENCE ' || x.sequence_name || ' INCREMENT BY 1000';
execute immediate st;
st := 'select ' || x.sequence_name || '.nextval from dual';
execute immediate st into n;
st := 'ALTER SEQUENCE ' || x.sequence_name || ' INCREMENT BY 1';
execute immediate st;
end loop;
end;
/
anonymous block completed
select s42.nextval from dual;
NEXTVAL
----------
1001
如果没有该into
子句,则返回 1 而不是 1001,这就是您所看到的。