35 - Secuencias (create sequence - currval - nextval - drop sequence)


Hemos aprendido que existen varios objetos de base de datos, hasta ahora hemos visto TABLAS y algunas FUNCIONES predefinidas. Otro objeto de base de datos es la secuencia.

Una secuencia (sequence) se emplea para generar valores enteros secuenciales únicos y asignárselos a campos numéricos; se utilizan generalmente para las claves primarias de las tablas garantizando que sus valores no se repitan.

Una secuencia es una tabla con un campo numérico en el cual se almacena un valor y cada vez que se consulta, se incrementa tal valor para la próxima consulta.

Sintaxis general:

 create sequence NOMBRESECUENCIA
  start with VALORENTERO
  increment by VALORENTERO
  maxvalue VALORENTERO
  minvalue VALORENTERO
  cycle | nocycle;

- La cláusula "start with" indica el valor desde el cual comenzará la generación de números secuenciales. Si no se especifica, se inicia con el valor que indique "minvalue".

- La cláusula "increment by" especifica el incremento, es decir, la diferencia entre los números de la secuencia; debe ser un valor numérico entero positivo o negativo diferente de 0. Si no se indica, por defecto es 1.

- "maxvalue" define el valor máximo para la secuencia. Si se omite, por defecto es 99999999999999999999999999.

- "minvalue" establece el valor mínimo de la secuencia. Si se omite será 1.

- La cláusula "cycle" indica que, cuando la secuencia llegue a máximo valor (valor de "maxvalue") se reinicie, comenzando con el mínimo valor ("minvalue") nuevamente, es decir, la secuencia vuelve a utilizar los números. Si se omite, por defecto la secuencia se crea "nocycle".

Si no se especifica ninguna cláusula, excepto el nombre de la secuencia, por defecto, comenzará en 1, se incrementará en 1, el mínimo valor será 1, el máximo será 999999999999999999999999999 y "nocycle".

En el siguiente ejemplo creamos una secuencia llamada "sec_codigolibros", estableciendo que comience en 1, sus valores estén entre 1 y 99999 y se incrementen en 1, por defecto, será "nocycle":

 create sequence sec_codigolibros
  start with 1
  increment by 1
  maxvalue 99999
  minvalue 1;

Si bien, las secuencias son independientes de las tablas, se utilizarán generalmente para una tabla específica, por lo tanto, es conveniente darle un nombre que referencie a la misma.

Otro ejemplo:

 create sequence sec_numerosocios
  increment by 5
  cycle;

La secuencia anterior, "sec_numerosocios", incrementa sus valores en 5 y al llegar al máximo valor recomenzará la secuencia desde el valor mínimo; no se especifican las otras cláusulas, por lo tanto, por defecto, el valor mínimo es 1, el máximo 999999999999999999999999999 y el valor inicial es 1.

Dijimos que las secuencias son tablas; por lo tanto se accede a ellas mediante consultas, empleando "select". La diferencia es que utilizamos pseudocolumnas para recuperar el valor actual y el siguiente de la secuencia. Estas pseudocolumnas pueden incluirse en el "from" de una consulta a otra tabla o de la tabla "dual".

Para recuperar los valores de una secuencia empleamos las pseudocolumnas "currval" y "nextval".

Primero debe inicializarse la secuencia con "nextval". La primera vez que se referencia "nextval" retorna el valor de inicio de la secuencia; las siguientes veces, incrementa la secuencia y nos retorna el nuevo valor:

NOMBRESECUENCIA.NEXTVAL;

se coloca el nombre de la secuencia seguido de un punto y la pseudocolumna "nextval" (que es una forma abreviada de "next value", siguiente valor).

Para recuperar el valor actual de una secuencia usamos:

 NOMBRESECUENCIA.CURRVAL;

es decir, el nombre de la secuencia, un punto y la pseudocolumna "currval" (que es una forma abreviada de "current value", valor actual).

Los valores retornados por "currval" y "nextval" pueden usarse en sentencias "insert" y "update".

Veamos un ejemplo completo:

Creamos una secuencia para el código de la tabla "libros", especificando el valor máximo, el incremento y que no sea circular:

 create sequence sec_codigolibros
  maxvalue 999999
  increment by 1
  nocycle;

Luego inicializamos la secuencia

 select sec_codigolibros.nextval from dual;

Recuerde que la primera vez que se referencie la secuencia debe emplearse "nextval" para inicializarla.

Ingresamos un registro en "libros", almacenando en el campo "codigo" el valor actual de la secuencia:

 insert into libros values
  (sec_codigolibros.currval,'El aleph', 'Borges','Emece');

Ingresamos otro registro en "libros", almacenando en el campo "codigo" el valor siguiente de la secuencia:

 insert into libros values
  (sec_codigolibros.nextval,'Matematica estas ahi', 'Paenza','Nuevo siglo');

Para ver todas las secuencias de la base de datos actual realizamos la siguiente consulta:

 select *from all_sequences;

Nos muestra el propietario de la secuencia, el nombre de la misma, los valores mínimo y máximo, el valor de incremento y si es circular o no, entre otros datos que no analizaremos por el momento.

También podemos ver todos los objetos de la base de datos actual tipeando;

 select *from all_objects;

En la tabla resultado aparecen todos los objetos de la base de datos, incluidas las secuencias; si es una secuencia en la columna OBJECT_TYPE se muestra "SEQUENCE".

Podemos consultar "all_objects" especificando que nos muestre el nombre de todas las secuencias:

 select object_name from all_objects
  where object_type='SEQUENCE';

Para eliminar una secuencia empleamos "drop sequence". Sintaxis:

 drop sequence NOMBRESECUENCIA;

Si la secuencia no existe aparecerá un mensaje indicando tal situación.

En el siguiente ejemplo se elimina la secuencia "sec_codigolibros":

 drop sequence sec_codigolibros;


Retornar