13 Creación de Secuencias

Anuncio
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
Documentos relacionados
Descargar