Entrambi alter sequence
le dichiarazioni funzionano, è l'incremento intermedio che non sta accadendo. Il nextval
la chiamata nel tuo ciclo non viene valutata perché l'istruzione select non invia il suo output da nessuna parte. Da la documentazione
, una nota che si riferisce esattamente a ciò che stai facendo:
Quindi devi selezionare quel valore in qualcosa:
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;
/
Ho aggiunto un val
variabile e un into val
clausola sulla seconda esecuzione immediata.
Per dimostrare che ora funziona:
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
Senza il into
clausola, questo è tornato con 1 anziché 1001, che è quello che stai vedendo.