Les deux alter sequence
les déclarations fonctionnent, c'est l'incrément entre les deux qui ne se produit pas. Le nextval
call dans votre boucle n'est pas évalué car l'instruction select n'envoie sa sortie nulle part. Depuis la documentation
, une note qui fait référence exactement à ce que vous faites :
Vous devez donc sélectionner cette valeur dans quelque chose :
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;
/
J'ai ajouté un val
variable, et un into val
clause sur la deuxième exécution immédiate.
Pour démontrer que cela fonctionne maintenant :
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
Sans le into
clause, cela revient avec 1 plutôt que 1001, ce que vous voyez.