CREATE SEQUENCE sentencia
La sentencia CREATE SEQUENCE crea una sentencia en el servidor actual.
Invocación para CREATE SEQUENCE
Esta sentencia puede incorporarse en un programa de aplicación o emitirse de forma interactiva. Es una instrucción ejecutable que puede prepararse dinámicamente solo si el comportamiento DYNAMICRULES RUN está en vigor. Para obtener más información, consulte ID de autorización y SQL dinámico.
Autorización para CREATE SEQUENCE
El conjunto de privilegios que se define a continuación debe incluir al menos uno de los siguientes:
- El privilegio CREATEIN en el esquema
- Autorización SYSADM o SYSCTRL
- DBADM del sistema
Autoridad de instalación SYSOPR (cuando el SQLID actual del proceso está configurado como SYSINSTL)
El ID de autorización que se corresponde con el nombre del esquema tiene implícito el privilegio CREATEIN sobre el esquema.
Conjunto de privilegios:
Si la sentencia está incrustada en un programa de aplicación, el conjunto de privilegios son los privilegios que tiene el del propietario del plan o paquete. Si la aplicación está vinculada en un contexto de confianza con la cláusula ROLE AS OBJECT OWNER especificada, un rol es el propietario. De lo contrario, el propietario es un ID de autorización.
Si el estado se prepara dinámicamente, el conjunto de privilegios son los privilegios que posee el ID de autorización SQL del proceso, a menos que el proceso se encuentre dentro de un contexto de confianza y se especifique la cláusula ROLE AS OBJECT OWNER. En ese caso, los privilegios establecidos son los privilegios que posee el rol asociado con el ID de autorización principal del proceso.
Si el tipo de datos de la secuencia es un tipo distinto, el conjunto de privilegios debe incluir el privilegio USAGE en el tipo distinto.
Sintaxis para CREATE SEQUENCE
- 1 La misma cláusula no debe especificarse más de una vez. Se pueden especificar comas separadoras entre los atributos de secuencia cuando se define una secuencia.
tipo de datos:
tipo integrado:
descripción para CREATE SEQUENCE
- nombre-secuencia
- Indica el nombre de la secuencia. El nombre, incluidos los calificadores implícitos o explícitos, no debe identificar una secuencia existente en el servidor actual, incluidos los nombres de secuencia generados por Db2.
El nombre del esquema no debe comenzar por «SYS», a menos que el nombre del esquema sea «SYSADM».
- AS tipo de datos
- Especifica el tipo de datos que se debe utilizar para el valor de secuencia. El tipo de datos puede ser cualquier tipo de datos numéricos exactos (SMALLINT, INTEGER, BIGINT o DECIMAL con una escala de cero), o un tipo distinto definido por el usuario para el que el tipo de origen es un tipo de datos numéricos exactos con una escala de cero. El valor predeterminado, cuando no se especifica AS, es INTEGER. Si se especifica DECIMAL, el valor predeterminado es DECIMAL(5,0).
- START WITH constante-numérica
- Especifica el primer valor de la secuencia. El valor puede ser cualquier valor positivo o negativo que pueda asignarse a la columna a del tipo de datos asociado a la secuencia sin que existan dígitos distintos de cero a la derecha del punto decimal.
Si la cláusula START WITH no se especifica explícitamente con un valor, el valor predeterminado es MINVALUE para las secuencias ascendentes y MAXVALUE para las secuencias descendentes.
Este valor no es necesariamente el valor en el que una secuencia realizaría un ciclo después de alcanzar el valor máximo o mínimo de la secuencia. Se puede utilizar la cláusula START WITH para iniciar una secuencia fuera del rango que se usa para los ciclos. El rango utilizado para los ciclos se define mediante MINVALUE y MAXVALUE.
- INCREMENT BY constante-numérica
- Especifica el intervalo entre valores consecutivos de la secuencia. El valor puede ser cualquier valor positivo o negativo (incluido 0) que pueda asignarse a una columna del tipo de datos asociado a la secuencia sin que existan dígitos distintos de cero a la derecha del punto decimal. El valor predeterminado
es 1.
Si INCREMENTAR POR es positivo, la secuencia asciende. Si INCREMENTAR POR es negativo, la secuencia desciende. Si INCREMENT es 0, la secuencia se trata como una secuencia ascendente.
El valor absoluto de INCREMENT BY puede ser mayor que la diferencia entre MAXVALUE y MINVALUE.
- MINVALUE o NO MINVALUE
- Especifica el valor mínimo en el que una secuencia descendente o bien recorre o deja de generar valores, o bien una secuencia ascendente recorre hasta después de alcanzar el valor máximo. El valor predeterminado es NO MINVALUE.
- MINVALUE constante-numérica
- Especifica el extremo mínimo del rango de valores para la secuencia. El último valor que se genere para un ciclo de una secuencia descendente será igual o mayor que este valor. MINVALUE es el valor al que una secuencia ascendente vuelve a circular después de alcanzar el valor máximo.
El valor puede ser cualquier valor positivo o negativo que pueda asignarse a la columna a del tipo de datos asociado a la secuencia sin que existan dígitos distintos de cero a la derecha del punto decimal. El valor debe ser menor o igual que el valor máximo.
Para los efectos de definir MINVALUE y MAXVALUE con el mismo valor, consulte Definir una secuencia constante.
- NO MINVALUE
- Especifica que el punto final mínimo del rango de valores para la secuencia no se ha especificado explícitamente. En tal caso, el valor predeterminado para MINVALUE se convierte en uno de los siguientes:
- Para una secuencia ascendente, el valor es el valor EMPEZAR CON o 1 si no se especifica EMPEZAR CON.
- Para una secuencia descendente, el valor es el valor mínimo del tipo de datos asociado a la secuencia.
- MAXVALUE o NO MAXVALUE
- Especifica el valor máximo en el que una secuencia ascendente o bien realiza ciclos o deja de generar valores, o bien una secuencia descendente realiza ciclos hasta alcanzar el valor mínimo. El valor predeterminado es NO MAXVALUE.
- MAXVALUE constante-numérica
- Especifica el extremo máximo del rango de valores para la secuencia. El último valor que se genere para un ciclo de una secuencia ascendente será menor o igual que este valor. MAXVALUE es el valor al que llega una secuencia descendente después de alcanzar el valor mínimo.
El valor puede ser cualquier valor positivo o negativo que pueda asignarse a la columna a del tipo de datos asociado a la secuencia sin que existan dígitos distintos de cero a la derecha del punto decimal. El valor debe ser mayor o igual que el valor mínimo.
Para los efectos de definir MAXVALUE y MINVALUE con el mismo valor, consulte Definición de una secuencia constante.
- NO MAXVALUE
- Especifica el punto final máximo del rango de valores para la secuencia que no se ha especificado explícitamente. En tal caso, el valor predeterminado de MAXVALUE pasa a ser uno de los siguientes:
- Para una secuencia ascendente, el valor es el valor máximo del tipo de datos asociado a la secuencia.
- Para una secuencia descendente, el valor es el valor START WITH (empezar con) o -1 (empezar con el valor más alto) si no se especifica START WITH.
Para encontrar el valor máximo posible para un tipo de datos determinado, consulte Límites en Db2 for z/OS.
- CYCLE o NO CYCLE
- Especifica si la secuencia debe continuar generando valores después de alcanzar su valor máximo o mínimo. El límite de la secuencia puede alcanzarse bien con el siguiente valor que caiga exactamente en la condición límite o sobrepasándola. El valor predeterminado es SIN CICLO.
- CYCLE
- Especifica que la secuencia continúe generando valores después de que se haya alcanzado el valor máximo o mínimo. Si se utiliza esta opción, después de que una secuencia ascendente alcance su valor máximo, genera su valor mínimo. Después de que una secuencia descendente alcanza su valor mínimo, genera su valor máximo. Los valores máximo y mínimo para la secuencia definida por las opciones MINVALUE y MAXVALUE determinan el rango que se utiliza para el ciclo.
Cuando CYCLE está en efecto, la secuencia puede generar valores duplicados. Cuando se define una secuencia con CYCLE, cualquier herramienta de conversión de aplicaciones para convertir aplicaciones de otras plataformas de proveedores a Db2 también debe especificar explícitamente los valores MINVALUE, MAXVALUE y START WITH.
- NO CYCLE
- Especifica que la secuencia no puede generar más valores una vez que se ha alcanzado el valor máximo o mínimo de la secuencia. La opción SIN CICLO (predeterminada) puede modificarse a CICLO en cualquier momento durante la vida de la secuencia.
Cuando se genera el siguiente valor de una secuencia, si se supera el valor máximo (para una secuencia ascendente) o el valor mínimo (para una secuencia descendente) del rango lógico de la secuencia y la opción SIN CICLO está activa, se produce un error.
- CACHE o NO CACHE
- Especifica si se deben mantener o no algunos valores preasignados en la memoria para un acceso más rápido. Esta opción se utiliza para el rendimiento y el ajuste.
- CACHE constante entera
- Especifica el número máximo de valores de la secuencia que Db2 puede preasignar y mantener en memoria. La preasignación de valores en la caché reduce la E/S sincrónica cuando se generan valores para la secuencia. El número real de valores que Db2 almacena en caché es siempre el menor entre el número en vigor para la opción CACHE y el número de valores restantes dentro del rango lógico. Por lo tanto, el valor CACHE es esencialmente un límite superior para el tamaño de la caché.
El valor mínimo es 2. El valor predeterminado es CACHE 20.
En un entorno sin intercambio de datos, si el sistema se apaga (ya sea de forma normal o por un fallo del sistema), se pierden todos los valores de secuencia almacenados en caché que no se hayan utilizado en sentencias confirmadas (es decir, nunca se utilizarán). El valor especificado para la opción CACHE es el número máximo de valores de secuencia que podrían perderse al apagar el sistema.
En un entorno de intercambio de datos, puede utilizar las opciones CACHE y NO ORDER para permitir que varios miembros de Db2 almacenen en caché valores de secuencia simultáneamente.
- NO CACHE
- Especifica que los valores de la secuencia no se deben preasignar. Esta opción garantiza que no se produzca una pérdida de valores en caso de fallo del sistema. Cuando NO se especifica CACHE, los valores de la secuencia no se almacenan en la caché. En este caso, cada petición de un valor nuevo para la secuencia produce E/S síncrona en las anotaciones cronológicas.
- ORDER o NO ORDER
- Especifica si los números de secuencia deben generarse según el orden de petición. El valor predeterminado es SIN PEDIDO.
- ORDER
- Especifica que los números de secuencia se generan según el orden de petición.
En un entorno en el que no se comparten datos, no hay garantía de que los valores se asignen en orden en todo el servidor a menos que también se especifique NO CACHE. La ORDEN sólo se aplica a un proceso de solicitud única.
En un entorno de compartición de datos, si se especifica ORDER, se establece implícitamente NO CACHE, incluso si se especifica CACHE integer-constant.
- NO ORDER
- Especifica que los números de secuencia no necesitan generarse según el orden de petición.
En un entorno de intercambio de datos, si las opciones de constantes enteras NO ORDER y CACHE están activas, pueden estar activos varios cachés simultáneamente, y las solicitudes de asignaciones de valores siguientes de diferentes miembros de la clase Db2 podrían no dar lugar a la asignación de valores en estricto orden numérico. Por ejemplo, si los miembros DB2A y DB2B utilizan la misma secuencia, y DB2A obtiene los valores de caché del 1 al 20 y DB2B obtiene los valores de caché del 21 al 40, el orden real de los valores asignados sería 1, 21, 2 si DB2A solicitara primero el siguiente valor, luego DB2B y, a continuación, DB2A. Por lo tanto, para garantizar que los números de secuencia se generen en estricto orden numérico entre varios miembros de Db2 que utilicen la misma secuencia simultáneamente, especifique la opción ORDER.
Notas para CREATE SEQUENCE
- Privilegios de propietario
- El propietario está autorizado a cambiar (privilegio ALTER) o utilizar (privilegio USAGE) la secuencia y conceder estos privilegios a otros. Ver declaración de GRANT (privilegios de secuencia ). Para obtener más información sobre la propiedad del objeto, consulte Autorización, privilegios, permisos, máscaras y propiedad del objeto.
- Relación entre el valor mínimo y el valor máximo
- El VALOR MÍNIMO no debe ser mayor que el VALOR MÁXIMO. Aunque el MINVALOR suele ser inferior al VALOR MÁXIMO, el MINVALOR puede ser igual al VALOR MÁXIMO. Si EMPEZAR CON tuviera el mismo valor que MÍNIMO y MÁXIMO, la secuencia sería constante. La solicitud del siguiente valor en una secuencia constante parece no tener efecto porque todos los valores que genera la secuencia son, de hecho, el mismo valor.
- Definición de secuencias que se repiten
Cuando se define una secuencia, se puede elegir que esta se repita automáticamente o no cuando se haya alcanzado el valor máximo o mínimo de la secuencia.
- Definir implícita o explícitamente una secuencia SIN CICLO hace que la secuencia no se repita automáticamente después de alcanzar el límite. Sin embargo, puede utilizar la instrucción ALTER SEQUENCE para recorrer la secuencia manualmente. ALTER SEQUENCE le permite reiniciar o ampliar la secuencia, lo que hace que se sigan generando valores de secuencia.
- Definir explícitamente una secuencia con CYCLE hace que la secuencia se repita automáticamente después de alcanzar el límite. Los valores de secuencia continúan generándose después de los ciclos de secuencia.
Cuando se define una secuencia para que se repita automáticamente, el valor máximo o mínimo que se genera para una secuencia podría no ser el valor real de MAXVALUE o MINVALUE que se especifica si el incremento es un valor distinto de 1 o de -1. Por ejemplo, la secuencia definida con START WITH=1, INCREMENT=2, MAXVALUE=10 generará un valor máximo de 9 y no generará el valor 10.
Cuando se define una secuencia con CYCLE, cualquier herramienta de conversión de aplicaciones (para convertir aplicaciones de plataformas de otros proveedores a Db2) también debe especificar explícitamente MINVALUE, MAXVALUE y START WITH.
- Definición de una secuencia constante
Puede definir una secuencia de tal manera que siempre devuelva el mismo valor (o una constante). Para crear una secuencia constante, utilice cualquiera de estas técnicas al definir la secuencia:

