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
Publicar un comentario