2012-07-26 25 views
7

Tôi đang sử dụng liquibase để quản lý giản đồ của mình. Tôi có một loạt các câu lệnh chèn. Tôi đã mã hóa cứng các số id chính. Sau khi tất cả các chèn của tôi được thực hiện, tôi muốn thay đổi giá trị chuỗi thành 1 nhiều hơn giá trị tối đa của khóa chính trong bảng. Đối với điều này tôi đã viết một PL/SQL như được đưa ra dưới đây. Tuy nhiên, khi tôi thực hiện select ArtifactTypes_id_seq.nextval from dual; nó vẫn increments 0.Oracle: Đặt chuỗi theo giá trị cụ thể

SET SERVEROUTPUT ON SIZE 1000000 
DECLARE 
    sequence_id NUMBER; 
BEGIN 

    SELECT NVL(MAX(idArtifactType), 0) + 1 INTO sequence_id FROM ArtifactTypes; 
    EXECUTE IMMEDIATE 'ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY ' || sequence_id; 
    EXECUTE IMMEDIATE 'SELECT ArtifactTypes_id_seq.nextval FROM dual'; 
    EXECUTE IMMEDIATE 'ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY 1'; 
    DBMS_OUTPUT.put_line('Executed "ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY ' || sequence_id || '"'); 
END; 
/

Các DBMS_OUTPUT cho sau đầu ra -
Executed "ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY 71"

Bất cứ điều gì mà tôi đang bỏ lỡ? Tôi đang làm sai cách? NOte: Tôi đã thử thực hiện các SQL này từ SQLDeveloper.

Trả lời

8

Vì vậy, tôi đã tìm thấy sự cố. Sau nên là PL/SQL -

SET SERVEROUTPUT ON SIZE 1000000 
DECLARE 
    sequence_id NUMBER; 
    temp_seq NUMBER; 
BEGIN 
    SELECT NVL(MAX(idArtifactType), 0) + 1 INTO sequence_id FROM ArtifactTypes; 
    EXECUTE IMMEDIATE 'ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY ' || sequence_id; 
    SELECT ArtifactTypes_id_seq.nextval into temp_seq FROM dual; 
    EXECUTE IMMEDIATE 'ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY 1'; 
    DBMS_OUTPUT.put_line('Executed "ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY ' || sequence_id || '"'); 
END; 
/

sau tuyên bố -
EXECUTE IMMEDIATE 'SELECT ArtifactTypes_id_seq.nextval FROM dual';
đã được đổi thành
SELECT ArtifactTypes_id_seq.nextval into temp_seq FROM dual;

VÀ LÀM VIỆC IT !!

5

Bạn cần phải thả tự và sau đó tái tạo nó, sử dụng bắt đầu với khoản để gán giá trị ban đầu, ví dụ:

CREATE SEQUENCE saas.ArtifactTypes_id_seq 
    START WITH 72; 

Ngoài ra, việc lựa chọn NEXTVAL từ một chuỗi tự động increments nó bằng 1 .