Oba alter sequence
instrukcje działają, to wzrost pomiędzy nimi się nie dzieje. nextval
wywołanie w pętli nie jest oceniane, ponieważ instrukcja select nigdzie nie wysyła swoich danych wyjściowych. Z dokumentacji
, uwaga, która odnosi się dokładnie do tego, co robisz:
Musisz więc wybrać tę wartość do czegoś:
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;
/
Dodałem val
zmiennej i into val
klauzula drugiego wykonania natychmiast.
Aby zademonstrować, że teraz działa:
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
Bez into
klauzula, to wróciło z 1 zamiast 1001, co właśnie widzisz.