Cả alter sequence
các câu lệnh đang hoạt động, đó là sự gia tăng ở giữa điều đó không xảy ra. nextval
lệnh gọi trong vòng lặp của bạn không được đánh giá vì câu lệnh select không gửi đầu ra của nó ở bất kỳ đâu. Từ tài liệu
, một ghi chú tình cờ đề cập đến chính xác những gì bạn đang làm:
Vì vậy, bạn cần chọn giá trị đó thành một cái gì đó:
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;
/
Tôi đã thêm một val
biến và một into val
mệnh đề thứ hai thực thi ngay lập tức.
Để chứng minh rằng nó hoạt động ngay bây giờ:
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
Không có into
, điều này quay trở lại với 1 thay vì 1001, đó là những gì bạn đang thấy.