CREATE SEQUENCE

La sentencia CREATE SEQUENCE crea una secuencia en el servidor de aplicaciones.

Llamada

Esta sentencia puede incorporarse en un programa de aplicación o emitirse de forma interactiva. Se trata de una sentencia ejecutable que puede prepararse de forma dinámica.

Autorización

El ID de autorización de la sentencia debe tener al menos uno de los privilegios siguientes:

El ID de autorización de la sentencia debe tener al menos uno de los privilegios siguientes:

  • Las siguientes autorizaciones de sistema:
    • *USE en el mandato Crear Área de Datos (CRTDTAARA)
  • Autorización de administrador de base de datos

El ID de autorización de la sentencia debe tener al menos uno de los privilegios siguientes:

  • Para la tabla de catálogo SYSSEQOBJECTS:
    • El privilegio INSERT en la tabla, y
    • El privilegio USAGE en el esquema QSYS2
  • Autorización de administrador de base de datos

Si se hace referencia a un tipo diferenciado, los privilegios del ID de autorización de la sentencia deben incluir al menos uno de los siguientes:

  • Para el tipo diferenciado identificado en la sentencia:
    • El privilegio USAGE sobre el tipo distinct, y
    • El privilegio USAGE en el esquema que contiene el tipo diferenciado
  • Autorización de administrador de base de datos

Para sustituir una secuencia existente, los privilegios del ID de autorización de la sentencia deben incluir al menos uno de los siguientes:

  • Las siguientes autorizaciones de sistema:
    • Inicio del cambioLas autoridades del sistema de *OBJOPR, *OBJMGT y *READ en el área de datos asociada a la secuenciaFin del cambio
    • Todas las autorizaciones necesarias para eliminar la secuencia
    • Autorización del sistema *READ sobre la tabla de catálogo SYSSEQOBJECTS
  • Autorización de administrador de base de datos

Para obtener información sobre las autorizaciones del sistema correspondientes a privilegios de SQL, consulte Autoridades del sistema correspondientes al comprobar privilegios en una secuencia y Autoridades del sistema correspondientes al comprobar privilegios en un tipo diferenciado.

Sintaxis

Leer diagrama de sintaxisOmitir diagrama de sintaxis visualCREATEOR REPLACESEQUENCEnombre-secuenciaFOR SYSTEM NAMEidentificador-objeto-sistemaASINTEGERtipo-datosSTART WITHconstante numéricaINCREMENT BY1constante numéricaNO MINVALUEMINVALUEconstante numéricaNO MAXVALUEMAXVALUEconstante numéricaNO CYCLECYCLECACHE20NO CACHECACHEconstante-enteraNO ORDERORDER1
Notas:
  • 1 No se debe especificar la misma cláusula más de una vez.
tipo-datos
Leer diagrama de sintaxisOmitir diagrama de sintaxis visualtipo-incorporadonombre-tipo-diferenciado
tipo-incorporado
Leer diagrama de sintaxisOmitir diagrama de sintaxis visualSMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)(entero,0)

Descripción

OR REPLACE
Especifica que se debe sustituir la definición por la secuencia si existe una en el servidor actual. La definición existente se descarta de forma efectiva antes de que la nueva definición se sustituya en el catálogo con la excepción de que los privilegios que se han otorgado en la secuencia no se ven afectados. No se tiene en cuenta esta opción si no existe una definición para la secuencia en el servidor actual.
nombre-secuencia
Indica el nombre de la secuencia. El nombre, incluido el calificador implícito o explícito, no debe identificar una secuencia o área de datos que ya exista en el servidor actual. Si se especifica un nombre de secuencia calificado, el nombre-esquema no puede ser QSYS2, QSYS o SYSIBM.

Si se han especificado nombres de SQL, la secuencia se creará en el esquema especificado por el calificador implícito o explícito.

Si se han especificado nombres de sistema, la secuencia se creará en el esquema especificado por el calificador. Si no está calificado:

  • Si el valor del registro especial CURRENT SCHEMA es *LIBL, la secuencia se creará en la biblioteca actual (*CURLIB).
  • De lo contrario, la secuencia se creará en el esquema actual.
FOR SYSTEM NAME identificador-objeto-sistema
Identifica el identificador-objeto-sistema de la secuencia. identificador-objeto-sistema no debe ser el mismo que una secuencia o área de datos que ya existe en el servidor actual. El identificador-objeto-sistema debe ser un identificador de sistema no calificado.

Cuando se especifica identificador-objeto-sistema , nombre-secuencia no debe ser un nombre de objeto de sistema válido.

