Ir al contenido principal

Utilizando Secuencias

Para utilizar una secuencia, una sesión puede seleccionar el siguiente valor de la columna con NEXTVAL, lo que obliga a la secuencia a incrementar, o el último valor emitido a la sesión con la pseudo columna CURRVAL. El NEXTVAL será único a nivel global: cada sesión que selecciona conseguirá un incremento, un valor para cada SELECT. El CURRVAL será constante durante una sesión hasta que se selecciona NEXTVAL de nuevo. No hay manera de saber cuál es el último valor publicado por una secuencia: siempre se puede obtener el siguiente valor incrementando con NEXTVAL, y siempre se puede recuperar el último valor emitido a su sesión con CURRVAL, pero no se puede encontrar el último valor emitido.
El CURRVAL de una secuencia es el último valor publicado para la sesión actual, no necesariamente el último valor publicado. No se puede seleccionar el CURRVAL hasta después de seleccionar el NEXTVAL.
Un uso típico de secuencias es para valores de clave primaria. En este ejemplo se utiliza una secuencia order_seq para generar números de referencia únicos y LINE_SEQ para generar números de líneas únicas para los elementos de línea de la orden. En primer lugar crear las secuencias, que es una operación excepcional:

create sequence order_seq start with 10;
create sequence line_seq start with 10;

insert into orders (order_number,order_date,customer_number)
values (order_seq.nextval,sysdate,'1000');
insert into order_lines (order_number,line_number,item_number,quantity)
values (order_seq.currval,line_seq.nextval,'A111',1);
insert into order_lines (order_number,line_number,item_number,quantity)
values (order_seq.currval,line_seq.nextval,'B111',1);
commit;

La primera instrucción INSERT genera un pedido con un número de referencia único extraído de la secuencia order_seq  para el cliente 1000. La segunda y tercera instrucciones INSERT, utilizando el número de pedido emitido previamente order_seq como clave externa para conectar las líneas de la orden, y los siguientes valores de LINE_SEQ para generar un identificador único para cada línea. Por último, se confirma la transacción.
Una secuencia no está ligado a ninguna tabla. En el ejemplo anterior, no habría ninguna razón técnica para no utilizar una secuencia para generar valores para las claves primarias de la orden y de las líneas.
Un COMMIT no es necesario para hacer que el incremento de una secuencia permanente, es permanente y hecho visible para el resto del mundo el momento en que sucede. No se puede hacer Rollback. Por esta razón, siempre habrá lagunas en la serie. Las diferencias serán mayores si la base de datos se ha reiniciado y se ha utilizado la cláusula CACHE. Todos los números que se han generado y almacenado en caché y pendientes de emisión se perderán cuando la base de datos se cierra. En el siguiente reinicio, el valor actual de la secuencia será el último número generado, no será la última emisión. Así, con la caché por defecto de 20, cada inicio de apagado / perderá hasta 20 números.




Si los analistas de negocios han declarado que no debe haber lagunas en una secuencia, entonces se debe utilizar otro medio de generar números únicos. Para el ejemplo anterior de levantar pedidos, el número de pedido actual podría ser almacenada en esta tabla y se inicializa a 10:

create table current_on(order_number number);
insert into current_on values(10);
commit;

update current_on set order_number=order_number + 1;
insert into orders (order_number,order_date,customer_number)
values ((select order_number from current_on),sysdate,'1000');
commit;


Modificar una Secuencia

ALTER SEQUENCE sequencename
[INCREMENT BY number]
[START WITH number]
[MAXVALUE number | NOMAXVALUE]
[MINVALUE number | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE number | NOCACHE]
[ORDER | NOORDER] ;



Este comando ALTER es el mismo que el comando CREATE, con una excepción: no hay manera de establecer el valor inicial. Si desea reiniciar la secuencia, la única manera es caer y volver a crearlo.

alter sequence order_seq cache 1000;

drop sequence order_seq;


Comentarios