Begge alter sequence
udtalelser virker, det er stigningen derimellem, der ikke sker. nextval
call in your loop bliver ikke evalueret, fordi select-sætningen ikke sender sit output nogen steder. Fra dokumentationen
, en note, der tilfældigvis henviser til præcis, hvad du laver:
Så du skal vælge den værdi til noget:
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;
/
Jeg har tilføjet en val
variabel og en into val
klausul på den anden udførelse med det samme.
For at demonstrere, at det virker 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
Uden into
klausul, dette kom tilbage med 1 i stedet for 1001, hvilket er det, du ser.