AS tipo-datos
Especifica el tipo de datos que se debe utilizar para el valor de secuencia. El tipo de datos puede ser cualquier tipo numérico exacto (SMALLINT, INTEGER, BIGINT, DECIMAL o NUMERIC) con una escala de cero, o un tipo diferenciado definido por el usuario para el que el tipo de origen es un tipo numérico exacto con una escala de cero. El valor por omisión es INTEGER.
tipo-incorporado
Especifica el tipo de datos incorporado utilizado como base para la representación interna de la secuencia. Si el tipo de datos es DECIMAL o NUMERIC, la precisión debe ser menor o igual que 63 y la escala debe ser 0. Véase CREAR TABLA para una descripción más completa de cada tipo de datos incorporado.

Para la portabilidad de aplicaciones entre plataformas, utilice DECIMAL en lugar de un tipo de datos NUMERIC.

nombre-tipo-diferenciado
Especifica que el tipo de datos de la secuencia es un tipo diferenciado (un tipo de datos definido por el usuario). Si el tipo fuente es DECIMAL o NUMERIC, la precisión de la secuencia es la precisión del tipo fuente del tipo diferenciado. La precisión del tipo de origen debe ser menor o igual que 63 y la escala debe ser 0. Si se especifica un nombre de tipo diferenciado sin un nombre de esquema, el nombre de tipo diferenciado se resuelve buscando los esquemas en la vía de acceso de SQL.
START WITH constante-numérica
Especifica el primer valor que se genera para la secuencia. El valor puede ser cualquier valor positivo o negativo que se pueda asignar a una columna del tipo de datos asociado con la secuencia, sin dígitos distintos de cero a la derecha de la coma decimal.

Si no se especifica explícitamente un valor cuando se define la secuencia, el valor predeterminado es MINVALUE para una secuencia ascendente y MAXVALUE para una secuencia descendente.

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 que se pueda asignar a una columna del tipo de datos asociado a la secuencia, y no supere el valor de una constante entera grande, sin dígitos distintos de cero que existan a la derecha de la coma decimal.

Si el valor es 0 o positivo, se trata de una secuencia ascendente. Si el valor es negativo, se trata de una secuencia descendente. El valor predeterminado es 1.

NO MINVALUE o MINVALUE
Especifica el valor mínimo en el que una secuencia descendente pasa por un ciclo o deja de generar valores o en el que una secuencia ascendente pasa por un ciclo después de alcanzar el valor máximo. El valor predeterminado es NO MINVALUE.
NO MINVALUE
Para una secuencia ascendente, el valor es el valor START WITH o bien 1 si no se ha especificado START WITH. Para una secuencia descendente, el valor es el valor mínimo del tipo de datos (y la precisión, si es DECIMAL o NUMERIC) asociado a la secuencia.
MINVALUE constante-numérica
Especifica la constante numérica que es el valor mínimo. Este valor puede ser cualquier valor positivo o negativo que se pueda asignar a una columna del tipo de datos asociado a la secuencia y sin dígitos distintos de cero a la derecha de la coma decimal. El valor debe ser menor o igual que el valor máximo.
NO MAXVALUE o MAXVALUE
Especifica el valor máximo en el que una secuencia ascendente pasa por un ciclo o deja de generar valores o en el que una secuencia descendente pasa por un ciclo después de alcanzar el valor mínimo. El valor predeterminado es NO MAXVALUE.
NO MAXVALUE
Para una secuencia ascendente, el valor es el valor máximo del tipo de datos (y la precisión, si es DECIMAL o NUMERIC) asociado a la secuencia. Para una secuencia descendente, el valor es el valor START WITH o bien -1 si no se ha especificado START WITH.
MAXVALUE constante-numérica
Especifica la constante numérica que es el valor máximo. Este valor puede ser cualquier valor positivo o negativo que se pueda asignar a una columna del tipo de datos asociado a la secuencia y sin dígitos distintos de cero a la derecha de la coma decimal. El valor debe ser mayor o igual que el valor mínimo.
NO CYCLE o CYCLE
Especifica si esta secuencia debe continuar generando valores una vez que se ha alcanzado el valor máximo o mínimo de la secuencia. El valor predeterminado es NO CYCLE.
NO CYCLE
Especifica que no se generarán valores para la secuencia una vez que se haya alcanzado el valor máximo o mínimo para la secuencia.
CYCLE
Especifica que se continúan generando valores para esta secuencia después de haber alcanzado el valor máximo o mínimo. Si se utiliza esta opción, después de que una secuencia ascendente alcance el valor máximo de la secuencia, genera su valor mínimo. Después de que una secuencia descendente alcance su valor mínimo de la secuencia, genera su valor máximo. Los valores máximo y mínimo de la columna determinan el rango que se utiliza para el ciclo.