- Especifique un valor INCREMENT de cero y un valor START WITH que no exceda MAXVALUE. Utilice esta opción en la mayoría de los casos, y especialmente si la secuencia constante se utiliza a menudo, como en el caso de las cargas de trabajo de transacciones.
- Especifique el mismo valor para START WITH, MINVALUE y MAXVALUE, y especifique CYCLE. Esta opción requiere más actividad de escritura de registro y puede dar lugar a tiempos de espera más largos, especialmente si la secuencia se utiliza con frecuencia.

Una secuencia constante puede utilizarse como variable global numérica. Puede utilizar ALTER SEQUENCE para ajustar los valores que se generan para una secuencia constante.
- Valores consumidos de una secuencia
- Después de que Db2 genere un valor para una secuencia, se puede decir que ese valor se «consume», independientemente de si la aplicación lo utiliza o no. El valor no se reutiliza dentro del ciclo actual. Un valor consumido podría no utilizarse cuando el estado que causó que el valor se generara falla por alguna razón o se revierte después de que el valor fue generado. Los valores generados pero no utilizados pueden constituir lagunas en una secuencia.
- Espacios en una secuencia
Los valores consecutivos de una secuencia difieren en el valor constante INCREMENT BY especificado para la secuencia. Sin embargo, pueden producirse lagunas en los valores que Db2 asigna a un objeto de secuencia.
Las situaciones siguientes son algunos ejemplos de cómo se pueden introducir espacios en los valores de secuencia:
- Una transacción ha avanzado la secuencia y, después, la retrotrae.
- La sentencia SQL que lleva a la generación del siguiente valor falla después de que se haya generado el valor.
- La expresión NEXT VALUE se utiliza en la sentencia SELECT de un cursor en un entorno DRDA donde el cliente utiliza la captación en bloques y no recupera todas las filas captadas por la aplicación.
- La secuencia se modifica y, después, la modificación se retrotrae.
- La secuencia (o una tabla de columna de identidad) se descarta y, después, el descarte se retrotrae.
- El espacio de la tabla SYSIBM.SYSSEQ se detiene o se cierra por cualquier motivo (incluso cuando se alcanza DSMAX)
- El subsistema de Db2 se detiene o se cae
Los valores de esos espacios no estás disponibles para el ciclo actual, a menos que la secuencia se modifique y reinicie de una forma específica para que pasen a estar disponibles.
Una secuencia se incrementa independientemente de una transacción. Por lo tanto, una transacción determinada que aumenta la secuencia el doble podría ver un espacio en los dos números que recibe, si otras transacciones aumentan simultáneamente la misma secuencia. La mayoría de las aplicaciones pueden tolerar estas instancias ya que no son espacios realmente.
- Valores de secuencia duplicados
- Es posible que se generen valores duplicados para una secuencia. Los valores duplicados son más probables cuando una secuencia se define con la opción CICLO, se define como una secuencia constante o se altera. Por ejemplo, las siguientes situaciones podrían causar valores de secuencia duplicados:
- Una secuencia se define con los atributos START WITH=2, INCREMENT BY 2, MINVALUE=2, MAXVALUE=10 y CYCLE.
- La instrucción ALTER SEQUENCE se utiliza para reiniciar la secuencia con un valor que ya se ha generado.
- La instrucción ALTER SEQUENCE se utiliza para invertir la dirección ascendente de una secuencia cambiando el valor INCREMENT BY de positivo a negativo.
- Uso de secuencias
Se puede hacer referencia a una secuencia mediante una referencia de secuencia. Una referencia de secuencia puede aparecer en la mayoría de los lugares en los que puede aparecer una expresión. Una referencia de secuencia puede especificar si el valor que se va a devolver es un valor recién generado o el valor generado anteriormente. Se utiliza una expresión de secuencia NEXT VALUE para generar un nuevo valor. Una expresión de secuencia PREVIOUS VALUE se utiliza para obtener el último valor asignado de una secuencia. Para más información, consulte Referencia de secuencia.
- Sintaxis alternativa y sinónimos
Para proporcionar compatibilidad con versiones anteriores de Db2 u otros productos de la familia Db2 , Db2 admite las siguientes palabras clave:
- NOMINVALUE (palabra clave única) como sinónimo de NO MINVALUE
- NOMAXVALUE (palabra clave única) como sinónimo de NO MAXVALUE
- NOCYCLE (palabra clave única) como sinónimo de NO CYCLE
- NOCACHE (palabra clave única) como sinónimo de NO CACHE
- NOORDER (palabra clave única) como sinónimo de NO ORDER
Ejemplos para CREATE SEQUENCE
- Ejemplo 1
- Cree una secuencia llamada «org_seq» que comience en 1, se incremente en 1, no tenga ciclos y almacene en caché 24 valores a la vez:
INCREMENTO 1, SIN VALOR MÁXIMO y SIN CICLO son valores predeterminados y no es necesario especificarlos.CREATE SEQUENCE ORDER_SEQ START WITH 1 INCREMENT BY 1 NO MAXVALUE NO CYCLE CACHE 24; - Ejemplo 2
- El siguiente ejemplo muestra cómo crear y utilizar una secuencia llamada "order_seq" en una tabla llamada "orders":
o para actualizar los pedidos:CREATE SEQUENCE ORDER_SEQ START WITH 1 INCREMENT BY 1 NO MAXVALUE NO CYCLE CACHE 20; INSERT INTO ORDERS (ORDERNO, CUSTNO) VALUES (NEXT VALUE FOR ORDER_SEQ, 123456);UPDATE ORDERS SET ORDERNO = NEXT VALUE FOR ORDER_SEQ WHERE CUSTNO = 123456; - Ejemplo 3
- El siguiente ejemplo muestra cómo utilizar el mismo número de secuencia como valor de clave único en dos tablas separadas haciendo referencia al número de secuencia con una expresión NEXT VALUE para la primera fila para generar el valor de secuencia y con una expresión PREVIOUS VALUE para las otras filas para referirse al valor de secuencia generado más recientemente.
INSERT INTO ORDERS (ORDERNO, CUSTNO) VALUES (NEXT VALUE FOR ORDER_SEQ, 123456); INSERT INTO LINE_ITEMS (ORDERNO, PARTNO, QUANTITY) VALUES (PREVIOUS VALUE FOR ORDER_SEQ, 987654, 100);
