2012-07-26 21 views
7

Estoy usando liquibase para administrar mi esquema. Tengo un montón de instrucciones de inserción. He codificado los números de identificación primaria. Después de hacer todas las inserciones, quiero cambiar el valor de la secuencia a 1 más que el valor máximo de la clave primaria en la tabla. Para esto, escribí un PL/SQL como se indica a continuación. Sin embargo, cuando ejecuto select ArtifactTypes_id_seq.nextval from dual; todavía incrementa 0.Oracle: configuración de la secuencia a un valor específico

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

El DBMS_OUTPUT da siguiente salida -
Executed "ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY 71"

Todo lo que me estoy perdiendo? ¿Estoy haciendo lo incorrecto? NOte: Intenté ejecutar estos SQL desde SQLDeveloper.

Respuesta

8

Así que encontré el problema. Lo que sigue debe ser el 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; 
/

Tras la declaración -
EXECUTE IMMEDIATE 'SELECT ArtifactTypes_id_seq.nextval FROM dual';
fue cambiado a
SELECT ArtifactTypes_id_seq.nextval into temp_seq FROM dual;

y funcionó !!

5

deba caer la secuencia y luego volver a crearlo, utilice los comienza con cláusula para asignar el valor inicial, por ejemplo:

CREATE SEQUENCE saas.ArtifactTypes_id_seq 
    START WITH 72; 

Además, la selección de la NEXTVAL partir de una secuencia incrementa automáticamente por 1

Cuestiones relacionadas