CREATE SEQUENCE
The CREATE SEQUENCE statement creates a sequence at the application server.
Invocation
This statement can be embedded in an application program or issued interactively. It is an executable statement that can be dynamically prepared.
Authorization
The privileges held by the authorization ID of the statement must include at least one of the following:
- The privilege to create in the schema. For more information, see Privileges necessary to create in a schema.
- Administrative authority
The privileges held by the authorization ID of the statement must include at least one of the following:
- The following system authorities:
- *USE to the Create Data Area (CRTDTAARA) command
- Administrative authority
The privileges held by the authorization ID of the statement must include at least one of the following:
- For the SYSSEQOBJECTS catalog table:
- The INSERT privilege on the table, and
- The system authority *EXECUTE on library QSYS2
- Administrative authority
If a distinct type is referenced, the privileges held by the authorization ID of the statement must include at least one of the following:
- For the distinct type identified in the statement:
- The USAGE privilege on the distinct type, and
- The system authority *EXECUTE on the library containing the distinct type
- Administrative authority
To replace an existing sequence, the privileges held by the authorization ID of the statement must include at least one of the following:
- The following system authorities:
- The system authority of *OBJMGT on the data area associated with the sequence
- All authorities needed to DROP the sequence
- The system authority *READ to the SYSSEQOBJECTS catalog table
- Administrative authority
For information about the system authorities corresponding to SQL privileges, see Corresponding System Authorities When Checking Privileges to a Sequence and Corresponding System Authorities When Checking Privileges to a Distinct Type.
Syntax
>>-CREATE--+------------+--SEQUENCE--sequence-name--------------> '-OR REPLACE-' .--------------------------------------------. V (1) | >----+------------------------------------+-----+-------------->< | .-INTEGER---. | +-AS--+-data-type-+------------------+ +-START WITH--numeric-constant-------+ | .-1----------------. | +-INCREMENT BY--+-numeric-constant-+-+ | .-NO MINVALUE----------------. | +-+-MINVALUE--numeric-constant-+-----+ | .-NO MAXVALUE----------------. | +-+-MAXVALUE--numeric-constant-+-----+ | .-NO CYCLE-. | +-+-CYCLE----+-----------------------+ | .-CACHE--20---------------. | +-+-NO CACHE----------------+--------+ | '-CACHE--integer-constant-' | | .-NO ORDER-. | '-+-ORDER----+-----------------------'
- The same clause must not be specified more than once.
data-type |--+-built-in-type------+---------------------------------------| '-distinct-type-name-' built-in-type |--+-+---SMALLINT---+---------------------------+---------------| | +-+-INTEGER-+--+ | | | '-INT-----' | | | '---BIGINT-----' | | .-(5,0)-----------------. | '-+-+-DECIMAL-+-+--+-----------------------+-' | '-DEC-----' | | .-,0-. | '-+-NUMERIC-+-' '-(--integer--+----+--)-' '-NUM-----'
Description
- OR REPLACE
- Specifies to replace the definition for the sequence if one exists at the current server. The existing definition is effectively dropped before the new definition is replaced in the catalog with the exception that privileges that were granted on the sequence are not affected. This option is ignored if a definition for the sequence does not exist at the current server.
- sequence-name
- Names the sequence. The name, including the
implicit or explicit qualifier, must not identify a sequence or data
area that already exists at the current server. If a qualified sequence
name is specified, the schema-name cannot
be QSYS2, QSYS, or SYSIBM.
If SQL names were specified, the sequence will be created in the schema specified by the implicit or explicit qualifier.
If system names were specified, the sequence will be created in the schema that is specified by the qualifier. If not qualified:
- If the value of the CURRENT SCHEMA special register is *LIBL, the sequence will be created in the current library (*CURLIB).
- Otherwise, the sequence will be created in the current schema.
- AS data-type
- Specifies the data type to be used for the sequence value. The data type can be any exact numeric type (SMALLINT, INTEGER, BIGINT, DECIMAL, or NUMERIC) with a scale of zero, or a user-defined distinct type for which the source type is an exact numeric type with a scale of zero. The default is INTEGER.
- built-in-type
- Specifies
the built-in data type used as the basis for the internal representation
of the sequence. If the data type is DECIMAL or NUMERIC, the precision
must be less than or equal to 63 and the scale must be 0. See CREATE TABLE for a more complete description of
each built-in data type.
For portability of applications across platforms, use DECIMAL instead of a NUMERIC data type.
- distinct-type-name
- Specifies that the data type of the sequence is a distinct type (a user-defined data type). If the source type is DECIMAL or NUMERIC, the precision of the sequence is the precision of the source type of the distinct type. The precision of the source type must be less than or equal to 63 and the scale must be 0. If a distinct type name is specified without a schema name, the distinct type name is resolved by searching the schemas on the SQL path.
- START WITH numeric-constant
- Specifies
the first value that is generated for the sequence. The value can
be any positive or negative value that could be assigned to a column
of the data type associated with the sequence, without non-zero digits
to the right of the decimal point.
If a value is not explicitly specified when the sequence is defined, the default is the MINVALUE for an ascending sequence and the MAXVALUE for a descending sequence.
This value is not necessarily the value that a sequence would cycle to after reaching the maximum or minimum value of the sequence. The START WITH clause can be used to start a sequence outside the range that is used for cycles. The range used for cycles is defined by MINVALUE and MAXVALUE.
- INCREMENT BY numeric-constant
- Specifies
the interval between consecutive values of the sequence. The value
can be any positive or negative value that could be assigned to a
column of the data type associated with the sequence, and does not
exceed the value of a large integer constant, without nonzero digits
existing to the right of the decimal point.
If the value is 0 or positive, this is an ascending sequence. If the value is negative, this is a descending sequence. The default is 1.
- NO MINVALUE or MINVALUE
- Specifies
the minimum value at which a descending sequence either cycles or
stops generating values, or an ascending sequence cycles to after
reaching the maximum value. The default is NO MINVALUE.
- NO MINVALUE
- For an ascending sequence, the value is the START WITH value, or 1 if START WITH is not specified. For a descending sequence, the value is the minimum value of the data type (and precision, if DECIMAL or NUMERIC) associated with the sequence.
- MINVALUE numeric-constant
- Specifies the numeric constant that is the minimum value. This value can be any positive or negative value that could be assigned to a column of the data type associated with the sequence and without non-zero digits to the right of the decimal point. The value must be less than or equal to the maximum value.
- NO MAXVALUE or MAXVALUE
- Specifies
the maximum value at which an ascending sequence either cycles or
stops generating values, or a descending sequence cycles to after
reaching the minimum value. The default is NO MAXVALUE.
- NO MAXVALUE
- For an ascending sequence, the value is the maximum value of the data type (and precision, if DECIMAL or NUMERIC) associated with the sequence. For a descending sequence, the value is the START WITH value, or -1 if START WITH is not specified.
- MAXVALUE numeric-constant
- Specifies the numeric constant that is the maximum value. This value can be any positive or negative value that could be assigned to a column of the data type associated with the sequence and without non-zero digits to the right of the decimal point. The value must be greater than or equal to the minimum value.
- NO CYCLE or CYCLE
- Specifies
whether this sequence should continue to generate values once the
maximum or minimum value of the sequence has been reached. The default
is NO CYCLE.
- NO CYCLE
- Specifies that values will not be generated for the sequence once the maximum or minimum value for the sequence has been reached.
- CYCLE
- Specifies that values continue to be generated for this sequence
after the maximum or minimum value has been reached. If this option
is used, after an ascending sequence reaches the maximum value of
the sequence, it generates its minimum value. After a descending sequence
reaches its minimum value of the sequence, it generates its maximum
value. The maximum and minimum values for the column determine the
range that is used for cycling.
When CYCLE is in effect, then duplicate values can be generated for the sequence.
- CACHE or NO CACHE
- Specifies
whether to keep some preallocated values in memory. Preallocating
and storing values in the cache improves the performance of the NEXT
VALUE sequence expression. The default is CACHE 20.
- CACHE integer-constant
- Specifies the maximum number of sequence values that are preallocated
and kept in memory. Preallocating and storing values in the cache
improves performance.
In certain situations, such as system failure, all cached sequence values that have not been used in committed statements are lost, and thus, will never be used. The value specified for the CACHE option is the maximum number of sequence values that could be lost in these situations.
The minimum value that can be specified is 2.
- NO CACHE
- Specifies that values for the sequence are not preallocated. If NO CACHE is specified, the performance of the NEXT VALUE sequence expression will be worse than if CACHE is specified.
- ORDER or NO ORDER
- Specifies
whether the sequence values must be generated in order of request.
The default is NO ORDER.
- NO ORDER
- Specifies that the sequence numbers do not need to be generated in order of request.
- ORDER
- Specifies that the sequence numbers are generated in order of request. If ORDER is specified, the performance of the NEXT VALUE sequence expression will be worse than if NO ORDER is specified.
Notes
Sequence attributes: A sequence is created as a *DTAARA object. The *DTAARA objects should not be changed with the Change Data Area (*CHGDTAARA) or any other similar interface because doing so may cause unexpected failures or unexpected results when attempting to use the SQL sequence through SQL.
Sequence ownership: The owner of the sequence is the user profile or group user profile of the job executing the statement.
Sequence authority: If SQL names are used, sequences are created with the system authority of *EXCLUDE on *PUBLIC. If system names are used, sequences are created with the authority to *PUBLIC as determined by the create authority (CRTAUT) parameter of the schema.
If the owner of the sequence is a member of a group profile (GRPPRF keyword) and group authority is specified (GRPAUT keyword), that group profile will also have authority to the sequence.
- Any existing comment or label is discarded.
- Authorized users are maintained. The object owner could change.
- Current journal auditing is preserved.
Relationship of MINVALUE and MAXVALUE: Typically, MINVALUE will be less than MAXVALUE, but this is not required. MINVALUE could be equal to MAXVALUE. If START WITH was the same value as MINVALUE and MAXVALUE, and CYCLE is implicitly or explicitly specified, this would be a constant sequence. In this case a request for the next value appears to have no effect because all the values generated by the sequence are in fact the same.
MINVALUE must not be greater than MAXVALUE
Defining constant sequences: It is possible to define a sequence that would always return a constant value. This could be done by specifying an INCREMENT value of zero and a START WITH value that does not exceed MAXVALUE, or by specifying the same value for START WITH, MINVALUE and MAXVALUE. For a constant sequence, each time a NEXT VALUE expression is processed the same value is returned. A constant sequence can be used as a numeric global variable. ALTER SEQUENCE can be used to adjust the values that will be generated for a constant sequence.
Defining sequences that cycle: A sequence can be cycled manually by using the ALTER SEQUENCE statement. If NO CYCLE is implicitly or explicitly specified, the sequence can be restarted or extended using the ALTER SEQUENCE statement to cause values to continue to be generated once the maximum or minimum value for the sequence has been reached.
A sequence can be explicitly defined to cycle by specifying the CYCLE keyword. Use the CYCLE option when defining a sequence to indicate that the generated values should cycle once the boundary is reached. When a sequence is defined to automatically cycle (for example CYCLE was explicitly specified), then the maximum or minimum value generated for a sequence may not be the actual MAXVALUE or MINVALUE specified, if the increment is a value other than 1 or -1. For example, the sequence defined with START WITH=1, INCREMENT=2, MAXVALUE=10 will generate a maximum value of 9, and will not generate the value 10.
When defining a sequence with CYCLE, then any application conversion tools (for converting applications from other vendor platforms to DB2®) should also explicitly specify MINVALUE, MAXVALUE and START WITH.
Caching sequence numbers: A range of sequence numbers can be kept in memory for fast access. When an application accesses a sequence that can allocate the next sequence number from the cache, the sequence number allocation can happen quickly. However, if an application accesses a sequence that cannot allocate the next sequence number from the cache, the sequence number allocation will require an update to the *DTAARA object.
Choosing a high value for CACHE allows faster access to more successive sequence numbers. However, in the event of a failure, all sequence values in the cache are lost. If the NO CACHE option is used, the values of the sequence are not stored in the sequence cache. In this case every access to the sequence requires an update to the *DTAARA object. The choice of the value for CACHE should be made keeping the trade-off between performance and application requirements in mind.
Persistence of the most recently generated sequence value: The database manager remembers the most recently generated value for a sequence within the SQL-session, and returns this value for a PREVIOUS VALUE expression specifying the sequence name. The value persists until either the next value is generated for the sequence, the sequence is dropped, altered, or replaced, or until the end of the application session. The value is unaffected by COMMIT and ROLLBACK statements.
PREVIOUS VALUE is defined to have a linear scope within the application session. Therefore, in a nested application:
- on entry to a nested function, procedure, or trigger, the nested application inherits the most recently generated value for a sequence. That is, specifying an invocation of a PREVIOUS VALUE expression in a nested application will reflect sequence activity done in the invoking application, routine, or trigger before entering the nested application. An invocation of PREVIOUS VALUE expression in a nested application results in an error if a NEXT VALUE expression for the specified sequence had not yet been done in the invoking application, routine, or trigger.
- on return from a function, procedure, or trigger, the invoking application, routine or trigger will be affected by any sequence activity in the function, procedure, or trigger. That is, an invocation of PREVIOUS VALUE in the invoking application, routine, or trigger after returning from the nested application will reflect any sequence activity that occurred in the lower level applications.
- If a data area called QDFTJRN exists in the same schema that the
sequence is created into and the user is authorized to the data area,
journaling will be started to the journal named in the data area if
all the following are true:
- The identified schema for the table must not be QSYS, QSYS2, QRECOVERY, QSPL, QRCL, QRPLOBJ, QGPL, QTEMP, SYSIBM, or any of the IASP equivalents to these libraries.
- The journal specified in the data area must exist and the user must be authorized to start journaling to the journal.
- The first 10 bytes of the data area must contain the name of the schema in which to find the journal.
- The second 10 bytes must contain the name of the journal.
- The remaining bytes contain the object types being implicitly journaled and the options that affect when implicit journaling is performed. The object type must include the value *DTAARA or *ALL. The value *NONE can be used to prevent journaling from being started.
- If the sequence is created into a schema that has specified (using the STRJRNLIB command) that journaling should implicitly be started.
Syntax alternatives: The following keywords are synonyms supported for compatibility to prior releases of other DB2 products. These keywords are non-standard and should not be used:
- The keywords NOMINVALUE, NOMAXVALUE, NOCYCLE, NOCACHE, and NOORDER can be used as synonyms for NO MINVALUE, NO MAXVALUE, NO CYCLE, NO CACHE, and NO ORDER.
- A comma can be used to separate multiple sequence options.
Examples
Create a sequence called ORG_SEQ that starts at 1, increments by 1, does not cycle, and caches 24 values at a time:
CREATE SEQUENCE ORG_SEQ
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO CYCLE
CACHE 24
The options START WITH 1, INCREMENT 1, NO MAXVALUE, and NO CYCLE are the values that would have been used if they had not been explicitly specified.