jueves, 3 de marzo de 2011

ALTER SEQUENCE NEXTVAL ?

Algunas veces cuando realice un proceso que servía para generar la generación de un archivo me solicitaron que le colocara un numero como folio al archivo. Y esto fue muy sencillo solo me base en una secuencia de Oracle. Todo funciono muy bien hasta que llego el momento en el que me dijeron "Necesitamos regenerar la secuencia por que lanzamos muchos archivos mal y no podemos gastar esos folios así por que si".





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