2012-07-26 16 views
7

Używam liquibase do zarządzania moim schematem. Mam kilka instrukcji wstawiania. Ciężko zakodowałem numery podstawowych identyfikatorów. Po zakończeniu wszystkich wstawień chcę zmienić wartość sekwencji na 1 więcej niż maksymalna wartość klucza podstawowego w tabeli. W tym celu napisałem PL/SQL jak podano poniżej. Jednak, kiedy wykonać select ArtifactTypes_id_seq.nextval from dual; nadal zwiększa 0.Oracle: Ustawianie sekwencji do określonej wartości

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; 
/

DBMS_OUTPUT daje następujące wyjścia -
Executed "ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY 71"

Wszystko, co mam brakuje? Czy robię złą drogę? NOte: Próbowałem wykonywać te instrukcje SQL z SQLDeveloper.

Odpowiedz

8

Więc znalazłem problem. Po powinny być 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; 
/

następujące oświadczenie -
EXECUTE IMMEDIATE 'SELECT ArtifactTypes_id_seq.nextval FROM dual';
została zmieniona na
SELECT ArtifactTypes_id_seq.nextval into temp_seq FROM dual;

i to zadziałało !!

5

Trzeba upuścić sekwencję, a następnie ponownie go utworzyć, użyj zaczyna się od klauzuli przypisać wartość początkową, np:

CREATE SEQUENCE saas.ArtifactTypes_id_seq 
    START WITH 72; 

Ponadto, wybierając NEXTVAL z sekwencji automatycznie zwiększa się o 1

Powiązane problemy