Capítulo 13 – Creación de Secuencias Bases de Datos Generalidades Un generador de secuencia puede ser utilizado para que automáticamente se genere una secuencia de números para filas de una tabla. Una secuencia es un objeto de la base de datos creado por un usuario y puede ser compartido por varios usuarios. Un uso típico de las secuencias es para crear un valor de primary key, el mismo debe ser único para cada fila. La secuencia es generada e incrementada (o decrementada) por una rutina interna de Oracle7. Este tipo de objetos permite ahorrar tiempo, porque reduce la cantidad de código de la aplicación necesario para escribir una rutina que genere la secuencia. Los números de una secuencia se almacenan y generan independientemente de las tablas. De esta manera, la misma secuencia puede ser usada por varias tablas. Creación de una Secuencia Definir una secuencia para generar números secuenciales automáticamente usando el comando CREATE SEQUENCE. Sintaxis Abreviada CREATE SEQUENCE nombre_secuencia [INCREMENT BY n ] [START WITH n ] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] [CYCLE | NOCYCLE ] [CACHE n | NOCACHE]; Donde: nombre_secuencia INCREMENT BY n es el nombre del generador de secuencia. especifica el intervalo entre los números de la secuencia, donde n es un entero. Si la cláusula es omitida, la secuencia se incrementará de a 1. START WITH n especifica el primer número que se genera para la secuencia. Si se omite esta cláusula, la secuencia comenzará con 1. MAXVALUE n especifica el valor máximo que la secuencia puede generar. NOMAXVALUE especifica un valor máximo de 1027. Esta es la opción por defecto. MINVALUE n especifica el valor mínimo que la secuencia puede generar. NOMINVALUE especifica un valor mínimo de 1. Esta es la opción por defecto. CYCLE | NOCYCLE especifica que la secuencia continúa generando valores después de haber alcanzado su valor máximo o su valor mínimo, o bien genera valores adicionales. La opción por defecto es NOCYCLE. CACHE n | NOCACHE especifica cuántos valores serán preasignados y mantenidos en memoria por el Servidor Oracle7. Por defecto, esa cantidad será igual a 20. Notas Si el valor INCREMENT BY es negativo, la secuencia descenderá. Adicionalmente, NOMAXVALUE entonces especifica un valor máximo de –1 y NOMINVALUE tiene un valor mínimo de –(1026). Si los valores de la secuencia se mantienen en memoria principal (en la cache), se perderán ante una falla o caída de sistema. No se deberá usar la opción CYCLE si la secuencia es usada para generar los valores de primary key. 13 - 1 Capítulo 13 – Creación de Secuencias Bases de Datos Ejemplo Crear una secuencia con el nombre S_DEPT_ID para ser usada por la columna DEPT_ID de la tabla S_DEPT. Comenzar la secuencia con el valor 51. No mantener valores en memoria y no permitir que la secuencia cicle. SQL> 2 3 4 5 6 CREATE SEQUENCE INCREMENT BY START WITH MAXVALUE NOCACHE NOCYCLE; s_dept_id 1 51 9999999 Secuencia creada. Confirmación de Secuencias Una vez que se ha creado la secuencia, la misma es documentada en el diccionario de datos. Como una secuencia es un objeto de la base de datos, puede ser identificada en la tabla USER_OBJECTS del diccionario de datos. También pueden confirmarse los parámetros de la secuencia seleccionándolos de la tabla USER_SEQUENCES del diccionario de datos. Ejemplo Mostrar la información acerca de todas las secuencias de las que es propietario SQL> SELECT 2 3 FROM sequence_name, min_value, max_value, increment_by, last_number user_sequences; SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER ------------------------------ --------- --------- ------------ ----------S_CUSTOMER_ID 1 9999999 1 219 S_DEPT_ID 1 9999999 1 59 S_EMP_ID 1 9999999 1 33 S_IMAGE_ID 1 9999999 1 1982 S_LONGTEXT_ID 1 9999999 1 1369 S_ORD_ID 1 9999999 1 113 S_PRODUCT_ID 1 9999999 1 50537 S_REGION_ID 1 9999999 1 6 S_WAREHOUSE_ID 1 9999999 1 10502 9 filas seleccionadas. Notas La columna LAST_NUMBER muestra el próximo número disponible de la secuencia. Uso de Secuencias Una vez creada una secuencia, se la puede usar para generar números secuenciales que se utilizarán en las tablas. Hacer referencia a los valores de la secuencia usando las pseudocolumnas NEXTVAL y CURRVAL. Pseudocolumnas NEXTVAL y CURRVAL La pseudocolumna NEXTVAL es usada para obtener eficientemente el próximo número de una secuencia específica. Se debe cualificar NEXTVAL con el nombre de la secuencia. Cuando se referencia secuencia.NEXTVAL, un nuevo número de secuencia es generado y el número actual es puesto en CURRVAL. La pseudocolumna CURRVAL es usada para nacer referencia al número de secuencia recientemente generado. NEXTVAL debe ser usado para generar un número de secuencia en la sesión actual del usuario antes de poder hacer referencia a CURRVAL. Se debe cualificar a CURRVAL con el nombre de la secuencia. Cuando se referencia a secuencia.CURRVAL, se obtiene el último valor devuelto al proceso del usuario. 13 - 2 Capítulo 13 – Creación de Secuencias Bases de Datos Reglas para el uso de NEXTVAL y CURRVAL Se puede usar las pseudocolumnas NEXTVAL y CURRVAL en La lista SELECT de una sentencia SELECT que no es parte de una subconsulta. La lista SELECT de una subconsulta en una sentencia INSERT. A cláusula VALUES de una sentencia INSERT. La cláusula SET de una sentencia UPDATE. No se puede usar las pseudocolumnas NEXTVAL y CURRVAL en Una lista SELECT de una vista. Una sentencia SELECT con la palabra DISTINCT. Una sentencia SELECT con las cláusulas GROUP BY, HAVING u ORDER BY. Una subconsulta en una sentencia SELECT, DELETE o UPDATE. Una expresiónDEFAULT en un comando CREATE TABLE o ALTER TABLE. Mantener Valores de Secuencia en Memoria Principal (Cache) Esto permite un acceso más rápido a esos valores. La cache es cargada a la primer referencia que se hace a la secuencia. Cada requerimiento por el próximo valor de la secuencia, es recuperado de la secuencia de la cache. Después que el último valor de la secuencia es usado, el próximo requerimiento de valores de secuencia, coloca otras secuencias de valores en la memoria cache. Cuidarse de las brechas en las Secuencias Aunque un generador de secuencias emite números secuenciales sin brechas (o rangos que discontinúen esa secuencia), esta acción ocurre independientemente de un COMMIT o ROLLBACK. Por lo tanto, si se hace un rollback sobre un comando que contiene una secuencia, el número se pierde. Otro evento que puede causar brechas en la secuencia es una caída del sistema. Si la secuencia mantiene valores en memoria principal, entonces los mismos se pierden ante una caída del sistema. Como las secuencias no están directamente ligadas a las tablas, la misma secuencia puede usarse para muchas de ellas. Si esto ocurre, cada tabla puede contener una brecha en los números secuenciales. Ver el Próximo Valor Disponible de la Secuencia sin Incrementarlo Esto es posible, solamente si la secuencia fue creada con NOCACHE, consultando la tabla USER_SEQUENCES. Las secuencias usadas con más frecuencia deben crearse con la opción que las mantiene en la cache, para hacer su uso más eficiente. En estos casos, no hay forma de saber cuál serla el próximo valor en la secuencia sin obtenerlo y por ende, usarlo. Se recomienda a los usuarios que se resistan a averiguar el próximo valor en una secuencia, que confíen en que el sistema le proveerá un valor único cada vez que la secuencia sea usada en una sentencia INSERT. El próximo valor disponible de una secuencia no es una información útil dado que no siempre es válido. Modificar una Secuencia Si se alcanza el límite MAXVALUE para la secuencia, no se asignarán más valoers para la misma y se recibirá un mensaje de error indicando que se ha excedido el valor de MAXVALUE. Para continuar usando la secuencia, se la puede modificar usando el comando ALTER SECUENCE. Sintaxis SQL> ALTER SEQUENCE nombre_secuencia [INCREMENT BY n ] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] [CYCLE | NOCYCLE ] [CACHE n | NOCACHE]; 13 - 3 Capítulo 13 – Creación de Secuencias Bases de Datos Recomendaciones Para poder modificar la secuencia el usuario debe tener el privilegio ALTER. El comando ALTER SEQUENCE solamente alterará a los futuros números de la secuencia. Se realizan algunas validaciones. Por ejemplo, no se puede imponer un valor MAXVALUE menor que el valor actual de la secuencia. La opción START WITH no se puede cambiar usando ALTER SEQUENCE. La secuencia debe ser eliminada y creada nuevamente a fin de comenzar la secuencia con un número diferente. Eliminar una Secuencia Para eliminar una secuencia de la base de datos, usar el comando DROP SEQUENCE. Debe ser el propietario de la secuencia o tener el privilegio DROP ANY SEQUENCE para eliminarla. Sintaxis SQL> DROP SEQUENCE nombre_secuencia; 13 - 4