A pues resulta que no hay una manera directa de colocarle el siguiente valor a una secuencia, y esto se puede conseguir de dos maneras (las que conozco):
- Drop Sequence: Simplemente hacer drop al objecto de base de datos y colocar en la construción del objeto la sentencia "start with " y el numero en el que les soliciten iniciar:
drop sequence my_seq;
create sequence my_seq
start with 1234
nocache
order;
/
- Manera comoda, buscando por ahí se encontraran con que no existe un comando alter sequence nextval, pero hay una manera de hacerlo por medio de jugar con lo que nos brinda Oracle: ALTER SEQUENCE MINVAL, ALTER SEQUENCE INCREMENT BY.
EL siguiente procedimiento de pl se encarga de realizar el truco mas cómodamente :
CREATE OR REPLACE PROCEDURE XXX_RESET_SEQUENCE (
PS_SEQ_NAME IN VARCHAR2, P_STARTVALUE IN NUMBER) AS
LN_VAL NUMBER (30);
MIN_VAL NUMBER (30);
LS_BUFF VARCHAR2(25);
LS_CYCLE_FLAG VARCHAR2(25);
BEGIN
SELECT CYCLE_FLAG
INTO LS_CYCLE_FLAG FROM USER_SEQUENCES
WHERE SEQUENCE_NAME =PS_SEQ_NAME;
EXECUTE IMMEDIATE 'SELECT ' PS_SEQ_NAME '.NEXTVAL FROM dual'INTO LN_VAL;
LN_VAL := -1*(LN_VAL - P_STARTVALUE 1);
EXECUTE IMMEDIATE 'ALTER SEQUENCE ' PS_SEQ_NAME' MINVALUE 0';
LS_BUFF := ' INCREMENT BY ';
EXECUTE IMMEDIATE 'ALTER SEQUENCE ' PS_SEQ_NAME LS_BUFF LN_VAL;
EXECUTE IMMEDIATE 'SELECT ' PS_SEQ_NAME '.NEXTVAL FROM dual'
INTO LN_VAL;
EXECUTE IMMEDIATE 'ALTER SEQUENCE ' PS_SEQ_NAME ' INCREMENT BY 1';
END XXX_RESET_SEQUENCE;
/
Y de la siguiente manera se cambiaria el valor de la secuencia;
BEGIN
XXX_RESET_SEQUENCE('MY_SEQ',2);
END;
/
Ventajas y Desventajas
Drop:
Ventaja puede iniciar desde 0(cero), es directo.
Desventaja, al hacer drop del objeto se invalidan todas las dependencias de este.
Procedimiento:
Desventaja: No me permitió iniciar en 0(cero) el valor más bajo al que llego es 1.
Ventaja: No requiere recompilación de dependencias.
Espero que les sea útil.
No hay comentarios:
Publicar un comentario