Oba alter sequence
příkazy fungují, je to přírůstek mezi tím, co se neděje. nextval
volání ve vaší smyčce není vyhodnocováno, protože příkaz select nikam neposílá svůj výstup. Z dokumentace
, poznámka, která přesně odkazuje na to, co děláte:
Takže musíte tuto hodnotu do něčeho vybrat:
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;
/
Přidal jsem val
proměnnou a into val
klauzule na druhé provést okamžitě.
Chcete-li ukázat, že to nyní funguje:
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
Bez into
klauzule, toto se vrátilo s 1 místo 1001, což je to, co vidíte.