2012-07-26 11 views
7

Sto utilizzando liquibase per gestire il mio schema. Ho un sacco di istruzioni per l'inserimento. Ho hard codificato i numeri di identificazione principale. Dopo aver eseguito tutti i miei inserimenti, voglio cambiare il valore della sequenza a 1 più del valore massimo della chiave primaria nella tabella. Per questo ho scritto un PL/SQL come indicato di seguito. Tuttavia, quando eseguo select ArtifactTypes_id_seq.nextval from dual; incrementa ancora 0.Oracle: impostazione della sequenza su un valore specifico

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

Il DBMS_OUTPUT dà seguente output -
Executed "ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY 71"

Tutto ciò che mi manca fuori? Sto facendo nel modo sbagliato? NOte: ho provato a eseguire questi SQL da SQLDeveloper.

risposta

8

Quindi ho trovato il problema. In seguito dovrebbe essere il 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; 
/

seguito comunicato -
EXECUTE IMMEDIATE 'SELECT ArtifactTypes_id_seq.nextval FROM dual';
è stato cambiato a
SELECT ArtifactTypes_id_seq.nextval into temp_seq FROM dual;

e ha funzionato !!

5

devi cadere la sequenza e quindi ricreare, utilizzare i Iniziando con clausola per assegnare il valore iniziale, ad esempio:

CREATE SEQUENCE saas.ArtifactTypes_id_seq 
    START WITH 72; 

Inoltre, selezionando il NEXTVAL da una sequenza incrementa automaticamente da 1

Problemi correlati