Beide alter sequence
Anweisungen funktionieren, es ist das Inkrement dazwischen, das nicht passiert. Das nextval
Aufruf in Ihrer Schleife wird nicht ausgewertet, da die select-Anweisung ihre Ausgabe nirgendwohin sendet. Aus der Dokumentation
, eine Notiz, die sich genau auf das bezieht, was Sie gerade tun:
Sie müssen diesen Wert also in etwas auswählen:
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;
/
Ich habe ein val
hinzugefügt Variable und ein into val
Klausel auf der zweiten sofort ausführen.
Um zu demonstrieren, dass es jetzt funktioniert:
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
Ohne into
Klausel, kam dies mit 1 statt 1001 zurück, was Sie sehen.