Beide alter sequence
verklaringen werken, het is de tussenstap die niet gebeurt. De nextval
call in uw lus wordt niet geëvalueerd omdat de select-instructie de uitvoer nergens naartoe stuurt. Van de documentatie
, een notitie die precies verwijst naar wat u aan het doen bent:
Dus je moet die waarde ergens in selecteren:
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;
/
Ik heb een val
toegevoegd variabele, en een into val
clausule op de tweede uitvoering onmiddellijk.
Om aan te tonen dat het nu werkt:
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
Zonder de into
clausule, dit kwam terug met 1 in plaats van 1001, wat je ziet.