Ambos alter sequence
las declaraciones están funcionando, es el incremento intermedio lo que no está sucediendo. El nextval
la llamada en su bucle no se está evaluando porque la declaración de selección no está enviando su salida a ninguna parte. De la documentación
, una nota que se refiere exactamente a lo que estás haciendo:
Por lo tanto, debe seleccionar ese valor en algo:
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;
/
He agregado un val
variable, y un into val
cláusula en la segunda ejecución inmediata.
Para demostrar que funciona ahora:
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
Sin el into
cláusula, esto volvió con 1 en lugar de 1001, que es lo que está viendo.