Cuando CYCLE está en vigor, se pueden generar valores duplicados para la secuencia.

CACHE o NO CACHE
Especifica si se deben mantener algunos valores preasignados en la memoria. La preasignación y el almacenamiento de valores en la memoria caché mejora el rendimiento de la expresión de secuencia NEXT VALUE. El valor predeterminado es CACHE 20.
CACHE constante-entera
Especifica el número máximo de valores de secuencia que se preasignan y se mantienen en memoria. La preasignación y el almacenamiento de valores en la memoria caché mejora el rendimiento.

En determinadas situaciones, como una anomalía del sistema, se pierden todos los valores de secuencia almacenados en memoria caché que no se han utilizado en las sentencias confirmadas y, por lo tanto, nunca se utilizarán. El valor especificado para la opción CACHE es el número máximo de valores de secuencia que se pueden perder en estas situaciones.

El valor mínimo que se puede especificar es 2.

NO CACHE
Especifica que los valores de la secuencia no están preasignados. Si se especifica NO CACHE, el rendimiento de la expresión de secuencia NEXT VALUE será peor que si se especifica CACHE.
ORDER o NO ORDER
Especifica si los valores de secuencia deben generarse en orden de solicitud. El valor predeterminado es NO ORDER.
NO ORDER
Especifica que los números de secuencia no necesitan generarse según el orden de petición.
ORDER
Especifica que los números de secuencia se generan según el orden de petición. Si se especifica ORDER, el rendimiento de la expresión de secuencia NEXT VALUE será peor que si se especifica NO ORDER.

Notas

Atributos de secuencia: se crea una secuencia como un objeto *DTAARA. Los objetos *DTAARA no deben cambiarse con el área de datos de cambio (*CHGDTAARA) o con cualquier otra interfaz similar porque hacerlo puede provocar anomalías inesperadas o resultados inesperados al intentar utilizar la secuencia SQL a través de SQL.

Propiedad de secuencia: el propietario de la secuencia es el perfil de usuario o perfil de usuario de grupo de la hebra que ejecuta la sentencia.

Autorización de secuencia: si se utilizan nombres SQL, las secuencias se crean con la autorización del sistema *EXCLUDE sobre *PUBLIC. Si se utilizan nombres de sistema, las secuencias se crean con la autorización sobre *PUBLIC tal como determina el parámetro de autorización de creación (CRTAUT) del esquema.

Si el propietario de la secuencia es un miembro de un perfil de grupo (palabra clave GRPPRF) y se especifica la autorización de grupo (palabra clave GRPAUT), ese perfil de grupo también tendrá autorización sobre la secuencia.

Reglas REPLACE: Cuando REPLACE vuelve a crear una secuencia:
  • Se descarta cualquier comentario o etiqueta existente.
  • Se mantienen los usuarios autorizados. El propietario del objeto podría cambiar.
  • Se conserva la auditoría de diario actual.

Relación de MINVALUE y MAXVALUE: normalmente, MINVALUE será menor que MAXVALUE, pero esto no es necesario. MINVALUE podría ser igual a MAXVALUE. Si START WITH era el mismo valor que MINVALUE y MAXVALUE, y CYCLE se especifica implícita o explícitamente, esto sería una secuencia constante. En este caso, una solicitud para el siguiente valor parece no tener ningún efecto porque todos los valores generados por la secuencia son, de hecho, los mismos.

MINVALUE no debe ser mayor que MAXVALUE

Definición de secuencias constantes: es posible definir una secuencia que siempre devuelva un valor constante. Esto puede hacerse especificando un valor cero para INCREMENT y un valor para START WITH que no exceda el valor de MAXVALUE o bien especificando el mismo valor para START WITH, MINVALUE y MAXVALUE. Para una secuencia constante, cada vez que se procesa una expresión NEXT VALUE, se devuelve el mismo valor. Una secuencia constante puede utilizarse como variable global numérica. ALTER SEQUENCE puede utilizarse para ajustar los valores que se generarán para una secuencia constante.

Definición de secuencias de ciclo: una secuencia se puede ciclar manualmente utilizando la sentencia ALTER SEQUENCE. Si se especifica NO CYCLE de forma implícita o explícita, se puede reiniciar o ampliar la secuencia utilizando la sentencia ALTER SEQUENCE para hacer que los valores continúen generándose una vez que se haya alcanzado el valor máximo o mínimo para la secuencia.

