Creación de Sequence en tabla Oracle

Vamos a revisar cuáles serían los comandos que se deben utilizar para crear un objeto Sequence asociado a una determinada tabla Oracle de nuestra Base de Datos. Particularizamos con Oracle porque es una de las más utilizadas, pero en realidad el proceso sería aplicable a muchos otros tipos de BBDD. Por ejemplo, para DB2 las instrucciones serían casi idénticas. 



Creación de Sequence en tabla Oracle


Un objeto Sequence sirve para generar números secuenciales enteros. Dichos valores se pueden asignar a un determinado campo de una tabla Oracle, de manera que la BBDD empleará el número generado como valor de dicho campo. Cada vez que se genere un número nuevo, el Sequence le añadirá un incremento determinado al último número generado con anterioridad, de manera que poco a poco se irá creando una secuencia de valores no repetidos. Esta cualidad nos permitirá usar un Sequence para ir generando valores en un campo clave de una tabla Oracle, evitando así el problema de la repetición de códigos en claves únicas.


Para visualizar cómo sería la creación de un Sequence, vamos a imaginarnos que partimos de una tabla de Poblaciones que se compone de los siguientes campos:

  • Identificador de Población
  • Código de Población  
  • Nombre de Población
  • Provincia asociada
  • País asociado


En concreto, el campo "Identificador de Población" es una clave numérica única que no puede repetirse de una población a otra y que nos servirá para identificar unívocamente cualquier registro de la tabla. Por tanto, aquí es donde entra en juego el Sequence. Básicamente, necesitamos un Sequence que vaya generando códigos secuenciales no repetidos. De esta forma, cada vez que insertemos un nuevo registro en la tabla, le pediremos un nuevo código al Sequence y le asignaremos dicho valor al campo "Identificador de Población". 


Para generar este Sequence la instrucción sería la siguiente:


CREATE SEQUENCE  "MDR_DBA1"."MDR_CPO_SEQ"  
 MINVALUE 1
 MAXVALUE 999999999999999
 INCREMENT BY 1
 START WITH 32540
 CACHE 5
 NOORDER  
 NOCYCLE  
 NOKEEP  
 NOSCALE  
 GLOBAL
;


En este ejemplo nos estaríamos creando un Sequence denominado "MDR_CPO_SEQ" en el esquema llamado "MDR_DBA1". Las características que hemos definido serían las sigientes:

* MINVALUE: Valor mínimo de la secuencia de números.

* MAXVALUE: Valor máximo de la secuencia.

* INCREMENT BY: Cantidad a incrementar entre dos valores generados de la secuencia.

* START WITH: Valor de inicio de la secuencia.

* CACHE: Indica la cantidad de valores de la secuencia que tenemos pregenerados (esto permite un acceso más rápido cuando se requiere un nuevo valor de la secuencia).

* NOORDER: Este comando especifica que no se precisa garantizar que los números secuenciales sean generados en orden de petición. 

* NOCYCLE: Especifica que la secuencia no se resetea al alcanzar el valor máximo permitido (la secuencia no podrá generar nuevos valores). Esta característica es la que permitirá que los valores de una determinada secuencia no se puedan repetir nunca.

* NOKEEP: Especifica que no hay necesidad de retener el valor generado por la secuencia en el caso de que se produzcan errores recuperables en la aplicación.

* NOSCALE: Deshabilita la escalabilidad de la secuencia.

* GLOBAL: Crea una secuencia de tipo Global.


Inserción de Sequence en tabla Oracle


Una vez tenemos creado el Sequence, a continuación tendremos que utilizar la secuencia generada para crear un nuevo registro en la tabla Oracle. Para ello, podemos usar las dos intrucciones siguientes:

* NEXTVAL: Genera el siguiente código del Sequence, según las características que hemos definido en el momento de su creación.

* CURRVAL: Muestra el último código generado por el Sequence. Para que este comando funcione, es preciso que, en la misma transacción, previamente se haya ejecutado el comando NEXTVAL.


Por ejemplo, supongamos que tenemos la tabla de Poblaciones de más arriba con los siguientes registros ya incorporados:


En este escenario, si quisiéramos incoporar un nuevo registro con su nuevo secuencial no repetido, la instrucción de inserción debería ser del siguiente modo:


INSERT INTO MDR_CAT_POBLACIONES
(CPO_ID, CPO_CODIGO, CPO_NOMBRE, CPO_CPA_ID, CPO_CPV_ID)
VALUES
(MDR_CPO_SEQ.NEXTVAL, 11, 'CADIZ-PROVINCIA', 72, 12)
;


Una vez ejecutada la instrucción, el comando MDR_CPO_SEQ.NEXTVAL debería generar el siguiente código secuencial (el número 11, en este caso) y con ello se podría realizar la inserción del registro completo en la tabla Oracle. Ahora la BBDD debería quedar del siguiente modo:


En principio, con todo lo indicado ya no deberíamos tener problemas a la hora de trabajar con un Sequence que tenga una estructura básica. Obviamente, el escenario se puede complicar algo más, pero la realidad es que la mayoría de las tablas que nos encontremos tendrán una definición similar a la revisada en el post. En cualquier caso, si os surge cualquier duda al respecto, no tengáis problema en dejármela aquí abajo...


Un saludo.


Comentarios

Entradas populares de este blog

Componentes y Ventanas de Java Swing

Creación de Webservice SOAP básico

Fichero standalone del Servidor JBoss EAP