tôi đã thực hiện kịch bản này như tôi đã không tìm thấy một kịch bản trực tuyến mà tự động đặt tất cả chuỗi của tôi để ID cao nhất hiện nay. Thử nghiệm trên Oracle 11.2.0.4.
DECLARE
difference INTEGER;
sqlstmt VARCHAR2(255) ;
sqlstmt2 VARCHAR2(255) ;
sqlstmt3 VARCHAR2(255) ;
sequenceValue NUMBER;
sequencename VARCHAR2(30) ;
sequencelastnumber INTEGER;
CURSOR allseq
IS
SELECT sequence_name, last_number FROM user_sequences ORDER BY sequence_name;
BEGIN
DBMS_OUTPUT.enable(32000) ;
OPEN allseq;
LOOP
FETCH allseq INTO sequencename, sequencelastnumber;
EXIT
WHEN allseq%NOTFOUND;
sqlstmt := 'ALTER SEQUENCE ' || sequencename || ' INCREMENT BY ';
--Assuming: <tablename>_id is <sequencename>
sqlstmt2 := 'select (nvl(Max(ID),0) - :1)+1 from ' || SUBSTR(sequencename, 1, LENGTH(sequencename) - 3) ;
--DBMS_OUTPUT.PUT_LINE(sqlstmt2);
--Attention: makes use of user_sequences.last_number --> possible cache problems!
EXECUTE IMMEDIATE sqlstmt2 INTO difference USING sequencelastnumber;
IF difference > 0 THEN
DBMS_OUTPUT.PUT_LINE('EXECUTE IMMEDIATE ' || sqlstmt || difference) ;
EXECUTE IMMEDIATE sqlstmt || difference;
sqlstmt3 := 'SELECT ' || sequencename ||'.NEXTVAL from dual';
DBMS_OUTPUT.PUT_LINE('EXECUTE IMMEDIATE ' || sqlstmt3 || ' INTO sequenceValue') ;
EXECUTE IMMEDIATE sqlstmt3 INTO sequenceValue;
DBMS_OUTPUT.PUT_LINE('EXECUTE IMMEDIATE ' || sqlstmt || 1) ;
EXECUTE IMMEDIATE sqlstmt || 1;
DBMS_OUTPUT.PUT_LINE('') ;
END IF;
END LOOP;
CLOSE allseq;
END;
Tôi đang vật lộn với cách thực hiện bước 3, tôi đã thử các cú pháp khác nhau nhưng không thể làm việc đó – AJM
Mục đích của bước 3 chỉ là so sánh giá trị PK lớn nhất với giá trị chuỗi tiếp theo. Vì vậy, ví dụ, nếu SELECT từ bước 1 dẫn đến kết quả là 100, và SELECT từ bước 2 dẫn đến kết quả là 90 có nghĩa là bạn có "nhảy" 11 chuỗi. Khi bạn thay đổi trình tự trong bước 4, lệnh SELECT ở bước 5 sẽ di chuyển 10 giá trị chuỗi, đến 100. Sau khi số dư được đặt lại ở bước 6, "SELECT PK_SEQ.NEXTVAL FROM DUAL" tiếp theo sẽ cho bạn 101. – dpbradley
Trong Bước 4 Tôi không thể có cú pháp để thực hiện phép trừ trong mệnh đề Increment by. Tôi đã thử [a-b] a-b và selecr a-b từ đôi, nhưng không thành công. – AJM