secuencias procedimiento ejemplos ejecutar developer campo autoincremental auto_increment almacenado 12c plsql oracle11g

plsql - procedimiento - Oracle: configuración de la secuencia a un valor específico



pl sql oracle (2)

Esta pregunta ya tiene una respuesta aquí:

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; aún incrementa 0.

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 el siguiente resultado:
Executed "ALTER SEQUENCE saas.ArtifactTypes_id_seq INCREMENT BY 71"

¿Algo que me estoy perdiendo? ¿Estoy haciendo lo incorrecto? NO: Probé a ejecutar estos SQL desde SQLDeveloper.


Debe soltar la secuencia y luego volver a crearla, use la cláusula STARTS WITH para asignar el valor inicial, por ejemplo:

CREATE SEQUENCE saas.ArtifactTypes_id_seq START WITH 72;

Además, al seleccionar NEXTVAL de una secuencia, se incrementa automáticamente en 1.


Entonces encontré el problema. Lo siguiente 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; /

La siguiente oració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Ó!!