Båda alter sequence
uttalanden fungerar, det är ökningen däremellan som inte händer. nextval
anropet i din loop utvärderas inte eftersom select-satsen inte skickar sin utdata någonstans. Från dokumentationen
, en anteckning som råkar hänvisa till exakt vad du gör:
Så du måste välja det värdet till något:
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;
/
Jag har lagt till ett val
variabel och en into val
sats på den andra exekvera omedelbart.
För att visa att det fungerar nu:
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
Utan into
klausul, detta kom tillbaka med 1 istället för 1001, vilket är vad du ser.