Una secuencia puede definirse explícitamente para que ejecute un ciclo especificando la palabra clave CYCLE. Al definir una secuencia, utilice la opción CYCLE para indicar que los valores generados deben ejecutar un ciclo cuando se haya alcanzado el límite. Cuando una secuencia está definida para ciclar automáticamente (por ejemplo se especificó explícitamente CICLO), entonces el valor máximo o mínimo generado para una secuencia puede no ser el MAXVALOR o MINVALOR real especificado, si el incremento es un valor distinto de 1 o -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.

Al definir una secuencia con CYCLE, las herramientas de conversión de aplicaciones (para convertir aplicaciones de otras plataformas de proveedor a Db2®) también deben especificar explícitamente MINVALUE, MAXVALUE y START WITH.

Colocación en memoria caché de números de secuencia: Se puede mantener un rango de números de secuencia en la memoria para un acceso rápido. Cuando una aplicación accede a una secuencia que puede asignar el siguiente número de secuencia desde la memoria caché, la asignación de números de secuencia se produce rápidamente. Sin embargo, si una aplicación accede a una secuencia que no puede asignar el siguiente número de secuencia de la memoria caché, la asignación de número de secuencia requerirá una actualización del objeto *DTAARA.

La elección de un valor alto para CACHE permite un acceso más rápido a más números de secuencia sucesivos. Sin embargo, en el caso de una anomalía, se pierden todos los valores de secuencia de la memoria caché. Si se utiliza la opción NO CACHE, los valores de la secuencia no se almacenan en la memoria caché de secuencia. En este caso, cada acceso a la secuencia requiere una actualización del objeto *DTAARA. La elección del valor de CACHE debe realizarse teniendo en cuenta el equilibrio entre el rendimiento y los requisitos de la aplicación.

Persistencia del valor de secuencia generado más recientemente: el gestor de bases de datos recuerda el valor generado más recientemente para una secuencia dentro de la sesión SQL y devuelve este valor para una expresión PREVIOUS VALUE que especifica el nombre de secuencia. El valor persiste hasta que se genere el siguiente valor para la secuencia, se descarte, altere o sustituya la secuencia o hasta el final de la sesión de aplicación. El valor no se ve afectado por las sentencias COMMIT y ROLLBACK.

PREVIOUS VALUE está definido para tener un ámbito lineal dentro de la sesión de aplicación. Por lo tanto, en una aplicación anidada:

  • en la entrada a una función anidada, procedimiento o desencadenante, la aplicación anidada hereda el valor generado más recientemente para una secuencia. Es decir, especificar una invocación de una expresión PREVIOUS VALUE en una aplicación anidada reflejará la actividad de secuencia realizada en la aplicación de invocación, rutina o desencadenante antes de entrar en la aplicación anidada. Una invocación de la expresión PREVIOUS VALUE en una aplicación anidada da como resultado un error si todavía no se ha realizado una expresión NEXT VALUE para la secuencia especificada en la aplicación, rutina o desencadenante de invocación.
  • en la devolución de una función, procedimiento o desencadenante, la aplicación, rutina o desencadenante de invocación se verá afectada por cualquier actividad de secuencia en la función, procedimiento o desencadenante. Es decir, una invocación de PREVIOUS VALUE en la aplicación de invocación, rutina o desencadenante después de volver de la aplicación anidada reflejará cualquier actividad de secuencia que se haya producido en las aplicaciones de nivel inferior.

Registro por diario de secuencia: Cuando se crea una secuencia, el registro por diario puede iniciarse automáticamente si la secuencia se crea en un esquema que ha especificado (utilizando el mandato STRJRNLIB) que el registro por diario debe iniciarse implícitamente.

Alternativas de sintaxis: Las palabras clave siguientes son sinónimos soportados para la compatibilidad con releases anteriores de otros productos Db2 . Estas palabras clave no son estándar y no deben utilizarse:

  • Las palabras clave NOMINVALUE, NOMAXVALUE, NOCYCLE, NOCACHE y NOORDER se pueden utilizar como sinónimos para NO MINVALUE, NO MAXVALUE, NO CYCLE, NO CACHE y NO ORDER.
  • Puede utilizarse una coma para separar varias opciones en una secuencia.

Ejemplos

Crear una secuencia denominada ORG_SEQ que empiece por el 1, que se ejecute en incrementos de 1, que no ejecute un ciclo y que coloque en memoria caché 24 valores al mismo tiempo:

  CREATE SEQUENCE ORG_SEQ
    START WITH 1
    INCREMENT BY 1
    NO MAXVALUE
    NO CYCLE
    CACHE 24

Las opciones START WITH 1, INCREMENT 1, NO MAXVALUE y NO CYCLE son los valores que se habrían utilizado si no se hubieran especificado explícitamente.