SQL$HELP_OLD72.HLB  —  CREATE

1  –  CACHE

                                   NOTE

       You cannot issue CREATE CACHE as an independent statement.
       It is a clause allowed only as part of a CREATE DATABASE or
       IMPORT statement.

       You can also create a row cache using the ADD CACHE clause
       of the ALTER DATABASE statement.

    Creates a row cache that allows frequently referenced rows
    to remain in memory even when the associated page has been
    transferred back to disk. This saves in memory usage because
    only the more recently referenced rows are cached versus caching
    the entire buffer.

    See the ALTER DATABASE statement and the CREATE DATABASE
    statement for more information regarding the row cache areas.

1.1  –  Environment

    You can use the CREATE CACHE clause only within a CREATE DATABASE
    or IMPORT statement. You can use the ADD CACHE clause only within
    the ALTER DATABASE statement.

1.2  –  Format

  CREATE CACHE <row-cache-name> -+-+----------------------+-+->
                                 | +-> row-cache-params1 -+ |
                                 | +-> row-cache-params2 -+ |
                                 +------------ <------------+

  add-row-cache-clause =

  ---> ADD CACHE <row-cache-name> -+-+----------------------+-+->
                                   | +-> row-cache-params1 -+ |
                                   | +-> row-cache-params2 -+ |
                                   +-------------<------------+

  row-cache-params1 =

  --+-> ALLOCATION IS <n> -+--+-----------+----------------+->
    +-> EXTENT IS <n> -----+  +-> BLOCK --+                |
    |                         +-> BLOCKS -+                |
    +-> CACHE SIZE IS <n> -+----> ROW --+------------------+
    |                      +----> ROWS -+                  |
    +-> CHECKPOINT -+> UPDATED ROWS TO -+> BACKING FILE -+-+
    |               |                   +> DATABASE -----+ |
    |               +> ALL ROWS TO BACKING FILE ---------+ |
    +-> LARGE MEMORY IS ----+-+-> ENABLED --+--------------+
    +-> ROW REPLACEMENT IS -+ +-> DISABLED -+              |
    +-> LOCATION IS --> <directory-spec> ------------------+
    +-> NO LOCATION ---------------------------------------+

  row-cache-params2 =

  --+-> NUMBER OF -+-> RESERVED -+-> ROWS IS <n> --------------+->
    |              +-> SWEEP ----+                             |
    +-> ROW LENGTH IS <n> -+-------------+---------------------+
    |                      +----> BYTE --+                     |
    |                      +----> BYTES -+                     |
    |                                                          |
    +-> ROW SNAPSHOT IS --+-> ENABLED rs-opt  -+---------------+
    |                     +-> DISABLED --------+               |
    |                                                          |
    +-> SHARED MEMORY IS --+----> SYSTEM -------------------+--+
                           +----> PROCESS --+-------------+-+
                                            |             |
                                            +-> RESIDENT -+

  rs-opt =
  --+-------------------------------+--->
    +-> (CACHE SIZE IS <n> ROWS) ---+

1.3  –  Arguments

1.3.1  –  ALLOCATION

    Syntax options:

    ALLOCATION IS n BLOCK | ALLOCATION IS n BLOCKS

    Specifies the initial allocation of the row cache file (.rdc) to
    which cached rows are written.

    If the ALLOCATION clause is not specified, the default allocation
    in blocks is approximately 40 percent of the CACHE SIZE for this
    cache.

    This clause is ignored if the row cache is defined to checkpoint
    to the database.

1.3.2  –  CACHE

    Creates a row cache.

1.3.3  –  CACHE_SIZE

    Syntax options:

    CACHE SIZE IS n ROW | CACHE SIZE IS n ROWS

    Specifies the number of rows allocated to the row cache. As the
    row cache fills, rows more recently referenced are retained in
    the row cache while those not referenced recently are discarded.
    Adjusting the allocation of the row cache helps to retain
    important rows in memory. If not specified, the default is 1000
    rows.

1.3.4  –  CHECKPOINT

    Syntax options:

       CHECKPOINT ALL ROWS TO BACKING FILE
       CHECKPOINT UPDATED ROWS TO BACKING FILE
       CHECKPOINT UPDATED ROWS TO DATABASE

    Specifies the source records and target for checkpoint operations
    for the row cache. If ALL ROWS is specified, then the records
    written during each checkpoint operation are both the modified
    and the unmodified rows in the row cache. If UPDATED ROWS is
    specified, then just the modified rows in the row cache are
    checkpointed each time.

    If the target of the checkpoint operation is BACKING FILE, then
    the row cache server (RCS) process writes the row cache entries
    to the backing (.rdc) files. The row cache LOCATION, ALLOCATION,
    and EXTENT clauses are used to create the backing files. Upon
    recovery from a node failure, the database recovery process is
    able to repopulate the row caches in memory from the rows found
    in the backing files.

    If the target is DATABASE, then the updated rows (only UPDATED
    ROWS is allowed) are written back to the database. The row
    cache LOCATION, ALLOCATION, and EXTENT clauses are ignored. Upon
    recovery from a node failure, the database recovery process has
    no data on the contents of the row cache. Therefore, it does not
    repopulate the row caches in memory.

    This CHECKPOINT clause overrides the database-level CHECKPOINT
    clause.

1.3.5  –  EXTENT

    Syntax options:

    EXTENT IS n BLOCK | EXTENT IS n BLOCKS

    Specifies the file extent size for the row cache file (.rdc).

    If the EXTENT clause is not specified, the default number of
    blocks is CACHE SIZE * 127 for this cache.

    This clause is ignored if the row cache is defined to checkpoint
    to the database.

1.3.6  –  LOCATION

    Syntax options:

    LOCATION IS directory-spec

    Specifies the name of the directory to which row cache
    information is written. The database system generates a file
    name (row-cache-name.rdc) automatically for each row cache at
    checkpoint time. Specify a device name and directory name only,
    enclosed within single quotation marks. By default, the location
    is the directory of the database root file. These .rdc files are
    permanent database files.

    This LOCATION clause overrides a previously specified location at
    the database level.

    This clause is ignored if the row cache is defined to checkpoint
    to the database.

1.3.7  –  NO_LOCATION

    Removes the location previously specified in a LOCATION IS clause
    for the row cache. If you specify NO LOCATION, the row cache
    location becomes the directory of the database root file.

    This clause is ignored if the row cache is defined to checkpoint
    to the database.

1.3.8  –  NUMBER_OF_RESERVED_ROWS

    Syntax options:

    NUMBER OF RESERVED ROWS IS n

    Specifies the maximum number of cache rows that each user can
    reserve for insertion into the cache. Processes reserve, or
    allocate, entries in a cache to be used when inserting rows into
    the cache. To improve efficiency, multiple entries are reserved
    at one once. Once a user's reserved list becomes depleted, Oracle
    Rdb attempts to reserve another group of entries. The default is
    20 rows.

    This value is also used when searching for available slots in a
    row cache. The entire row cache is not searched on the initial
    pass. This value specifies the maximum number of rows that are
    searched for a free slot. If at least one free slot is found, the
    insert operation can proceed. If no free slots are found in this
    initial search, Oracle Rdb continues searching through the cache
    until it finds a free slot.

1.3.9  –  NUMBER_OF_SWEEP_ROWS

    Syntax options:

    NUMBER OF SWEEP ROWS IS n

    Specifies the number of modified rows that will be written from
    the row cache back to the database by the row cache server (RCS)
    process during a sweep operation. When the RCS is notified that
    a cache is "full" of modified data, the RCS starts a sweep to
    make space available in the cache for subsequent transactions
    to be able to insert rows into the cache. Oracle Corporation
    recommends that you initially specify the number of sweep rows
    to be approximately 5 percent of the total number of rows in
    the cache. Then monitor performance and adjust the number of
    sweep rows, if necessary. Allowable values must be in the range 2
    through 524288. If not specified, the default is 3,000 rows.

1.3.10  –  ROW_LENGTH

    Syntax options:

    ROW LENGTH IS n BYTES

    Specifies the length of each row allocated to the row cache. Rows
    are not cached if they are too large for the row cache. area. The
    ROW LENGTH is an aligned longword rounded up to the next multiple
    of 4 bytes.

    The maximum row length in a row cache is 65535 bytes.

    When the name of the cache matches the name of an existing
    logical area, ADD CACHE will calculate ROW LENGTH from the size
    of the table row, or the size of the index node (for SORTED
    RANKED, or UNIQUE SORTED indices). This cache is known as a
    logical area cache.

1.3.11  –  ROW_REPLACEMENT

    Syntax options:

    ROW REPLACEMENT IS ENABLED | ROW REPLACEMENT IS DISABLED

    Specifies whether or not Oracle Rdb replaces rows in the cache.
    When ROW REPLACEMENT IS ENABLED, rows are replaced when the
    row cache becomes full. When ROW REPLACEMENT IS DISABLED, rows
    are not replaced when the row cache is full. The type of row
    replacement policy depends upon the application requirements for
    each cache.

    The default is ENABLED.

1.3.12  –  ROW_SNAPSHOT_IS_DISABLED

    Disables storing snapshot copies of rows within the cache.

1.3.13  –  ROW_SNAPSHOT_IS_ENABLED

    The ROW SNAPSHOT IS ENABLED (CACHE SIZE IS n ROWS) option enables
    storage of snapshot copies of rows within the cache and specifies
    the number of snapshot "slots" to allocate for the cache.

    The default for new caches, and existing caches is to have this
    feature disabled.

    If you do not specify the CACHE SIZE clause for the ROW SNAPSHOT
    IS ENABLED option, Oracle Rdb creates a cache that can contain up
    to 1000 snapshot rows.

1.3.14  –  SHARED_MEMORY

    Syntax options:

    SHARED MEMORY IS SYSTEM | SHARED MEMORY IS PROCESS

    Determines whether cache global sections are created in system
    space or process space. The default is SHARED MEMORY IS PROCESS.

    When you use cache global sections created in the process
    space, you and other users share physical memory and the OpenVMS
    operating system maps a row cache to a private address space for
    each user. As a result, all users are limited by the free virtual
    address range and each use a percentage of memory in overhead. If
    many users are accessing the database, the overhead can be high.

    When many users are accessing the database, consider using the
    SHARED MEMORY IS SYSTEM clause. This gives users more physical
    memory because they share the system space of memory and there is
    none of the overhead associated with the process space of memory.

1.3.15  –  SHARED_MEMORY_IS_PROCESS_RESIDENT

    The SHARED MEMORY clause determines whether database root global
    sections (including global buffers when enabled) or whether the
    cache global sections are created in system space or process
    space. The RESIDENT option extends the PROCESS option by making
    the global section memory resident.

1.4  –  Examples

    Example 1: Creating a row cache

    This example creates a database, creates a row cache, and assigns
    the row cache to a storage area.

    SQL> CREATE DATABASE FILENAME test_db
    cont> ROW CACHE IS ENABLED
    cont> CREATE CACHE test1
    cont>    CACHE SIZE IS 100 ROWS
    cont> CREATE STORAGE AREA area1
    cont>    CACHE USING test1;
    SQL> SHOW CACHE
    Cache Objects in database with filename test_db
            TEST1
    SQL> SHOW CACHE test1

         TEST1
            Cache Size:            100 rows
            Row Length:            256 bytes
            Row Replacement:       Enabled
            Shared Memory:         Process
            Large Memory:          Disabled
            Window Count:          100
            Reserved Rows:         20
            Sweep Rows:            3000
            No Sweep Thresholds
            Allocation:            100 blocks
            Extent:                100 blocks
    SQL> SHOW STORAGE AREA area1

         AREA1
             Access is:      Read write
             Page Format:    Uniform
             Page Size:      2 blocks
             Area File:      SQL_USER1:[DAY.V70]AREA1.RDA;1
             Area Allocation:          402 pages
             Area Extent Minimum:      99 pages
             Area Extent Maximum:      9999 pages
             Area Extent Percent:      20 percent
             Snapshot File:  SQL_USER1:[DAY.V70]AREA1.SNP;1
             Snapshot Allocation:      100 pages
             Snapshot Extent Minimum:  99 pages
             Snapshot Extent Maximum:  9999 pages
             Snapshot Extent Percent:  20 percent
             Extent :       Enabled
             Locking is Row Level
             Using Cache TEST1
    No database objects use Storage Area AREA1

    Example 2: Creating and modifying various caches

    1  The cache named CUSTOMER_STATUS is created with a row length
       of 577 bytes with 88000 cache "slots" for storage of live
       database rows and 7000 slots for storage of snapshot copies of
       rows. This cache is also configured to be memory- resident.

    2  The cache named MACHINE_FLOW_IDX_1 is created with a row
       length of 430 bytes with 5000 cache slots for storage of live
       database rows and 12000 slots for storage of snapshot copies
       of rows. This cache is set to disallow replacement of rows in
       the cache.

    3  The cache named SALES_CALLS is created with a row length of
       160 bytes with 3000 cache "slots" for storage of live database
       rows and, using the default because an explicit count was not
       specified, 1000 slots for storage of snapshot copies of rows.

    4  The cache named CUSTOMER_ORDER does not specify "ROW SNAPSHOT
       IS ENABLED" so no snapshot row copies will be stored in this
       cache.

    5  The cache named "SALES" is modified to disable storage of
       snapshot rows in cache.

    6  The cache named "CLEARING" is modified to enable storage
       of snapshot rows in the cache with a snapshot cache size of
       12,345 rows.

    SQL> ALTER DATABASE FILENAME HDB_DB
    1 ADD CACHE CUSTOMER_STATUS
                    ROW LENGTH IS 577 BYTES
                    CACHE SIZE IS 88000 ROWS
                    ROW SNAPSHOT IS ENABLED (CACHE SIZE IS 7000 ROWS)
                    SHARED MEMORY IS PROCESS RESIDENT

    2 ADD CACHE MACHINE_FLOW_IDX_1
                    ROW LENGTH IS 430 BYTES
                    CACHE SIZE IS 5000 ROWS
                    ROW REPLACEMENT IS DISABLED
                    ROW SNAPSHOT IS ENABLED (CACHE SIZE IS 12000 ROWS)

    3 ADD CACHE SALES_CALLS
                    ROW LENGTH IS 160 BYTES
                    CACHE SIZE IS 3000 ROWS
                    ROW SNAPSHOT IS ENABLED

    4 ADD CACHE CUSTOMER_ORDER
                    ROW LENGTH IS 760 BYTES
                    CACHE SIZE IS 9000 ROWS
                    CHECKPOINT UPDATED ROWS TO DATABASE

    5 ALTER CACHE SALES
                    ROW SNAPSHOT IS DISABLED

    6 ALTER CACHE CLEARING
                    ROW SNAPSHOT IS ENABLED (CACHE SIZE IS 12345 ROWS);
    SQL> SHOW CACHE CUSTOMER_STATUS

         CUSTOMER_STATUS
            Cache Size:            88000 rows
            Row Length:            580 bytes
            Row Replacement:       Enabled
            Shared Memory:         Process Resident
            Large Memory:          Disabled
            Window Count:          100
            Working Set Count:     10
            Reserved Rows:         20
            Allocation:            100 blocks
            Extent:                100 blocks
            Snapshot in Cache:     Enabled
            Snapshot Cache Size:   7000 rows

    SQL> SHOW CACHE MACHINE_FLOW_IDX_1

         MACHINE_FLOW_IDX_1
            Cache Size:            5000 rows
            Row Length:            432 bytes
            Row Replacement:       Disabled
            Shared Memory:         Process
            Large Memory:          Disabled
            Window Count:          100
            Working Set Count:     10
            Reserved Rows:         20
            Allocation:            100 blocks
            Extent:                100 blocks
            Snapshot in Cache:     Enabled
            Snapshot Cache Size:   12000 rows

    SQL> SHOW CACHE SALES_CALLS

         SALES_CALLS
            Cache Size:            3000 rows
            Row Length:            160 bytes
            Row Replacement:       Enabled
            Shared Memory:         Process
            Large Memory:          Disabled
            Window Count:          100
            Working Set Count:     10
            Reserved Rows:         20
            Allocation:            100 blocks
            Extent:                100 blocks
            Snapshot in Cache:     Enabled
            Snapshot Cache Size:   1000 rows

    SQL> SHOW CACHE CUSTOMER_ORDER

         CUSTOMER_ORDER
            Cache Size:            9000 rows
            Row Length:            760 bytes
            Row Replacement:       Enabled
            Shared Memory:         Process
            Large Memory:          Disabled
            Window Count:          100
            Working Set Count:     10
            Reserved Rows:         20
            Allocation:            100 blocks
            Extent:                100 blocks
            Row cache: checkpoint updated rows to database

2  –  CATALOG

    Creates a name for a group of schemas in a multischema database.

2.1  –  Environment

    You can use the CREATE CATALOG statement:

    o  In interactive SQL

    o  Embedded in host language programs to be precompiled

    o  As part of a procedure in an SQL module

    o  In dynamic SQL as a statement to be dynamically executed

2.2  –  Format

  CREATE CATALOG --> <catalog-name> -+
   +---------------------------------+
   +-+-------------------------------+->
     +---> create-schema-statement -++
     +-+-> schema-element -+--------+
       +---------<---------+

  catalog-name =

  -+------> <name-of-catalog> --------------+->
   |                                        |
   +-> " -> <alias>.<name-of-catalog> ->"  -+

  schema-element =

  -+-> create-collating-sequence-statement -+->
   +-> create-domain-statement -------------+
   +-> create-index-statement --------------+
   +-> create-sequence-statement -----------+
   +-> create-storage-map-statement --------+
   +-> create-table-statement --------------+
   +-> create-trigger-statement ------------+
   +-> create-view-statement ---------------+
   +-> grant-statement ---------------------+

2.3  –  Arguments

2.3.1  –  alias.name-of-catalog

    Specifies an optional name for the attach to the database. Always
    qualify the catalog name with an alias if your program or your
    interactive SQL statements refer to more than one database.
    Separate the name of the catalog from the alias with a period,
    and enclose the qualified name within double quotation marks.

2.3.2  –  catalog-name

    The name of the catalog definition you want to create. Use any
    valid SQL name that is unique among all catalog names in the
    database. For more information on catalog names, see the User_
    Supplied_Names HELP topic.

2.3.3  –  create-schema-statement

    For more information, see the CREATE SCHEMA statement.

2.3.4  –  schema-element

    One or more CREATE statements or a GRANT statement. For more
    information, see the CREATE SCHEMA statement.

2.4  –  Examples

    Example 1: Creating a catalog for a database using an alias

    This example shows how an interactive user could attach to the
    sample database called personnel and create a catalog in that
    database. (You must use the personnel sample database created
    with the multischema attribute for this example.) Using an
    alias, the user distinguishes the personnel database from other
    databases that may be attached later in the same session.

    SQL> ATTACH 'ALIAS CORPORATE FILENAME personnel -
    cont> MULTISCHEMA IS ON';
    SQL> --
    SQL> -- SQL creates a default catalog called RDB$CATALOG in
    SQL> -- each multischema database.
    SQL> --
    SQL> SHOW CATALOG;
    Catalogs in database personnel
        "CORPORATE.RDB$CATALOG"
    SQL> --
    SQL> -- The SET QUOTING RULES 'SQL99' statement allows the use of
    SQL> -- double quotation marks, which SQL requires when you
    SQL> -- qualify a catalog name with an alias.
    SQL> --
    SQL> SET QUOTING RULES 'SQL99';
    SQL> CREATE CATALOG "CORPORATE.MARKETING";
    SQL> --
    SQL> SHOW CATALOG;
    Catalogs in database personnel
        "CORPORATE.MARKETING"
        "CORPORATE.RDB$CATALOG"

    Example 2: Creating a catalog in the database with the default
    alias

    This example shows a CREATE CATALOG clause used in an interactive
    CREATE DATABASE statement. In this example, the user creates a
    database without specifying an alias. Because the user is not
    attached to any other databases, the new database becomes the
    default alias.

    SQL> CREATE DATABASE FILENAME inventory
    cont> MULTISCHEMA IS ON
    cont> CREATE CATALOG PARTS
    cont> CREATE SCHEMA PRINTERS AUTHORIZATION DAVIS
    cont> CREATE TABLE LASER EXTERNAL NAME IS DEPT_2_LASER
    cont> (SERIAL_NO INT, LOCATION CHAR)
    cont> CREATE SCHEMA TERMINALS AUTHORIZATION DAVIS
    cont> CREATE TABLE TERM100 EXTERNAL NAME IS DEPT_2_TERM100
    cont> (SERIAL_NO INT, LOCATION CHAR);
    SQL> SHOW CATALOG;
    Catalogs in database with filename inventory
        PARTS
        RDB$CATALOG
    SQL> show schemas;
    Schemas in database with filename inventory
        PARTS.PRINTERS
        PARTS.TERMINALS
        RDB$SCHEMA

3  –  COLLATING_SEQUENCE

    Identifies a collating sequence that has been defined using the
    OpenVMS National Character Set (NCS) utility. Use the CREATE
    COLLATING SEQUENCE statement to identify collating sequences
    other than the database default collating sequence that you plan
    to use with certain domains. (The default collating sequence for
    a database is established by the COLLATING SEQUENCE IS clause in
    the CREATE SCHEMA statement; if you omit that clause at database
    definition time, the default sequence is ASCII.)

    You must enter a CREATE COLLATING SEQUENCE statement specifying a
    collating sequence before you enter the name of that sequence in
    any of the following statements:

    o  CREATE DOMAIN . . . COLLATING SEQUENCE

    o  DROP COLLATING SEQUENCE

    o  ALTER DOMAIN . . . COLLATING SEQUENCE

    o  SHOW COLLATING SEQUENCE

3.1  –  Environment

    You can use the CREATE COLLATING SEQUENCE statement:

    o  In interactive SQL

    o  Embedded in host language programs to be precompiled

    o  As part of a procedure in an SQL module

    o  In dynamic SQL as a statement to be dynamically executed

3.2  –  Format

  CREATE COLLATING SEQUENCE <sequence-name> --+
    +-----------------------------------------+
    +--+-------------------------------------+--+
       +-> STORED NAME IS <stored-name> -----+  |
    +-------------------------------------------+
    +--+-----------------------------------+-+
       +-> COMMENT IS --+-> '<string>' --+-+ |
                        +------ / <------+   |
    +----------------------------------------+
    +----> <ncs-name> +-----------------------+->
                      +-> FROM <library-name> +

3.3  –  Arguments

3.3.1  –  COMMENT_IS

    Adds a comment about the collating sequence. SQL displays the
    text when it executes a SHOW COLLATING SEQUENCE statement in
    interactive SQL. Enclose the comment within single quotation
    marks (')  and separate multiple lines in a comment with a slash
    mark (/).

3.3.2  –  FROM library name

    Specifies the name of an NCS library other than the default. The
    default NCS library is SYS$LIBRARY:NCS$LIBRARY.

3.3.3  –  ncs-name

    Specifies the name of a collating sequence in the default NCS
    library, SYS$LIBRARY:NCS$LIBRARY, or in the NCS library specified
    by the library-name argument.

    The collating sequence can be either one of the predefined NCS
    collating sequences or one that you defined yourself using NCS.

3.3.4  –  sequence-name

    Specifies the name by which the collating sequence named in
    the ncs-name argument is known to the schema. The ncs-name and
    sequence-name arguments can be the same.

3.3.5  –  STORED_NAME_IS

    Specifies a name that Oracle Rdb uses to access a collating
    sequence created in a multischema database. The stored name
    allows you to access multischema definitions using interfaces,
    such as Oracle RMU, the Oracle Rdb management utility, that
    do not recognize multiple schemas in one database. You cannot
    specify a stored name for a collating sequence in a database that
    does not allow multiple schemas.

3.4  –  Example

    Example 1: Creating a French collating sequence

    The following example creates a collating sequence using
    the predefined collating sequence FRENCH. It then shows the
    defined collating sequence by using the SHOW COLLATING SEQUENCE
    statement.

    SQL> CREATE COLLATING SEQUENCE FRENCH FRENCH;
    SQL> --
    SQL> SHOW COLLATING SEQUENCE
    User collating sequences in schema with filename SQL$DATABASE
         FRENCH

    Example 2: Create a Spanish collating sequence specifying more
    than one comment

    SQL> CREATE COLLATING SEQUENCE SPANISH_COL
    cont> COMMENT IS 'first comment' / 'second comment'
    cont> SPANISH;
    SQL> SHOW COLLATING SEQUENCE SPANISH_COL;
         SPANISH_COL
     Comment:       first comment
                    second comment

4  –  DATABASE

    Creates database system files, metadata definitions, and user
    data that comprise a database. The CREATE DATABASE statement
    lets you specify in a single SQL statement all data and privilege
    definitions for a new database. (You can also add definitions to
    the database later.) For information about ways to ensure good
    performance and data consistency, see the Oracle Rdb7 Guide to
    Database Performance and Tuning.

    The many optional elements of the CREATE DATABASE statement
    make it very flexible. In its simplest form, the CREATE DATABASE
    statement creates database system files, specifies their names,
    and determines the physical characteristics of the database.
    Using the optional elements of the CREATE DATABASE statement, you
    can also specify:

    o  Whether the database created with CREATE DATABASE is multifile
       (separate database root file and storage area data file) or
       single file (combined database root file and storage area
       data file). Multifile databases can have many storage areas
       for user data, all separate from the database root file
       created by the CREATE DATABASE statement. Multifile databases
       include CREATE STORAGE AREA clauses in the CREATE DATABASE
       statement to create multiple storage area files for enhanced
       performance.

       The presence or absence of a CREATE STORAGE AREA clause in
       a CREATE DATABASE statement determines whether the database
       is single file or multifile. To create a multifile database,
       you must include a CREATE STORAGE AREA clause in the CREATE
       DATABASE statement. To create a single-file database, do not
       include a CREATE STORAGE AREA clause in the CREATE DATABASE
       statement.

    o  Values for various database root file parameters that override
       the system defaults. Database root file (.rdb) parameters
       describe characteristics of the database root file. Database
       root file parameters affect the entire database, whether it is
       a single-file or a multifile database.

    o  Values for storage area parameters that override system
       defaults. Storage area parameters describe characteristics of
       the database storage area files. In a single-file database,
       because the storage area data file is combined with the
       database root file, storage area parameters apply to a single
       storage area and affect the entire database. In a multifile
       database, storage area parameters specify defaults for the
       main storage area, RDB$SYSTEM, and for any subsequent CREATE
       STORAGE AREA clauses within the CREATE DATABASE statement.

    o  Any number of database elements. Database elements are a
       CREATE CATALOG statement, a CREATE STORAGE AREA clause, or
       a GRANT statement. The CREATE DATABASE statements that create
       single-file databases cannot include a CREATE STORAGE AREA
       clause because this is specific to multifile databases. The
       CREATE DATABASE statements that create multifile databases
       must include at least one CREATE STORAGE AREA clause.

       Unlike the same statements outside a CREATE DATABASE
       statement, database elements do not use statement terminators.
       The first statement terminator that SQL encounters ends the
       CREATE DATABASE statement. Later CREATE or GRANT statements
       are not within the scope of the CREATE DATABASE statement.

    o  The database default character set and national character set.
       For information regarding identifier character sets, database
       default character sets, and national character sets, see the
       Character_Sets HELP topic.

4.1  –  Environment

    You can use the CREATE DATABASE statement:

    o  In interactive SQL

    o  Embedded in host language programs to be precompiled

    o  As part of a procedure in an SQL module

    o  In dynamic SQL as a statement to be dynamically executed

4.2  –  Format

   CREATE DATABASE -+------------------++
                    +-> ALIAS <alias> -+|
  +------------ <-----------------------+
  ++-----------------------------++------------------------------+-+
   +++-> root-file-params-1 ---++++++-> storage-area-params-1 -+++ |
    |+-> root-file-params-2 ---+|  |+-> storage-area-params-2 -+|  |
    |+-> root-file-params-3 ---+|  +-------------- <------------+  |
    |+-> root-file-params-4 ---+|                                  |
    +----------- <--------------+                                  |
  +-------------------------- <------------------------------------+
  ++--------------------+--+-----------------------+--------->
   +-> character-sets --+  ++-> database-element -++
                            +-------- <-----------+

  root-file-params-1 =

  -+-> FILENAME <db-attach-spec> -++----------------------++->
   +-> PATHNAME <path-name>   ----++-> literal-user-auth -+|
   +-> attach-options -------------------------------------+
   +-> COLLATING SEQUENCE <collation-name> -----+          |
   |  +-------------------<---------------------+          |
   |  ++-----------------------------------+----+          |
   |   +-> COMMENT IS ---+-> '<string>' --++    |          |
   |                     +------- / <-----+     |          |
   |  +-------------------<---------------------+          |
   |  +--> <ncs-name> -+-----------------------+-----------+
   |                   +-> FROM <library-name> +           |
   +-> NUMBER OF USERS -------> <number-users> ------------+
   +-> NUMBER OF BUFFERS -----> <number-buffers> ----------+
   +-> NUMBER OF CLUSTER NODES ----> <number-nodes> --+    |
   |     +--------------------------------------------+    |
   |     ++----------------------------------------+-------+
   |      +> ( -+-> SINGLE ---+-> INSTANCE --> ) --+       |
   |            +-> MULTIPLE -+                            |
   +-> NUMBER OF RECOVERY BUFFERS -> <number-buffers> -----+
   +-> BUFFER SIZE IS -> <buffer-blocks> --> BLOCKS -------+

   db-attach-spec =

  --+----------------+-> <file-spec> --->
    +-> <node-spec> -+

  node-spec =

  -+-> <nodename> -+-------------------+-+->
   |               +-> <access-string> + |
   +------------------ :: <--------------+

  access-string =

  -+-> " <user-name> <password> " --+->
   +-> " <VMS-proxy-user-name> " ---+

  literal-user-auth =

  ---> USER '<username>' -+------------------------+-->
                          +-> USING '<password>'  -+

  attach-options =

  -+-> DBKEY -+-> SCOPE IS -+-> ATTACH -------+-----------------------+->
   +-> ROWID -+             +-> TRANSACTION --+                       |
   +-> MULTISCHEMA IS -+-> ON --+-------------------------------------+
   |                   +-> OFF -+                                     |
   +-> PRESTARTED TRANSACTIONS ARE -+-> ON --+------------------------+
   |                                +-> OFF -+                        |
   +-+-------+-> RESTRICTED ACCESS -----------------------------------+
     +-> NO -+

  root-file-params-2 =

  -+-> global-buffer-params -----------------------------------------+->
   +-> SNAPSHOT IS ----+-----> ENABLED -+->  IMMEDIATE +-+-----------+
   |                   |                +->  DEFERRED -+ |           |
   |                   +-----> DISABLED -----------------+           |
   +-> DICTIONARY IS ---+---> REQUIRED -------+----------------------+
   |                    +---> NOT REQUIRED ---+                      |
   +-> ADJUSTABLE LOCK GRANULARITY IS -+-> ENABLED -> alg-options -+-+
   |                                   +-> DISABLED ---------------+ |
   +-> LOCK TIMEOUT INTERVAL IS <number-seconds> SECONDS ------------+
   +-> SEGMENTED STRING -+-> STORAGE AREA IS <area-name> ------------+
   +-> LIST -------------+                                           |
   +-> DEFAULT ----------+                                           |
   +-> PROTECTION IS ---+---> ANSI --+-------------------------------+
   |                    +---> ACLS --+                               |
   +-> RESERVE <n> +-> CACHE SLOTS ----+-----------------------------+
   |               +-> JOURNALS -------+                             |
   |               +-> STORAGE AREAS --+                             |
   |               +-> SEQUENCES ------+                             |
   +-+-> SET ---+-> TRANSACTION MODES --> ( -+-> txn-modes -+-> ) ---+
     +-> ALTER -+                            +----- , <-----+

  global-buffer-params=

  --> GLOBAL BUFFERS ARE -+-> ENABLED --+--------------+
                          +-> DISABLED -+              |
  +----------------------------------------------------+
  +---------------------------------------------------+--->
  +> ( -++-> NUMBER IS <number-glo-buffers> ----++> ) +
        |+-> USER LIMIT IS <max-glo-buffers> ---+|
        |+-> PAGE TRANSFER VIA --+-> DISK ---+--+|
        ||                       +-> MEMORY -+   |
        |+-> LARGE MEMORY IS --+--> ENABLED --+--+
        |                      +--> DISABLED -+  |
        +-------------------  , <----------------+

  alg-options =

  --+------------------------------+-->
    +-> ( --> COUNT IS <n> --> ) --+

  txn-modes =

  -+-+-------+-+-> READ ONLY -----------------+-->
   | +-> NO -+ +-> READ WRITE ----------------+
   |           +-> BATCH UPDATE --------------+
   |           +-> SHARED ----+--+----------+-+
   |           +-> PROTECTED -+  +-> READ --+ |
   |           +-> EXCLUSIVE -+  +-> WRITE -+ |
   +-------------> ALL -----------------------+
   +-------------> NONE ----------------------+

  root-file-params-3 =

  -+> CARDINALITY COLLECTION IS -------------------------++> ENABLED -+-+
   +> CARRY OVER LOCKS ARE ------------------------------++> DISABLED + |
   +> GALAXY SUPPORT IS ---------------------------------+              |
   +> LOCK PARTITIONING IS ------------------------------+              |
   +> LOGMINER SUPPORT IS -------------------------------+              |
   +> METADATA CHANGES ARE ------------------------------+              |
   +> STATISTICS COLLECTION IS --------------------------+              |
   +> WORKLOAD COLLECTION IS ----------------------------+              |
   +> SYSTEM INDEX -+-> COMPRESSION IS -+-> ENABLED ---+-----+----------+
   |                |                   +-> DISABLED --+     |          |
   |                +-> ( -+-> system-index-options -+-> ) --+          |
   |                       +---------- , <-----------+                  |
   +> prestarted-transaction-params ------------------------------------+
   +> SECURITY CHECKING IS --> security-checking-options ---------------+
   +> SYNONYMS ARE ENABLED ---------------------------------------------+
   +> NOTIFY IS -+-> ENABLED --> notify-options  -+---------------------+
                 +-> DISABLED --------------------+

  system-index-options =

  -+-> COMPRESSION IS --------------------------------++- ENABLED -++->
   +-> PREFIX CARDINALITY COLLECTION IS --------------++> DISABLED +|
   +-> PREFIX CARDINALITY COLLECTION IS ENABLED FULL ---------------+
   +-> TYPE IS SORTED --+-----------+-------------------------------+
                        +-> RANKED -+

  prestarted-transaction-params =

  -> PRESTARTED TRANSACTIONS ARE -++--> ENABLED -++----------------------------++>
                                  |+--> ON  -----++->(prestart-trans-options) -+|
                                  +-+-> DISABLED --+----------------------------+
                                    +-> OFF -------+

  prestart-trans-options =

  -+---------------------------------+->
   +-> WAIT <n> SECONDS FOR TIMEOUT -+
   +-> WAIT <n> MINUTES FOR TIMEOUT -+
   +-> NO TIMEOUT -------------------+

  security-checking-options =

  -+-> EXTERNAL -+------------------------------------------------++->
   |             +-> ( -> PERSONA SUPPORT IS -+-> ENABLED --+> ) -+|
   |                                          +-> DISABLED -+      |
   +-> INTERNAL -+-----------------------------------------------+-+
                 +-> ( -> ACCOUNT CHECK IS -+---> ENABLED --+> ) +
                                            +---> DISABLED -+

  notify-options =

  --+-----------------------------------------------------+-->
    +--> ( ALERT OPERATOR -+-->  operator-class  -+-- ) --+
                           +--------- + <---------+

  root-file-params-4 =

  -+-> ASYNC BATCH WRITES ARE +> ENABLED -> async-bat-wr-options -+---+->
   |                          +> DISABLED ------------------------+   |
   ++------------+-> ASYNC PREFETCH IS --+                            |
   |+> DETECTED -+   +-------------------+                            |
   |                 +-+-> ENABLED ---> async-prefetch-options +------+
   |                   +-> DISABLED ---------------------------+      |
   +-> ROW CACHE IS -+-> ENABLED --+-+----------------------+---------+
   |                 +-> DISABLED -+ +-> row-cache-options -+         |
   +-+------+-> INCREMENTAL BACKUP SCAN OPTIMIZATION -----------------+
   | +> NO -+                                                         |
   +-> MULTITHREAD AREA ADDITIONS ----> multithread-options ----------+
   +-> RECOVERY JOURNAL -> ( -> ruj-options -> ) ---------------------+
   +-> OPEN IS -+> MANUAL --------------------------------------------+
   |            +> AUTOMATIC -+--------------------------------------++
   |                          +->(WAIT <n> -> MINUTES -> FOR CLOSE) -+|
   +-> SHARED MEMORY IS -+-> SYSTEM -------------------+--------------+
                         +-> PROCESS -+-------------+--+
                                      +-> RESIDENT -+

  asynch-bat-wr-options =

  -+----------------------------->-------------------------------+->
   + ( ++-> CLEAN BUFFER COUNT IS <buffer-count> BUFFERS --++> ) +
       |+-> MAXIMUM BUFFER COUNT IS <buffer-count> BUFFERS +|
       +------------------- , <-----------------------------+

  async-prefetch-options =

  --+-----------------------------------------------------------+>
    +-> ( -+-+-> DEPTH IS <number-buffers> BUFFERS -----+--+> )-+
           | +-> THRESHOLD IS <number-buffers> BUFFERS -+  |
           +----------------- , <--------------------------+

  row-cache-options =

  -> ( -++-> CHECKPOINT -+-> ALL ROWS TO BACKING FILE -----------+-++-> ) -->
        ||               +-> TIMED EVERY <n> SECONDS ------------+ ||
        ||               +-> UPDATED ROWS TO -+-> BACKING FILE -++ ||
        ||                                    +-> DATABASE -----+  ||
        |+-> LOCATION IS --> <directory-spec> ---------------------+|
        |+-> NO --+--> LOCATION --------+--------------------------+|
        ||        +--> SWEEP INTERVAL --+                          ||
        |+-> NUMBER OF SWEEP ROWS IS <n> --------------------------+|
        |+-> SWEEP INTERVAL IS <n> SECONDS ------------------------+|
        +-------------------------- , <-----------------------------+

  multithread-options =

  ---+-----------------------------------------+-->
     +-> ( --+-> ALL AREAS -----------+--> ) --+
             +-> LIMIT TO <n> AREAS --+

  ruj-options =

  -+-> LOCATION IS --> <directory-spec> -+-->
   +-> NO LOCATION ----------------------+
   +-> BUFFER MEMORY IS -+-> LOCAL ------+
                         +-> GLOBAL -----+

  storage-area-params-1 =

  --+-> ALLOCATION IS ---> <number-pages> --> PAGES -----+->
    +-> CACHE USING <row-cache-name> --------------------+
    +-> NO ROW CACHE ------------------------------------+
    +-> extent-params -----------------------------------+
    +-> INTERVAL IS --> <number-data-pages> -------------+
    +-> LOCKING IS --+-> ROW --+--> LEVEL ---------------+
    |                +-> PAGE -+                         |
    +-> PAGE FORMAT IS +-> UNIFORM -+--------------------+
    |                  +-> MIXED ---+                    |
    +-> PAGE SIZE IS ----> <page-blocks> --> BLOCKS -----+

  extent-params =

  --+-> EXTENT IS -+-> ENABLED -------------------++-->
    |              +-> DISABLED ------------------+|
    |              +-> <extent-pages> --> PAGES --+|
    |              +-> (extension-options) -------+|
    +---------------------<------------------------+

  extension-options =

  ---> MINIMUM OF <min-pages> PAGES, --+
  +------------------------------------+
  +--> MAXIMUM OF <max-pages> PAGES, --+
  +------------------------------------+
  +--> PERCENT GROWTH IS <growth> ------->

  storage-area-params-2 =

  --+-> CHECKSUM CALCULATION IS -----------+--+-> ENABLED --+-+->
    +-> SNAPSHOT CHECKSUM CALCULATION IS --+  +-> DISABLED -+ |
    +-> SNAPSHOT ALLOCATION IS --> <snp-pages> ----> PAGES ---+
    +-> SNAPSHOT EXTENT IS -+-> <extent-pages> ----> PAGES --++
    |                       +-> (extension-options) ---------+|
    +-> SNAPSHOT FILENAME --> <file-spec> --------------------+
    +-> THRESHOLDS ARE ( <val1> +-----------------------+> ) -+
    |                           +> ,<val2> -+----------++     |
    |                                       +> ,<val3> +      |
    +------------------------------<--------------------------+

  character-sets =

  -+-+--> DEFAULT CHARACTER SET <support-char-set> --+-+->
   | +--> NATIONAL CHARACTER SET <support-char-set> -+ |
   | +--> IDENTIFIER CHARACTER SET <names-char-set> -+ |
   | +--> DISPLAY CHARACTER SET <support-char-set> ----+
   +---------------------- <---------------------------+

  database-element =

  -+-> create-cache-clause -----------------+-->
   +-> create-catalog-statement ------------+
   +-> create-collating-sequence-statement -+
   +-> create-domain-statement -------------+
   +-> create-function-statement -----------+
   +-> create-index-statement --------------+
   +-> create-module-statement -------------+
   +-> create-procedure-statement ----------+
   +-> create-sequence-statement -----------+
   +-> create-schema-statement -------------+
   +-> create-storage-area-clause ----------+
   +-> create-storage-map-statement --------+
   +-> create-table-statement --------------+
   +-> create-trigger-statement ------------+
   +-> create-view-statement ---------------+
   +-> grant-statement ---------------------+

4.3  –  Arguments

4.3.1  –  ADJUSTABLE_LOCK_GRANULARITY

    Syntax options:

       ADJUSTABLE LOCK GRANULARITY IS ENABLED
       ADJUSTABLE LOCK GRANULARITY IS DISABLED

 Enables or disables whether or not the database system automatically
 maintains as few locks as possible on database resources. The
 default is ENABLED and results in fewer locks against the database.
 However, if contention for database resources is high, the automatic
 adjustment of locks can become a CPU drain. Such databases can trade
 more restrictive locking for less CPU usage by disabling adjustable
 lock granularity.

4.3.2  –  alias

    Specifies the alias for the implicit database declaration
    executed by the CREATE DATABASE statement. An alias is a name for
    a particular attach to a database that identifies that database
    in subsequent SQL statements.

                                   NOTE

       If you attach to a database using an alias, you must use
       that alias in subsequent statements to qualify the names of
       elements in that database.

    If you omit the FILENAME argument from the database root file
    parameters, SQL also uses the alias as the file name for the
    database root file and creates the root file in the current
    default directory. (SQL generates a syntax error if you include
    a disk or directory specification in the alias clause.) You must
    specify either the FILENAME or alias argument.

    Schema elements in the CREATE DATABASE statement do not need to
    use the alias, however, they cannot specify any other alias.

    The alias clause is optional. The default alias in interactive
    SQL and in precompiled programs is RDB$DBHANDLE. In the SQL
    module language, the default is the alias specified in the
    module header. Using the default alias (either by specifying
    it explicitly in the ALIAS clause or omitting the ALIAS clause)
    declares the database as the default database. Specifying a
    default database means that statements outside the CREATE
    DATABASE statement that refer to the default database do not
    need to use an alias.

    If a default database was already declared, and you specify the
    default alias in the ALIAS clause (or specify any alias that was
    already declared), the results depend on the environment in which
    you issue the CREATE DATABASE statement.

    o  In interactive SQL, you receive a prompt asking if you want
       to override the default database declaration. Unless you
       explicitly override the default declaration, the CREATE
       DATABASE statement fails.

       SQL> -- Assume a default database has been declared:
       SQL> --
       SQL> -- Now create a database without an alias.
       SQL> -- SQL asks if you want to override the default:
       SQL> CREATE DATABASE FILENAME test;
       This alias has already been declared.
       Would you like to override this declaration (No)? NO
       %SQL-F-DEFDBDEC, A database has already been declared with the default
       alias

    o  In embedded SQL or in the SQL module language, specifying
       an already-declared alias in the CREATE DATABASE statement
       generates an error when you precompile the program or compile
       the module.

    o  In dynamic SQL, specifying an already-declared alias overrides
       the earlier declaration.

    For more information about default databases, see the User_
    Supplied_Names HELP topic.

4.3.3  –  ALL_AREAS

    Specifies that all storage areas be created and initialized in
    parallel.

    All storage areas are created asynchronously. If you are creating
    a large number of storage areas, you may exceed process quotas,
    resulting in the database creation failing.

4.3.4  –  ALLOCATION n pages

    The number of database pages allocated to the database initially.
    SQL automatically extends the allocation to handle the loading of
    data and subsequent expansion. Pages are allocated in groups of
    3. An ALLOCATION of 25 pages would actually provide for 27 pages.
    The default is 700 pages. If you are loading a large database, a
    large allocation helps to prevent fragmented files.

4.3.5  –  ALTER_TRANSACTION_MODES

    Enables the modes specified, leaving the previously defined or
    default modes enabled. For example, if the only transaction
    mode you want to disable are batch updates, use the following
    statement:

    SQL> CREATE DATABASE FILENAME mf_personnel
    cont>   ALTER TRANSACTION MODES (NO BATCH UPDATE);

    If not specified, the default transaction mode is ALL.

4.3.6  –  ASYNC_BATCH_WRITES

    Syntax options:

    ASYNC BATCH WRITES ARE ENABLED | ASYNC BATCH WRITES ARE DISABLED

    Specifies whether asynchronous batch-writes are enabled or
    disabled.

    Asynchronous batch-writes allow a process to write batches of
    modified data pages to disk asynchronously (the process does not
    stall while waiting for the batch-write operation to complete).
    Asynchronous batch-writes improve the performance of update
    applications without the loss of data integrity.

    By default, batch-writes are enabled. For more information about
    when to use asynchronous batch-writes, see the Oracle Rdb7 Guide
    to Database Performance and Tuning.

    You can enable asynchronous batch-writes by defining the logical
    name RDM$BIND_ABW_ENABLED.

4.3.7  –  ASYNC_PREFETCH

    Syntax options:

    ASYNC PREFETCH IS ENABLED | ASYNC PREFETCH IS DISABLED

    Specifies whether or not Oracle Rdb reduces the amount of time
    that a process waits for pages to be read from disk by fetching
    pages before a process actually requests the pages.

    Prefetch can significantly improve performance, but it may
    cause excessive resource usage if it is used inappropriately.
    Asynchronous prefetch is enabled by default. For more information
    about asynchronous prefetch, see the Oracle Rdb7 Guide to
    Database Performance and Tuning.

    You can enable asynchronous prefetch by defining the logical name
    RDM$BIND_APF_ENABLED.

4.3.8  –  BUFFER_SIZE

    Specifies the number of blocks SQL allocates per buffer. You need
    to specify an unsigned integer greater than zero. The default
    buffer size is 3 times the PAGE SIZE value (6 blocks for the
    default PAGE SIZE of 2).

    The buffer size is a global parameter and the number of blocks
    per page (or buffer) is constrained to less than 64 blocks
    per page. The page size can vary by storage area for multifile
    databases, and the page size should be determined by the sizes of
    the records that will be stored in each storage area.

    When choosing the number of blocks per buffer, choose a number so
    that a round number of pages fits in the buffer. In other words,
    the buffer size is wholly divisible by all page sizes for all
    storage areas in your multifile database. For example, if you
    have three storage areas with page sizes of 2, 3, and 4 blocks
    each respectively, choosing a buffer size of 12 blocks ensures
    optimal buffer utilization. In contrast, choosing a buffer size
    of 8 wastes 2 blocks per buffer for the storage area with a page
    size of 3 pages. Oracle Rdb reads as many pages as fit into the
    buffer; in this instance it reads two 3-block pages into the
    buffer, leaving 2 wasted blocks.

4.3.9  –  CACHE_USING

    Assigns the named row cache as the default for all storage areas
    in the database. All rows stored in an area, whether they consist
    of table data, segmented string data, or special rows such as
    index nodes, are cached.

    You must create the row cache before terminating the CREATE
    DATABASE statement. For example:

    SQL> CREATE DATABASE FILENAME test_db
    cont> ROW CACHE IS ENABLED
    cont> CACHE USING test1
    cont> CREATE CACHE test1
    cont>    CACHE SIZE IS 100 ROWS
    cont> CREATE STORAGE AREA area1;

    You can override the database default row cache by either
    specifying the CACHE USING clause after the CREATE STORAGE AREA
    clause or by later altering the database and storage area to
    assign a new row cache. Only one row cache is allowed for each
    storage area.

    If you do not specify the CACHE USING clause or the NO ROW CACHE
    clause, NO ROW CACHE is the default for the database.

4.3.10  –  CARDINALITY_COLLECTION

    Syntax options:

       CARDINALITY COLLECTION IS ENABLED
       CARDINALITY COLLECTION IS DISABLED

 Specifies whether or not the optimizer records cardinality
 updates in the system table. When enabled, the optimizer collects
 cardinalities for the table and non-unique indexes as rows are
 inserted or deleted from tables. The update of the cardinalities
 is performed at commit time, if sufficient changes have accumulated,
 or at disconnect time.

    In high update environments, it may be more convenient to
    disable cardinality updates. If you disable this feature, you
    should manually maintain the cardinalities using the RMU Analyze
    Cardinality command so the optimizer is given the most accurate
    values for estimation purposes.

    Cardinality collection is enabled by default.

4.3.11  –  CARRY_OVER_LOCKS

    Syntax options:

    CARRY OVER LOCKS ARE ENABLED | CARRY OVER LOCKS ARE DISABLED

    Enables or disables carry-over lock optimization. Carry-over
    locks are enabled by default.

    While attached to the database, a process can have some active
    locks (locks attached to the database) and some carry-over
    locks (locks requested in earlier transactions that have not
    been demoted). If a transaction needs a lock it has currently
    marked as carry-over, it can reuse the lock by changing it to an
    active lock. The same lock can go from active to carry-over to
    active multiple times without paying the cost of lock request and
    demotion. This substantially reduces the number of lock requests
    if a process accesses the same areas repeatedly.

    As part of the carry-over lock optimization, a NOWAIT transaction
    requests, acquires, and holds a NOWAIT lock. This signals other
    processes accessing the database that a NOWAIT transaction exists
    and causes Oracle Rdb to release all carry-over locks. If NOWAIT
    transactions are noticeably slow when executing, you can specify
    CARRY OVER LOCKS ARE DISABLED with the ALTER DATABASE or CREATE
    DATABASE statement.

    This feature is available as an online database modification.

4.3.12  –  CHECKPOINT_TIMED

    Syntax option:

    CHECKPOINT TIMED EVERY n SECONDS

    For the row-cache-options clause, specifies the frequency with
    which the row-cache server (RCS) process checkpoints the contents
    of the row caches back to disk. The RCS process does not use the
    checkpoint frequency options of the FAST COMMIT clause.

    The frequency of RCS checkpointing is important in determining
    how much of an .aij file must be read during a recovery operation
    following a node failure. It also affects the frequency with
    which marked records get flushed back to the database for those
    row caches that checkpoint to the database. The default is every
    15 minutes (900 seconds).

4.3.13  –  Checkpoint Rows

    Syntax options:

    CHECKPOINT UPDATED ROWS TO BACKING FILE

    CHECKPOINT UPDATED ROWS TO DATABASE

    CHECKPOINT ALL ROWS TO BACKING FILE

    Specifies the default source and target during checkpoint
    operations for all row caches. If ALL ROWS is specified, then the
    source records written during each checkpoint operation are both
    the modified and the unmodified rows in a row cache. If UPDATED
    ROWS is specified, then just the modified rows in a row cache are
    checkpointed each time.

    If the target of the checkpoint operation is BACKING FILE,
    then the RCS process writes the source row cache entries to
    the backing (.rdc) files. The row cache LOCATION, ALLOCATION,
    and EXTENT clauses are used to create the backing files. Upon
    recovery from a node failure, the database recovery process is
    able to repopulate the row caches in memory from the rows found
    in the backing files.

    If the target is DATABASE, then updated row cache entries
    are written back to the database. The row cache LOCATION,
    ALLOCATION, and EXTENT clauses are ignored. Upon recovery from
    a node failure, the database recovery process has no data on the
    contents of the row cache. Therefore, it does not repopulate the
    row caches in memory.

    The CHECKPOINT clause of the CREATE CACHE, ADD CACHE, or ALTER
    CACHE clause overrides this database-level CHECKPOINT clause.

4.3.14  –  CHECKSUM_CALCULATION

    Syntax options:

       CHECKSUM CALCULATION IS ENABLED
       CHECKSUM CALCULATION IS DISABLED

 This option allows you to enable or disable calculations of page
 checksums when pages are read from or written to the storage area or
 snapshot files.

    The default is ENABLED.

                                   NOTE

       Oracle Corporation recommends that you leave checksum
       calculations enabled, which is the default.

    With current technology, it is possible that errors may occur
    that the checksum calculation can detect but that may not
    be detected by either the hardware, firmware, or software.
    Unexpected application results and database corruption may occur
    if corrupt pages exist in memory or on disk but are not detected.

    Oracle Corporation recommends performing checksum calculations,
    except in the following specific circumstances:

    o  Your application is stable and has run without errors on the
       current hardware and software configuration for an extended
       period of time.

    o  You have reached maximum CPU utilization in your current
       configuration. Actual CPU utilization by the checksum
       calculation depends primarily on the size of the database
       pages in your database. The larger the database page, the
       more noticeable the CPU usage by the checksum calculation may
       become.

                                   NOTE

       Oracle Corporation recommends that you carefully evaluate
       the trade-off between reducing CPU usage by the checksum
       calculation and the potential for loss of database integrity
       if checksum calculations are disabled.

    Oracle Rdb allows you to disable and, subsequently, re-enable
    checksum calculation without error. However, once checksum
    calculations have been disabled, corrupt pages may not be
    detected even if checksum calculations are subsequently re-
    enabled.

4.3.15  –  CLEAN_BUFFER_COUNT

    Syntax options:

    CLEAN BUFFER COUNT IS buffer-count BUFFERS

    Specifies the number of buffers to be kept available for
    immediate reuse.

    Oracle Rdb maintains the number of buffers at the end of a
    process' least recently used queue of buffers for replacement.

    The default is five buffers. The minimum value is one; the
    maximum value can be as large as the buffer pool size.

    You can override the number of clean buffers by defining the
    logical name RDM$BIND_CLEAN_BUF_CNT. For information about how to
    set the values, see the Oracle Rdb7 Guide to Database Performance
    and Tuning.

4.3.16  –  COLLATING_SEQUENCE

    Specifies a default collating sequence to be used for all CHAR
    and VARCHAR columns in the database. SQL uses the default
    collating sequence if you do not specify a collating sequence
    in subsequent CREATE DOMAIN statements.

    Collation-name is a name of your choosing; you must use this name
    in any COLLATING SEQUENCE clauses that refer to this collating
    sequence for operations on this database.

4.3.17  –  COMMENT

    Syntax option:

    COMMENT IS 'string'

    Adds a comment about the collating sequence. SQL displays the
    text when it executes a SHOW COLLATING SEQUENCE statement in
    interactive SQL. Enclose the comment in single quotation marks
    (')  and separate multiple lines in a comment with a slash mark
    (/).

4.3.18  –  COUNT IS n

    Specifies the number of levels on the page lock tree used to
    manage locks. For example, if you specify COUNT IS 3, the fanout
    factor is (10, 100, 1000). Oracle Rdb locks a range of 1000 pages
    and adjusts downward to 100 and then to 10 and then to 1 page
    when necessary.

    If the COUNT IS clause is omitted, the default is 3. The value of
    n can range from 1 through 8.

4.3.19  –  create-cache-clause

    See the CREATE CACHE clause for more details.

4.3.20  –  create-catalog-statement

    See the CREATE CATALOG statement for details.

    If you want to specify a CREATE CATALOG statement in a CREATE
    DATABASE statement, you must first specify a MULTISCHEMA IS ON
    clause in the same CREATE DATABASE statement.

    The CREATE CATALOG statement is committed immediately and cannot
    be rolled back. Before you specify the CREATE CATALOG statement,
    the following conditions must be true:

    o  The database is enabled for multischema.

    o  No transactions are active.

    o  The catalog alias must be the same as the database alias.

    For information about enabling the database for multischema, see
    the User_Supplied_Names HELP topic.

4.3.21  –  create-collating-sequence-statement

    See the CREATE COLLATING_SEQUENCE statement for details.

    If you want to specify a collating sequence in a CREATE DOMAIN
    statement embedded in a CREATE DATABASE statement, you must first
    specify a CREATE COLLATING SEQUENCE statement in the same CREATE
    DATABASE statement.

4.3.22  –  create-domain-statement

    See the CREATE DOMAIN statement for details.

    You cannot use the FROM path-name clause when embedding a
    CREATE DOMAIN statement in a CREATE DATABASE statement. You
    can, however, issue a separate CREATE DOMAIN statement following
    the CREATE DATABASE statement. You can also describe the domain
    directly in the CREATE DATABASE statement.

    If you want to specify a collating sequence in your embedded
    CREATE DOMAIN statement, you must first specify a CREATE
    COLLATING SEQUENCE statement in the same CREATE DATABASE
    statement.

4.3.23  –  create-function-statement

    A CREATE FUNCTION statement. See the CREATE Routine statement for
    details.

4.3.24  –  create-index-statement

    See the CREATE INDEX statement for details.

4.3.25  –  create-module-statement

    See the CREATE MODULE statement for details.

4.3.26  –  create-procedure-statement

    A CREATE PROCEDURE statement. See the CREATE Routine statement
    for details.

4.3.27  –  create-schema-statement

    See the CREATE SCHEMA statement for details.

    The schema you create must have the same alias as the catalog and
    database that contain the schema, or they must share the default
    alias.

4.3.28  –  create-sequence-statement

    See the CREATE SEQUENCE statement for details.

4.3.29  –  create-storage-area-clause

    See the CREATE STORAGE_AREA statement for more details.

4.3.30  –  create-storage-map-statement

    See the CREATE STORAGE_MAP statement for details.

4.3.31  –  create-table-statement

    See the CREATE TABLE statement for details.

    You cannot use the FROM path-name clause when embedding a CREATE
    TABLE statement in a CREATE DATABASE statement. You can, however,
    issue a separate CREATE TABLE statement following the CREATE
    DATABASE statement. You can also describe the table directly in
    the CREATE DATABASE statement.

    The CREATE TABLE statements in a CREATE DATABASE statement can
    refer to domains not yet created, provided that CREATE DOMAIN
    statements for the domains are in the same CREATE DATABASE
    statement.

4.3.32  –  create-trigger-statement

    See the CREATE TRIGGER statement for details.

4.3.33  –  create-view-statement

    See the CREATE VIEW statement for details.

4.3.34  –  database-element

    Database elements are a CREATE STORAGE AREA clause, any of the
    CREATE statements (except CREATE DOMAIN . . . FROM path-name and
    CREATE TABLE . . . FROM path-name), or a GRANT statement.

4.3.35  –  DBKEY_SCOPE

    Syntax options:

    DBKEY SCOPE IS ATTACH | DBKEY SCOPE IS TRANSACTION

    Controls when the database key of a deleted row can be used again
    by SQL. This setting is not a database root file parameter, but
    a characteristic of the implicit database attach executed by
    the CREATE DATABASE statement. Thus, the DBKEY SCOPE clause in a
    CREATE DATABASE statement takes effect only for the duration of
    the session of the user who entered the statement.

    o  The default DBKEY SCOPE IS TRANSACTION means that SQL can
       reuse the database key of a deleted table row (to refer to a
       newly inserted row) as soon as the transaction that deleted
       the original row completes with a COMMIT statement. (If the
       user who deleted the original row enters a ROLLBACK statement,
       then the database key for that row cannot be used again by
       SQL.)

       During the connection of the user who entered the CREATE
       DATABASE statement, the DBKEY SCOPE IS TRANSACTION clause
       specifies that a database key is guaranteed to refer to the
       same row only within a particular transaction.

    o  The DBKEY SCOPE IS ATTACH clause means that SQL cannot use the
       database key again (to refer to a newly inserted row) until
       all users who have attached with DBKEY SCOPE IS ATTACH have
       detached from the database.

       Also it only requires one process to attach with DBKEY
       SCOPE IS ATTACH to force all database users to assume this
       characteristic.

    o  Oracle Corporation recommends using DBKEY SCOPE IS TRANSACTION
       to prevent excessive consumption of storage area space by
       overhead needed to support DBKEY SCOPE IS ATTACH, and to
       prevent performance problems when storing new rows.

       During the connection of the user who entered the CREATE
       DATABASE statement, the DBKEY SCOPE IS ATTACH clause specifies
       that a database key is guaranteed to refer to the same row
       until the user detaches from the database.

    For more information, see the DBKEY HELP topic.

4.3.36  –  DEFAULT_CHARACTER_SET

    Specifies the database default character set for this database.
    For a list of allowable character set names, see Supported
    Character Sets.

4.3.37  –  DEFAULT_STORAGE_AREA

    Specifies a default storage area to which all user data and
    unmapped indexes are stored. The DEFAULT STORAGE AREA parameter
    separates user data from the system data, such as system tables.
    RDB$SYSTEM is the default area if you do not specify a default
    storage area.

    In addition to user data, Oracle Rdb stores the following system
    tables in the default storage area:

    o  RDB$INTERRELATIONS

    o  RDB$MODULES

    o  RDB$ROUTINES

    o  RDB$PARAMETERS

    o  RDB$QUERY_OUTLINES

    o  RDB$SEQUENCES

    o  RDB$PROFILES

    o  RDB$GRANTED_PROFILES

    o  RDB$TYPES

    o  RDB$TYPE_FIELDS

    o  RDB$WORKLOAD

    o  RDB$OBJECT_SYNONYMS

    o  RDB$SYNONYMS

    o  RDB$CATALOG_SCHEMA

    For information on moving these system tables to other
    storage areas, see the Oracle Rdb Guide to Database Design and
    Definition.

    The DEFAULT STORAGE AREA parameter must reference an existing
    storage area. You must create the storage area using the CREATE
    STORAGE AREA clause in the same CREATE DATABASE statement as the
    DEFAULT STORAGE AREA parameter.

4.3.38  –  DEPTH buffers option

    Syntax option:

    DEPTH IS number-buffers BUFFERS

    Specifies the number of buffers to prefetch for a process.

    The default is one-quarter of the buffer pool, but not more than
    eight buffers. You can override the number of buffers specified
    in the CREATE or ALTER DATABASE statements by using the logical
    name RDM$BIND_APF_DEPTH.

    You can also specify this option with the DETECTED ASYNC PREFETCH
    clause.

4.3.39  –  DETECTED_ASYNC_PREFETCH

    Syntax options:

       DETECTED ASYNC PREFETCH IS ENABLED
       DETECTED ASYNC PREFETCH IS DISABLED

 Specifies whether or not Oracle Rdb reduces the amount of time that
 a process waits for pages to be read from disk.

    By using heuristics, detected asynchronous prefetch determines if
    an I/O pattern is sequential in behavior even if sequential I/O
    is not actually executing at the time. For example, when a LIST
    OF BYTE VARYING column is fetched, the heuristics detect that
    the pages being fetched are sequential and asynchronously fetches
    pages further in the sequence. This avoids wait times when the
    page is really needed.

    Detected asynchronous prefetch is enabled by default.

4.3.40  –  DICTIONARY

    Syntax options:

    DICTIONARY IS REQUIRED | DICTIONARY IS NOT REQUIRED

    Specifies whether or not definition statements issued for the
    database must also be stored in the repository. If you specify
    REQUIRED, any data definition statements issued after a DECLARE
    DATABASE statement that does not use the PATHNAME argument fails.

    If you omit the PATHNAME clause from the database root file
    parameters in the CREATE DATABASE statement, SQL generates an
    error if you also specify DICTIONARY IS REQUIRED.

    The default is DICTIONARY IS NOT REQUIRED.

4.3.41  –  DISPLAY_CHARACTER_SET

    Specifies the character set encoding and characteristics expected
    of text strings returned back to SQL from Oracle Rdb.

4.3.42  –  EXTENT clause

    Syntax options:

    EXTENT IS ENABLED | EXTENT IS DISABLED

    Enables or disables extents. Extents are enabled by default.

    You can encounter performance problems when creating hashed
    indexes in storage areas with the mixed page format if the
    storage area was created specifying the wrong size for the area
    and if extents are enabled. By disabling extents, this problem
    can be diagnosed early and corrected to improve performance.

4.3.43  –  EXTENT pages

    Syntax options:

    EXTENT IS extent-pages PAGES| EXTENT IS (extension-options)

    Specifies the number of pages of each storage area file extent.
    For more information, see the SNAPSHOT EXTENT argument.

4.3.44  –  FILENAME file spec

    The file specification associated with the database.

    You can omit the FILENAME clause if you specify the ALIAS clause.
    If you omit the FILENAME clause, the file specification uses the
    following defaults:

    o  Device: the current device for the process

    o  Directory: the current directory for the process

    o  File name: the alias, if any was specified; otherwise omitting
       the FILENAME clause generates an error

    Use either a full file specification or a partial file
    specification.

    You can use a logical name for all or part of a file
    specification.

    If you use a simple file name, SQL creates the database in the
    current default directory. Because the CREATE DATABASE statement
    may create more than one file with different file extensions, do
    not specify a file extension with the file specification.

    The file specification may contain an OpenVMS remote node
    specification. Oracle Rdb must be installed on that remote node
    so that the CREATE DATABASE statement can be executed remotely.
    Note that all other file specifications in the command (storage
    areas, snapshot files, recovery journal location, and so on) must
    be specified using the logical names and device names relative to
    that remote node.

    The number and type of files created using the file specification
    in the FILENAME clause depend on whether you create a multifile
    or single-file database.

    o  In multifile CREATE DATABASE statements (any that include
       CREATE STORAGE AREA clauses), SQL uses the file specification
       to create up to three files:

       -  A database root file with an .rdb file extension

       -  A storage area file, with an .rda file extension, for the
          main storage area, RDB$SYSTEM, (unless the CREATE DATABASE
          statement contains a CREATE STORAGE AREA RDB$SYSTEM clause,
          which overrides this file specification)

       -  A snapshot file, with an .snp file extension, for the
          main storage area, RDB$SYSTEM (unless the CREATE DATABASE
          statement contains a CREATE STORAGE AREA RDB$SYSTEM clause,
          which overrides this file specification)

    o  In single-file CREATE DATABASE statements (any that omit the
       CREATE STORAGE AREA clause), SQL uses the file specification
       to create two files:

       -  A combined root and data file with an .rdb file extension

       -  A snapshot file with an .snp file extension

       If you create a single-file database, you cannot later create
       additional data and snapshot files with ALTER DATABASE . . .
       ADD STORAGE AREA statements. If you want to change a database
       from a single-file to a multifile database, you must use the
       EXPORT and IMPORT statements.

4.3.45  –  FROM library name

    Specifies the name of an NCS library other than the default
    library. The default NCS library is SYS$LIBRARY:NCS$LIBRARY.

4.3.46  –  GALAXY_SUPPORT

    Syntax options:

    GALAXY SUPPORT IS ENABLED|GALAXY SUPPORT IS DISABLED

    Allows global memory to be shared in an OpenVMS Galaxy
    configuration. Galaxy support is disabled by default.

    OpenVMS Galaxy is a software architecture for the OpenVMS Alpha
    operating system that enables multiple instances of OpenVMS to
    execute cooperatively in a single computer. An instance refers
    to a copy of the OpenVMS Alpha operating system. As an extension
    of the existing OpenVMS cluster support within Oracle Rdb, Oracle
    Rdb provides support for databases opened on multiple instances
    (or nodes) within a Galaxy system to share data structures in
    memory. Within an Oracle Rdb Galaxy environment, all instances
    with an open database share:

    o  Database root objects (for example, TSN blocks and SEQ blocks)

    o  Global buffers (if enabled)

    o  Row caches and Row Cache Server process (RCS) (if enabled)

4.3.47  –  GLOBAL_BUFFERS

    Syntax options:

    GLOBAL BUFFERS ARE ENABLED | GLOBAL BUFFERS ARE DISABLED

    Specifies that Oracle Rdb maintains one global buffer pool
    per VMScluster node for each database. By default, Oracle Rdb
    maintains a local buffer pool for each attach. For more than one
    attach to use the same page, each must read it from disk into
    its local buffer pool. A page in the global buffer pool may be
    read by more than one attach at the same time, although only one
    process reads the page from the disk into the global buffer pool.
    Global buffering provides improved performance because I/O is
    reduced and memory is better utilized.

                                   NOTE

       If GALAXY SUPPORT is enabled, then a single global buffer
       pool is shared by all Galaxy nodes.

4.3.48  –  grant-statement

    See the GRANT statement for details.

4.3.49  –  IDENTIFIER_CHARACTER_SET

    Specifies the identifier character set for user-supplied database
    object names, such as table names and column names. The character
    set must contain ASCII characters. See the Oracle Rdb SQL
    Reference Manual for a list of allowable character sets.

4.3.50  –  INCREMENTAL_BACKUP_SCAN_OPTIMIZATION

    Syntax option:

       INCREMENTAL BACKUP SCAN OPTIMIZATION
       NO INCREMENTAL BACKUP SCAN OPTIMIZATION

 Specifies whether Oracle Rdb checks each area's SPAM pages or each
 database page to find changes during incremental backup.

    If you specify INCREMENTAL BACKUP SCAN OPTIMIZATION, Oracle Rdb
    checks each area's SPAM pages and scans the SPAM interval of
    pages only if the SPAM transaction number (TSN) is higher than
    the root file backup TSN, which indicates that a page in the SPAM
    interval has been updated since the last full backup operation.
    Updates in the SPAM interval result in an extra I/O.

    Specify INCREMENTAL BACKUP SCAN OPTIMIZATION if your database has
    large SPAM intervals or infrequently occurring updates, and you
    want to increase the speed of incremental backups.

    If you specify NO INCREMENTAL BACKUP SCAN OPTIMIZATION, Oracle
    Rdb checks each page to find changes during incremental backup.

    Specify the NO INCREMENTAL BACKUP SCAN OPTIMIZATION clause if
    your database has frequently occurring updates, uses bulk-load
    operations, or does not use incremental backups, or if you want
    to improve run-time performance.

    The default is INCREMENTAL BACKUP SCAN OPTIMIZATION.

4.3.51  –  INTERVAL

    Specifies the number of data pages between space area management
    (SPAM) pages in the storage area file, and therefore the maximum
    number of data pages each space area management page will manage.
    The default, and also the minimum interval, is 216 data pages.
    The first page of each storage area is a space area management
    page. The interval you specify determines where subsequent space
    area management pages are to be inserted, provided there are
    enough data pages in the storage file to require more space area
    management pages.

    You cannot specify the INTERVAL storage area parameter for
    single-file databases, and you cannot specify INTERVAL unless
    you also explicitly specify PAGE FORMAT IS MIXED.

    Oracle Rdb calculates the maximum interval size based on the
    number of blocks per page and returns an error message if you
    exceed this value. For example, when the page size is 2 blocks,
    the maximum interval is 4008 pages. If you try to create a
    storage area with the interval set to 4009, Oracle Rdb returns
    the following error message:

    %RDB-E-BAD_DPB_CONTENT, invalid database parameters in the database parameter
    block (DPB)
    -RDMS-F-SPIMAX, spam interval of 4009 is more than the Rdb maximum of 4008
    -RDMS-F-AREA_NAME, area NEW

    For more information about setting space area management
    parameters, see the Oracle Rdb Guide to Database Maintenance.

4.3.52  –  LARGE_MEMORY

    Syntax options:

    LARGE MEMORY IS ENABLED | LARGE MEMORY IS DISABLED

    Specifies whether or not large memory is used to manage the row
    cache. Very large memory (VLM) allows Oracle Rdb to use as much
    physical memory as is available.

    Use the LARGE MEMORY IS ENABLED clause only when both of the
    following are true:

    o  You have enabled row caching.

    o  You want to cache large amounts of data, but the cache does
       not fit in the virtual address space.

    The default is the LARGE MEMORY IS DISABLED clause.

4.3.53  –  LIMIT TO n AREAS

    Specifies the number of storage areas to be created in parallel.

    The number of areas should be smaller than the current process
    file open quota. The number of areas can range from between 1 and
    the number of storage areas being created.

4.3.54  –  LIST_STORAGE_AREA

    Specifies the name of the storage area to be used for table
    columns defined through SQL with the LIST OF BYTE VARYING data
    type.

    You can specify the LIST STORAGE AREA parameter for multifile
    databases only.

    By default, columns with the LIST OF BYTE VARYING data type are
    stored in the RDB$SYSTEM storage area. If you specify a different
    storage area in this clause, the CREATE DATABASE statement must
    include a CREATE STORAGE AREA clause defining that area. For
    information about creating multiple list storage areas for a
    table, see the CREATE STORAGE_AREA clause.

                                   NOTE

       If you plan to store lists with segments of widely varying
       sizes, you should specify a MIXED page format area just
       for list storage. (Do not assign tables and indexes to the
       area.)

       The database system looks for free space in an area when it
       stores each segment of a segmented string. If size varies
       significantly among the different segments of the lists
       that you plan to store, the interval and threshold values
       that the database system automatically sets for page format
       areas you specify as UNIFORM can make storing lists time-
       consuming. For a mixed page format area, you can customize
       interval and thresholds values to reduce the amount of time
       that the database system spends looking for free space when
       it stores different segments of the same segmented string.

    The following example shows valid syntax for the LIST STORAGE
    AREA clause:

    SQL> CREATE DATABASE FILENAME test
    cont> LIST STORAGE AREA IS registry_area
    cont>    CREATE STORAGE AREA RDB$SYSTEM FILENAME maintenance_area
    cont>    CREATE STORAGE AREA registry_area FILENAME registry_area;
    SQL> CREATE STORAGE MAP registry_map
    cont> STORE LISTS IN registry_area;

4.3.55  –  literal-user-auth

    Specifies the user name and password for access to databases,
    particularly remote database.

    This literal lets you explicitly provide user name and password
    information in the CREATE DATABASE statement.

4.3.56  –  LOCATION IS directory spec

    Specifies the name of the backing store directory to which row
    cache information is written. The database system generates a
    file name (row-cache-name.rdc) automatically for each row cache
    at checkpoint time. Specify a device name and directory name
    only, enclosed within single quotation marks. The file name is
    the row-cache-name specified when creating the row cache. By
    default, the location is the directory of the database root file.
    These .rdc files are permanent database backing store files.

    The LOCATION clause of the CREATE CACHE, ADD CACHE, or ALTER
    CACHE clause overrides this location, which is the default for
    the database.

    This clause is ignored if the row cache is defined to checkpoint
    to the database.

4.3.57  –  LOCK_PARTITIONING

    Syntax options:

    LOCK PARTITIONING IS ENABLED | LOCK PARTITIONING IS DISABLED

    Specifies whether more than one lock tree is used for the
    database or all lock trees for a database are mastered by one
    database resource tree.

    When partitioned lock trees are enabled for a database, locks for
    storage areas are separated from the database resource tree and
    all locks for each storage area are independently mastered on the
    VMScluster node that has the highest traffic for that resource.
    OpenVMS determines the node that is using each resource the most
    and moves the resource hierarchy to that node.

    You cannot enable lock partitioning for single-file databases.
    You should not enable lock partitioning for single-node systems,
    because all lock requests are local on single-node systems.

    By default, lock partitioning is disabled.

4.3.58  –  LOCK_TIMEOUT_INTERVAL

    Syntax option:

    LOCK TIMEOUT INTERVAL IS number-seconds SECONDS

    Specifies the number of seconds for processes to wait during a
    lock conflict before timing out. The number of seconds can be
    between 1 and 65,000 seconds.

    Specifying 0 is interpreted as no lock timeout interval being
    set. It is not interpreted as 0 seconds.

    The lock timeout interval is database-wide; it is used as the
    default as well as the upper limit for determining the timeout
    interval. For example, if the database definer specified LOCK
    TIMEOUT INTERVAL IS 25 SECONDS in the CREATE DATABASE statement,
    and a user of that database specified SET TRANSACTION WAIT 30
    or changed the logical name RDM$BIND_LOCK_TIMEOUT_INTERVAL to
    30, SQL uses the interval of 25 seconds. For more information,
    see the SET_TRANSACTION statement and the Oracle Rdb7 Guide to
    Distributed Transactions.

4.3.59  –  LOCKING level

    Syntax options:

    LOCKING IS ROW LEVEL | LOCKING IS PAGE LEVEL

    Specifies page-level or row-level locking as the default for the
    database. This clause provides an alternative to requesting locks
    on records. You can override the database default lock level
    at the storage area level. The default is ROW LEVEL, which is
    compatible with previous versions of Oracle Rdb.

    When many records are accessed in the same area and on the same
    page, the LOCKING IS PAGE LEVEL clause reduces the number of lock
    operations perfomed to process a transaction; however, this is at
    the expense of reduced concurrency. Transactions that benefit
    most with page-level locking are of short duration and also
    access several database records on the same page.

    Use the LOCKING IS ROW LEVEL clause if transactions are long in
    duration and lock many rows.

    The LOCKING IS PAGE LEVEL clause causes fewer blocking ASTs
    and provides better response time and utilization of system
    resources. However, there is a higher contention for pages and
    increased potential for deadlocks and long transactions may use
    excessive locks.

    Page-level locking is never applied to RDB$SYSTEM or the DEFAULT
    storage area, either implicitly or explicitly, because the lock
    protocol can stall metadata users.

    You cannot specify page-level locking on single-file databases.

4.3.60  –  LOGMINER_SUPPORT

    Syntax options:

    LOGMINER SUPPORT IS ENABLED|LOGMINER SUPPORT IS DISABLED

    Allows additional information to be written to the after-image
    journal file to allow the use of the RMU Unload After_Image
    command. See Oracle RMU Reference Manual for more details.
    Logminer support is disabled by default.

    The LOGMINER SUPPORT clause allows the continuous mode for
    LogMiner to be enabled and disabled.

    o  LOGMINER SUPPORT IS ENABLED (CONTINUOUS)

       Enables continuous LogMiner.

    o  LOGMINER SUPPORT IS ENABLED (NOT CONTINUOUS)

       Disables continuous LogMiner, but leaves LogMiner enabled.

    o  LOGMINER SUPPORT IS DISABLED

       Disables LogMiner, including disabling continuous LogMiner.

4.3.61  –  MAXIMUM_BUFFER_COUNT

    Specifies the number of buffers a process will write
    asynchronously.

    The default is one-fifth of the buffer pool, but not more than 10
    buffers. The minimum value is 2 buffers; the maximum value can be
    as large as the buffer pool.

    You can override the number of buffers to be written
    asynchronously by defining the logical name RDM$BIND_BATCH_MAX.
    For information about how to set the values, see the Oracle Rdb7
    Guide to Database Performance and Tuning.

4.3.62  –  MAXIMUM extent pages

    Syntax option:

    MAXIMUM OF max-pages PAGES

    Specifies the maximum number of pages of each extent. The default
    is 9999 pages.

4.3.63  –  METADATA_CHANGES

    Syntax options:

    METADATA CHANGES ARE ENABLED | METADATA CHANGES ARE DISABLED
    Specifies whether or not data definition changes are allowed
    to the database. This attribute becomes effective at the
    next database attach and affects all ALTER, CREATE, and DROP
    statements (except ALTER DATABASE, which is needed for database
    tuning) and the GRANT, REVOKE, TRUNCATE TABLE, COMMENT ON and
    RENAME statements. For example:

    SQL> CREATE DATABASE FILENAME sample
    cont> METADATA CHANGES ARE DISABLED;
    SQL> CREATE TABLE t (a INTEGER);
    SQL> DISCONNECT ALL;
    SQL> ATTACH 'FILENAME sample';
    SQL> CREATE TABLE s (b INTEGER);
    %RDB-E-NO_META_UPDATE, metadata update failed
    -RDMS-E-NOMETADATA, metadata operations are disabled

    The METADATA CHANGES ARE DISABLED clause prevents data definition
    changes to the database. If you specify this clause in the
    CREATE DATABASE statement, system index compression is implicitly
    enabled.

    The METADATA CHANGES ARE ENABLED clause allows data definition
    changes to the database by users granted the DBADMIN privilege.

    METADATA CHANGES ARE ENABLED is the default.

4.3.64  –  MINIMUM extent pages

    Syntax option:

    MINIMUM OF min-pages PAGES

    Specifies the minimum number of pages of each extent. The default
    is 99 pages.

4.3.65  –  MULTISCHEMA

    Syntax options:

    MULTISCHEMA IS ON | MULTISCHEMA IS OFF

    Specifies the multischema attribute for the database. You must
    specify the multischema attribute for your database to create
    multiple schemas and store them in catalogs. Each time you attach
    to a database created with the multischema attribute, you can
    specify whether you want multischema naming enabled or disabled
    for subsequent statements. For more information on multischema
    naming, see the User_Supplied_Names HELP topic.

    If you prefer to access a database created with the multischema
    attribute as though it were single-schema database, you can turn
    off multischema naming using the MULTISCHEMA IS OFF clause in the
    ATTACH or DECLARE ALIAS statement.

    If you have turned off the multischema attribute, you can enable
    it again using the MULTISCHEMA IS ON clause in the ATTACH or
    DECLARE ALIAS statement. You can use multischema naming only
    when you are attached to a database that was created with the
    multischema attribute. For more information, see the ATTACH
    statement.

    Multischema naming is disabled by default.

4.3.66  –  MULTITHREAD_AREA_ADDITIONS

    Specifies whether Oracle Rdb creates all storage areas in
    parallel, creates a specified number in parallel, or creates
    areas serially.

    This clause lets you determine the number of storage areas
    to be created in parallel, possibly saving time during the
    initial database creation. However, if you specify a large
    number of storage areas and many areas share the same device,
    multithreading may cause excessive disk head movement, which may
    result in the storage area creation taking longer than if the
    areas were created serially. In addition, if you specify a large
    number of storage areas, you may exceed process quotas, resulting
    in the database creation failing.

    This setting is not saved as a permanent database attribute. It
    is used only during the execution of the CREATE DATABASE, ALTER
    DATABASE, or IMPORT statements.

    If you do not specify the MULTITHREAD AREA ADDITIONS clause, the
    default is to create one storage area at a time. If you specify
    the MULTITHREAD AREA ADDITIONS clause, but do not specify an
    option, the default is all areas are created in parallel.

4.3.67  –  NATIONAL_CHARACTER_SET

    Specifies the database national character set when you create a
    database. For a list of allowable national character set names,
    see Supported Character Sets.

4.3.68  –  ncs-name

    The OpenVMS National Character Set (NCS) utility provides a
    set of predefined collating sequences and also lets you define
    collating sequences of your own. In the default NCS library,
    SYS$LIBRARY:NCS$LIBRARY, ncs-name is the name of a collating
    sequence or ncs-name is the name of the collating sequence in
    the NCS library specified by the library-name argument. (In most
    cases, it is simplest to make the collating sequence name the
    same as the ncs-name, for example, CREATE DATABASE . . . COLLATING
    SEQUENCE IS SPANISH SPANISH.) The COLLATING SEQUENCE clause
    accepts both predefined and user-defined NCS collating sequences.

    If you omit the COLLATING SEQUENCE clause in the CREATE DATABASE
    statement at database definition time, the default sequence is
    the DEC Multinational Character Set (MCS).

4.3.69  –  NO_LOCATION

    This is a subclause of other clauses and has different effects,
    depending upon the clause in which it is used, as follows:

    o  In the row-cache-options clause

       Removes the location previously specified in a LOCATION IS
       clause for the row cache. If you specify NO LOCATION, the
       row cache location becomes the directory of the database root
       file.

       The LOCATION clause of the CREATE CACHE, ADD CACHE, or ALTER
       CACHE clause overrides this location, which is the default for
       the database.

    o  In a CREATE CACHE, ADD CACHE, or ALTER CACHE clause (row-
       cache-params1 clause)

       Removes the location previously specified in a LOCATION IS
       clause for the row cache backing file. If you specify NO
       LOCATION, the row cache location becomes the directory of
       the database root file.

       This clause is ignored if the row cache is defined to
       checkpoint to the database.

4.3.70  –  NO_ROW_CACHE

    Specifies that the database default is not to assign a row cache
    to all storage areas in the database. You cannot specify the NO
    ROW CACHE clause if you specify the CACHE USING clause.

    Alter the storage area and name a row cache to override the
    database default. Only one row cache is allowed for each storage
    area.

    If you do not specify the CACHE USING clause or the NO ROW CACHE
    clause, NO ROW CACHE is the default for the database.

4.3.71  –  NOTIFY

    Syntax options:

    NOTIFY IS ENABLED | NOTIFY IS DISABLED

    Specifies whether system notification is enabled or disabled.

    When the system notification is enabled, the system is notified
    (using the OpenVMS OPCOM facility) in the event of events such as
    running out of disk space for a journal.

    If you specify the NOTIFY IS ENABLED clause and do not specify
    the ALERT OPERATOR clause, the operator classes used are CENTRAL
    and CLUSTER. To specify other operator classes, use the ALERT
    OPERATOR clause.

    The NOTIFY IS ENABLED clause replaces any operator classes set by
    the RMU Set After_Journal Notify command.

    The default is disabled.

4.3.72  –  NUMBER global buffers

    Syntax option:

    NUMBER IS number-glo-buffers

    Specifies the default number of global buffers to be used on
    one node when global buffers are enabled. This number appears as
    "global buffer count" in RMU Dump command output. Base this value
    on the database users' needs and the number of attachments. The
    default is the maximum number of attachments multiplied by 5.

                                   NOTE

       Do not confuse the NUMBER IS parameter with the NUMBER OF
       BUFFERS IS parameter. The NUMBER OF BUFFERS IS parameter
       determines the default number of buffers Oracle Rdb
       allocates to each user process that attaches to the
       database. The NUMBER OF BUFFERS IS parameter applies to, and
       has the same meaning for, both local and global buffering.
       The NUMBER IS parameter has meaning only within the context
       of global buffering.

    You can override the default number of user-allocated buffers by
    defining a value for the logical name RDM$BIND_BUFFERS. For more
    information, see the Oracle Rdb7 Guide to Database Performance
    and Tuning.

    Although you can change the NUMBER IS parameter on line, the
    change does not take effect until the next time the database is
    opened.

4.3.73  –  NUMBER_OF_BUFFERS

    Specifies the number of buffers SQL allocates for each attach
    to this database. This number is displayed as the "default
    database buffer count" in the output from the RMU Dump command.
    The default buffer count applies to local and global buffers.

    Specify an unsigned integer greater than or equal to 2 and less
    than or equal to 32,767. The default is 20 buffers.

4.3.74  –  NUMBER_OF_CLUSTER_NODES

    Syntax option:

    NUMBER OF CLUSTER NODES number-nodes

    Sets the upper limit on the maximum number of VMS cluster nodes
    from which users can access the shared database. The default
    is 16 nodes. The range is 1 to 96 nodes. The actual maximum
    limit is the current VMS cluster node limit set by your system
    administrator.

    The Oracle Rdb root file data structures (.rdb) are mapped to
    shared memory. Each such shared memory copy is known as an Rdb
    instance. When there is only one copy of shared memory containing
    root file information, several optimizations are enabled to
    reduce locking and root file I/O during database activity. To
    enable these optimizations, specify NUMBER OF CLUSTER NODES 1, or
    use the SINGLE INSTANCE clause.

    MULTIPLE INSTANCE means that the Oracle Rdb root file data
    structures are mapped on different system and are kept consistent
    through disk I/O. Such systems can not benefit from single
    instance optimizations. MULTIPLE INSTANCE is the default.

4.3.75  –  NUMBER_OF_RECOVERY_BUFFERS

    Specifies the number of buffers allocated to the automatic
    recovery process that Oracle Rdb initiates after a system or
    process failure. This recovery process uses the recovery-unit
    journal (.ruj) file.

    Specify an unsigned integer greater than or equal to 2 and less
    than or equal to 32,767. The default value for the NUMBER OF
    RECOVERY BUFFERS parameter is 20 buffers. If you have a large,
    multifile database and you are working on a system with a large
    amount of memory, specify a large number of buffers. This result
    is faster recovery time. However, make sure your buffer pool does
    not exceed the amount of memory you can allocate for the pool.
    if the number of buffers is too large for the amount of memory on
    your system, the system may be forced to perform virtual paging
    of the buffer pool. This can slow performance time because the
    operating system must perform the virtual paging of the buffer
    pool in addition to reading database pages. You may want to
    experiment to determine the optimal number of buffers for your
    database.

    Use the NUMBER OF RECOVERY BUFFERS option to increase the number
    of buffers allocated to the recovery process.

    SQL> CREATE DATABASE FILENAME personnel
    cont>  NUMBER OF RECOVERY BUFFERS 150;

    This option is used only if the NUMBER OF RECOVERY BUFFERS value
    is larger than the NUMBER OF BUFFERS value. For more information,
    see the Oracle Rdb Guide to Database Maintenance.

4.3.76  –  NUMBER_OF_SWEEP_ROWS

    Syntax option:

    NUMBER OF SWEEP ROWS IS n

    Specifies the number of modified rows that will be written from
    the row cache back to the database by the row cache server (RCS)
    process during a sweep operation. When the RCS is notified that
    a cache is "full" of modified data, the RCS starts a sweep to
    make space available in the cache for subsequent transactions
    to be able to insert rows into the cache. Oracle Corporation
    recommends that you initially specify the number of sweep rows
    to be approximately 5 percent of the total number of rows in
    the cache. Then monitor performance and adjust the number of
    sweep rows, if necessary. Allowable values must be in the range 2
    through 524288. If not specified, the default is 3,000 rows.

4.3.77  –  NUMBER_OF_USERS

    Specifies the maximum number of users allowed to access the
    database at one time. The default is 50 users. After the maximum
    is reached, the next user who tries to invoke the database
    receives an error message and must wait. The maximum number of
    users you can specify is 16368, and the minimum is 1 user.

    Note that "number of users" is defined as the number of active
    attachments to the database. Thus, if a single process runs
    one program but that program performs 12 attach operations, the
    process is responsible for 12 active users as defined by this
    argument.

4.3.78  –  OPEN

    Syntax options:

    OPEN IS MANUAL | OPEN IS AUTOMATIC

    Specifies whether or not the database must be explicitly opened
    before users can attach to it. The default, OPEN IS AUTOMATIC,
    means that any user can open a previously unopened or a closed
    database by attaching to it and executing a statement. The
    OPEN IS MANUAL option means that a privileged user must issue
    an explicit OPEN statement through Oracle RMU, the Oracle
    Rdb management utility, before other users can attach to the
    database.

    The OPEN IS MANUAL option limits access to databases. You must
    have the DBADM privilege to attach to the database.

    You receive an error message if you specify both OPEN IS
    AUTOMATIC and OPEN IS MANUAL options.

    You can modify the OPEN IS option through the ALTER DATABASE
    statement.

4.3.79  –  PAGE_FORMAT

    Syntax options:

    PAGE FORMAT IS UNIFORM | PAGE FORMAT IS MIXED

    Specifies the on-disk structure for the storage area.

    o  The default is PAGE FORMAT IS UNIFORM and creates a storage
       area data file that is divided into clumps. Clump size, which
       is derived from buffer size, is 3 pages by default. A set
       of clumps forms a logical area that can contain rows from
       a single table only. For more information on uniform page
       formats, see the Oracle Rdb7 Guide to Database Performance and
       Tuning.

       Uniform page format storage areas generally give the best
       performance if the tables in the storage area are subject to a
       wide range of queries.

    o  The PAGE FORMAT IS MIXED clause creates a storage area with
       a format that lets rows from more than one table reside on
       or near a particular page of the storage area data file. This
       is useful for storing related rows from different tables on
       the same page of the data file. For storage areas subject to
       repeated queries that retrieve those related rows, a mixed
       page format can greatly reduce I/O overhead if the mix of
       rows on the page is carefully controlled. However, mixed page
       format storage areas degrade performance if the mix of rows
       on the page is not suited for the queries made against the
       storage area.

                                   NOTE

       The main storage area created by the CREATE DATABASE
       statement, called RDB$SYSTEM, must have uniform pages. If
       you specify PAGE FORMAT IS MIXED as a default storage area
       parameter, SQL generates a warning message and overrides
       that default when it creates the RDB$SYSTEM storage area.

4.3.80  –  PAGE_SIZE

    Syntax option:

    PAGE SIZE IS page-blocks BLOCKS

    The size in blocks of each database page. Page size is allocated
    in 512-byte blocks. The default is 2 blocks (1024 bytes). If your
    largest row is larger than approximately 950 bytes, allocate more
    blocks per page to prevent fragmented rows. If you specify a page
    size larger than the buffer size, an error message is returned.

4.3.81  –  PAGE_TRANSFER

    Syntax options:

    PAGE TRANSFER VIA DISK | PAGE TRANSFER VIA MEMORY

    Specifies whether Oracle Rdb transfers (flushes) pages to disk or
    to memory.

    When you specify PAGE TRANSFER VIA MEMORY, processes on a single
    node can share and update database pages in memory without
    transferring the pages to disk. It is not necessary for a process
    to write a modified page to disk before another process accesses
    the page.

    The default is to DISK. If you specify PAGE TRANSFER VIA MEMORY,
    the database must have the following characteristics:

    o  The NUMBER OF CLUSTER NODES must equal one, or SINGLE INSTANCE
       must be specified in the NUMBER of CLUSTER NODES clause.

    o  GLOBAL BUFFERS must be enabled.

    o  After-image journaling must be enabled.

    o  FAST COMMIT must be enabled.

    If the database does not have these characteristics, Oracle Rdb
    will perform page transfers via disk.

    For more information about page transfers, see the Oracle Rdb7
    Guide to Database Performance and Tuning.

4.3.82  –  PATHNAME path name

    The repository path name for the repository directory where the
    database definition is stored.

    Specify one of the following:

    o  A full repository path name, such as CDD$TOP.SQL.DEPT3

    o  A relative repository path name, such as DEPT3

    o  A logical name that refers to a full or relative repository
       path name

    If you use a relative path name, CDD$DEFAULT must be defined
    as all the path name segments preceding the relative path name.
    For example, define CDD$DEFAULT as CDD$TOP.SQL, and then use the
    relative path name DEPT3.

    SQL> SHOW DICTIONARY
    The current data dictionary is  CDD$TOP.SQL
    SQL> CREATE DATABASE ALIAS PERSONNEL PATHNAME DEPT3;

    There is no default path name. If you do not specify a repository
    path name for the database, SQL does not store database
    definitions in the repository. Subsequent data definitions cannot
    use the repository. However, Oracle Rdb recommends that you do
    specify a repository path name when you create a database. For
    more information, see the Oracle Rdb SQL Reference Manual.

    If you use the PATHNAME argument and your system does not have
    the repository, SQL ignores the argument.

    When you use the PATHNAME argument, the repository associates
    the path name with the file specification exactly as given in the
    CREATE DATABASE statement. If that file specification is a file
    name, not a logical name, you cannot alter or delete the database
    by specifying the path name unless the database root file is in
    the current, default working directory.

4.3.83  –  PERCENT extent growth

    Syntax option:

    PERCENT GROWTH IS growth

    Specifies the percent growth of each extent. The default is 20
    percent growth.

4.3.84  –  PRESTARTED_TRANSACTIONS

    Syntax options:

       PRESTARTED TRANSACTIONS ARE ENABLED
       PRESTARTED TRANSACTIONS ARE DISABLED

    Enables or disables the prestarting of transactions.

    Note that the keyword ON, available in previous versions, is
    synonymous with ENABLED, and the OFF keyword is synonymous with
    the DISABLED keyword.

    This clause is used to establish a permanent database setting for
    prestarted transactions. In prior versions, this clause was only
    used to temporarily set the mode for prestarted transaction for
    the implicit attach performed by the CREATE DATABASE and IMPORT
    DATABASE statements.

    The prestart-trans-options can be one of the following clauses:

    o  WAIT n SECONDS FOR TIMEOUT

       The n represents the number of seconds to wait before
       aborting the prestarted transaction. Timing out the prestarted
       transaction may prevent snapshot file growth in environments
       where servers stay attached to the database with long periods
       of inactivity.

    o  WAIT n MINUTES FOR TIMEOUT

       The n represents the number of minutes to wait before aborting
       the prestarted transaction.

    o  NO TIMEOUT

       This is the default for a prestarted transaction.

    Syntax options:

    PRESTARTED TRANSACTIONS ARE ON | PRESTARTED TRANSACTIONS ARE OFF

4.3.85  –  PROTECTION

    Syntax options:

    PROTECTION IS ANSI | PROTECTION IS ACLS

    Specifies whether the database root file will be invoked with
    ACL-style or ANSI/ISO-style privileges. If no protection clause
    is specified, the default is ACL-style privileges.

    For ACL-style databases, the access privilege set is order-
    dependent. When a user tries to perform an operation on a
    database, SQL reads the associated access privilege set, called
    the access control list (ACL), from top to bottom, comparing
    the identifier of the user with each entry. As soon as SQL finds
    a match, it grants the rights listed in that entry and stops
    the search. All identifiers that do not match a previous entry
    "fall through" to the entry [ *,*] (equivalent to the SQL keyword
    PUBLIC). The default access for PUBLIC is NONE.

    See the GRANT statement and the REVOKE statement for more
    information on ACL-style privileges.

    For ANSI/ISO-style databases, the access privilege set is
    not order-dependent. The user matches the entry in the access
    privilege set; gets whatever privileges have been granted on the
    database, table, or column; and gets the privileges defined for
    PUBLIC. A user without an entry in the access privilege set gets
    only the privileges defined for PUBLIC. There is always an access
    privilege entry for PUBLIC, even if that entry has no access to
    the database, table, or column.

    ANSI/ISO-style databases grant access to the creator when an
    object is created. Because only the creator is granted access
    to the newly created object, additional access must be granted
    explicitly.

    See the GRANT_ANSI statement and the REVOKE_ANSI statement for
    more information on ANSI/ISO-style privileges.

    You can change the PROTECTION IS parameter by using the IMPORT
    statement. See the IMPORT statement for more information.

4.3.86  –  RECOVERY_JOURNAL_(BUFFER_MEMORY)

    Syntax options:

       BUFFER MEMORY IS LOCAL
       BUFFER MEMORY IS GLOBAL

 Specifies whether RUJ buffers will be allocated in global or local
 memory.

    The RUJ buffers used by each process are normally allocated in
    local virtual memory. With the introduction of row caching, these
    buffers now can be assigned to a shared global section (global
    memory) on OpenVMS, so that the recovery process can process this
    in-memory buffer and possibly avoid a disk access.

    You can define this buffer memory to be global to improve row
    caching performance for recovery. If row caching is disabled,
    then buffer memory is always local.

4.3.87  –  RECOVERY_JOURNAL_(LOCATION)

    Syntax options:

    RECOVERY JOURNAL (LOCATION IS directory-spec)

    Specifies the location in which the recovery-unit journal (.ruj)
    file is written. Do not include node names, file names, or
    process-concealed logical names in the directory-spec. Single
    quotation marks are required around the directory-spec. This
    clause overrides the RDMS$RUJ logical name.

    If this clause is omitted, then NO LOCATION is assumed.

    Following is an example using this clause:

    SQL> ALTER DATABASE FILENAME SAMPLE
    cont> RECOVERY JOURNAL (LOCATION IS 'SQL_USER1:[DBDIR.RECOVER]')

    See the Oracle Rdb Guide to Database Maintenance for more
    information on recovery-unit journal files.

4.3.88  –  RECOVERY_JOURNAL_(NO_LOCATION)

    If you specify NO LOCATION, the recovery journal uses the
    current user's login device and the directory [RDM$RUJ]. See
    the Oracle Rdb Guide to Database Maintenance for more information
    on recovery-unit journal files.

4.3.89  –  RESERVE n CACHE SLOTS

    Specifies the number of row caches for which slots are reserved
    in the database.

    You can use the RESERVE CACHE SLOTS clause to reserve slots in
    the database root file for future use by the ADD CACHE clause
    of the ALTER DATABASE statement. You can only add row caches if
    row cache slots are available. Slots become available after a
    DROP CACHE clause or a RESERVE CACHE SLOTS clause of the ALTER
    DATABASE statement.

    The number of reserved slots for row caches cannot be decreased
    once the RESERVE clause is issued. If you reserve 10 slots and
    later reserve 5 slots, you have a total of 15 reserved slots for
    row caches

    If you do not specify the RESERVE CACHE SLOTS clause, the default
    number of row caches is one.

    Reserving row cache slots is an offline operation (requiring
    exclusive database access). See the CREATE CACHE clause for more
    information.

4.3.90  –  RESERVE n JOURNALS

    Specifies the number of journal files for which slots are
    reserved in the database. If your database is not a multifile
    database, you cannot reserve additional slots later using the
    ALTER DATABASE statement.

    You must reserve slots before you can add journal files to the
    database.

    See the ALTER DATABASE statement for more information about
    adding journal files and enabling the journaling feature.

    The following SQL statements create a multifile database and
    reserve 5 slots for future journal files.

    SQL> CREATE DATABASE FILENAME test
    cont>    RESERVE 5 JOURNALS
    cont>    CREATE STORAGE AREA sa_one
    cont>       ALLOCATION IS 10 PAGES;

4.3.91  –  RESERVE n SEQUENCES

    Specifies the number of sequences for which slots are reserved in
    the database. Sequences are reserved in multiples of 32. Thus, if
    you specify a value less than 32 for n, 32 slots are reserved. If
    you specify a value of 33, 64 slots are reserved, and so on.

    You can use the RESERVE SEQUENCES clause to reserve slots in
    the database root file for future use by the CREATE SEQUENCE
    statement. Sequences can be created only if sequence slots are
    available. Slots become available after a DROP SEQUENCE statement
    or a RESERVE SEQUENCES clause of the ALTER DATABASE statement is
    executed.

    The number of reserved slots for sequences cannot be decreased.

    If you do not specify the RESERVED SEQUENCES clause, the default
    number of sequence slots is 32.

4.3.92  –  RESERVE n STORAGE AREAS

    Specifies the number of storage areas for which slots are
    reserved in the database. The number of slots for storage areas
    must be a positive number greater than zero.

    You can use the RESERVE STORAGE AREA clause to reserve slots
    in the database root file for future use by the ADD STORAGE
    AREA clause of the ALTER DATABASE statement. Storage areas can
    be added only if there are storage area slots available. Slots
    become available after a DROP STORAGE AREA clause or a RESERVE
    STORAGE AREA clause.

    The number of reserved slots for storage areas cannot be
    decreased once the RESERVE clause is issued. If you reserve 5
    slots and later reserve 10 slots, you have a total of 15 reserved
    slots for storage areas.

    If you do not specify the RESERVE STORAGE AREA clause, the
    default number of storage areas is zero.

4.3.93  –  RESTRICTED_ACCESS

    Syntax option:

    RESTRICTED ACCESS | NO RESTRICTED ACCESS

    Restricts access to the database. This allows you to access the
    database but locks out all other users until you disconnect from
    the database. Setting restricted access to the database requires
    DBADM privileges.

    The default is NO RESTRICTED ACCESS.

4.3.94  –  root-file-params

    Parameters that control the characteristics of the database root
    file or characteristics stored in the database root file that
    apply to the entire database. You can specify these parameters
    for either single-file or multifile databases.

    Some database root file parameters specified in the CREATE
    DATABASE statement cannot be changed with the ALTER DATABASE
    statement. To change these database root file parameters,
    you must use the EXPORT and IMPORT statements. See the EXPORT
    statement and the IMPORT statement for information on exporting
    and importing your database.

4.3.95  –  ROW_CACHE

    Syntax options:

    ROW CACHE IS ENABLED | ROW CACHE IS DISABLED

    Specifies whether or not you want Oracle Rdb to enable the row
    caching feature.

    When a database is created or is converted from a previous
    version of Oracle Rdb without specifying row cache support, the
    default is ROW CACHE IS DISABLED. Enabling row cache support does
    not affect database operations until a row cache is created and
    assigned to one or more storage areas.

    When the row caching feature is disabled, all previously created
    and assigned row cache definitions remain in existence for future
    use when the row caching feature is enabled.

    The following conditions must be true in order to use row caches:

    o  The number of cluster nodes is one

    o  After-image journaling is enabled

    o  Fast commit is enabled

    o  One or more cache slots are reserved

    o  Row caching is enabled

    Use the RMU Dump Header command to check if you have met the
    requirements for using row caches. The following command output
    displays a warning for every requirement that is not met:

       .
       .
       .
    Row Caches...

    - Active row cache count is 0

    - Reserved row cache count is 1

    - Sweep interval is 1 second

    - Default cache file directory is ""

    - WARNING: Maximum node count is 16 instead of 1

    - WARNING: After-image journaling is disabled

    - WARNING: Fast commit is disabled
       .
       .
       .

4.3.96  –  ROWID_SCOPE

    Syntax options:

    ROWID SCOPE IS ATTACH | ROWID SCOPE IS TRANSACTION

    The ROWID keyword is a synonym for the DBKEY keyword. See the
    DBKEY_SCOPE argument for more information.

4.3.97  –  SECURITY_CHECKING

    Traditionally, Oracle Rdb has performed security checking using
    the operating system security layer (for example, the UIC and
    rights identifiers of the OpenVMS operating system).

    The access control list (ACL) information stored in the database
    contains a granted privilege mask and a set of users represented
    by a unique integer (for example, a UIC).

    There are two modes of security checking:

    1. SECURITY CHECKING IS EXTERNAL

       This is the default. External security checking recognizes
       database users (created with the SQL CREATE USER statement)
       as operating system user identification codes (UICs) and roles
       as special rights identifiers or groups. PERSONA support is
       enabled or disabled as follows:

       o  SECURITY CHECKING IS EXTERNAL (PERSONA SUPPORT IS ENABLED)

          Enables the full impersonation of an OpenVMS user. This
          means the UIC and the granted right identifiers are used to
          check access control list permissions.

       o  SECURITY CHECKING IS EXTERNAL (PERSONA SUPPORT IS DISABLED)

          Disables the full impersonation of an OpenVMS user. Only
          the UIC is used to check access control list permissions.
          This is the default for a new database, or for a database
          converted from a prior version of Oracle Rdb.

    2. SECURITY CHECKING IS INTERNAL

       In this mode, Oracle Rdb records users (username and UIC) and
       roles (rights identifiers) in the database. The CREATE USER
       and CREATE ROLE statements perform this action explicitly, and
       GRANT will perform this implicitly. This type of database can
       now be moved to another system and is only dependent on the
       names of the users and roles.

       o  SECURITY CHECKING IS INTERNAL (ACCOUNT CHECK IS ENABLED)

          The ACCOUNT CHECK clause ensures that Oracle Rdb validates
          the current database user with the user name (such as
          defined with an SQL CREATE USER statement) stored in the
          database. This prevents different users with the same name
          from accessing the database. Therefore, this clause might
          prevent a breach in security.

          The ACCOUNT CHECK IS ENABLED clause on OpenVMS forces the
          user session to have the same user name and UIC as recorded
          in the database.

       o  SECURITY CHECKING IS INTERNAL (ACCOUNT CHECK IS DISABLED)

          If you specify the ACCOUNT CHECK IS DISABLED clause, then
          a user with a matching UIC (also called a profile-id) is
          considered the same as the user even if his or her user
          name is different. This allows support for multiple OpenVMS
          users with the same UIC.

4.3.98  –  SEGMENTED_STRING_STORAGE_AREA

    Another name for LIST STORAGE AREA.

4.3.99  –  SET_TRANSACTION_MODES

    Enables only the modes specified, disabling all other previously
    defined modes. For example, if a database is to be used for read-
    only access and you want to disable all other transaction modes,
    use the following statement:

    SQL> CREATE DATABASE FILENAME mf_personnel
    cont>   SET TRANSACTION MODES (READ ONLY);

    If not specified, the default transaction mode is ALL.

    Specifying a negated transaction mode or specifying NONE disables
    all transaction usage. Disabling all transaction usage would be
    useful when, for example, you want to perform major restructuring
    of the physical database. Execute the ALTER DATABASE statement
    to re-enable transaction modes or use Oracle RMU, the Oracle Rdb
    management utility.

4.3.100  –  SHARED_MEMORY_IS_PROCESS_RESIDENT

    The SHARED MEMORY clause determines whether database root global
    sections (including global buffers when enabled) or whether the
    cache global sections are created in system space or process
    space. The RESIDENT option extends the PROCESS option by making
    the global section memory resident.

4.3.101  –  SHARED_MEMORY

    Syntax options:

    SHARED MEMORY IS SYSTEM | SHARED MEMORY IS PROCESS

    Determines whether database root global sections (including
    global buffers when enabled) are created in system space or
    process space. The default is PROCESS.

    When you use global sections created in the process space, you
    and other users share physical memory and the OpenVMS operating
    system maps a row cache to a private address space for each user.
    As a result, all users are limited by the free virtual address
    range and each use a percentage of memory in overhead. If many
    users are accessing the database, the overhead can be high.

4.3.102  –  SNAPSHOT_ALLOCATION

    Syntax option:

    SNAPSHOT ALLOCATION IS snp-pages PAGES

    Changes the number of pages allocated for the snapshot file. The
    default is 100 pages. If you have disabled the snapshot file, you
    can set the snapshot allocation to 0 pages.

4.3.103  –  SNAPSHOT_CHECKSUM_ALLOCATION

    Syntax option:

       SNAPSHOT CHECKSUM ALLOCATION IS ENABLED
       SNAPSHOT CHECKSUM ALLOCATION IS DISABLED

 See the CHECKSUM ALLOCATION clause for details.

4.3.104  –  SNAPSHOT_IS_ENABLED

    Syntax options:

    SNAPSHOT IS ENABLED IMMEDIATE | SNAPSHOT IS ENABLED DEFERRED

    Specifies when read/write transactions write database changes
    they make to the snapshot file used by read-only transactions.

    The default is ENABLED IMMEDIATE and causes read/write
    transactions to write copies of rows they modify to the snapshot
    file, regardless of whether or not a read-only transaction is
    active.

    The ENABLED DEFERRED option lets read/write transactions
    avoid writing copies of rows they modify to the snapshot file
    (unless a read-only transaction is already active). Deferring
    snapshot writing in this manner improves the performance for
    the read/write transaction. However, read-only transactions that
    attempt to start after an active read/write transaction starts
    must wait for all active read/write users to complete their
    transactions.

4.3.105  –  SNAPSHOT_EXTENT

    Syntax options:

       SNAPSHOT EXTENT IS extent-pages
       SNAPSHOT EXTENT IS (extension-options)

 Specifies the number of pages of each snapshot or storage area file
 extent. The default extent for storage area files is 99 pages.

    Specify a number of pages for simple control over the extension.
    For greater control, and particularly for multivolume databases,
    use the MINIMUM, MAXIMUM, and PERCENT GROWTH extension options
    instead.

    If you use the MINIMUM, MAXIMUM, and PERCENT GROWTH parameters,
    you must enclose them in parentheses.

4.3.106  –  SNAPSHOT_FILENAME

    Provides a separate file specification for the storage area
    snapshot file. The SNAPSHOT FILENAME argument can only be used
    with a multifile database.

    In a multifile database, the file specification is used for the
    RDB$SYSTEM storage area snapshot file, unless the CREATE DATABASE
    statement contains a CREATE STORAGE AREA RDB$SYSTEM clause that
    contains its own SNAPSHOT FILENAME clause.

    Do not specify a file extension other than .snp to the snapshot
    file specification. Oracle Rdb will assign the extension .snp
    to the file specification, even if you specify an alternate
    extension.

    If you omit the SNAPSHOT FILENAME argument, the .snp file gets
    the same device, directory, and file name as the database root
    file.

4.3.107  –  SNAPSHOT_IS_DISABLED

    Specifies that snapshot writing is disabled. Snapshot writing
    is enabled by default. If you specify the SNAPSHOT IS DISABLED
    option, you cannot specify either of the SNAPSHOT IS ENABLED
    options, and you cannot back up the database on line. You can,
    however, continue to set snapshot options in the event that you
    will enable snapshots in the future. SQL warns you of a possible
    conflict in the setting of snapshot options while snapshots are
    disabled, but SQL will execute the statement.

4.3.108  –  SNAPSHOT_IS_ENABLED

    Syntax options:

    SNAPSHOT IS ENABLED IMMEDIATE | SNAPSHOT IS ENABLED DEFERRED

    Specifies when read/write transactions write database changes
    they make to the snapshot file used by read-only transactions.

    The default is ENABLED IMMEDIATE and causes read/write
    transactions to write copies of rows they modify to the snapshot
    file, regardless of whether or not a read-only transaction is
    active.

    The ENABLED DEFERRED option lets read/write transactions
    avoid writing copies of rows they modify to the snapshot file
    (unless a read-only transaction is already active). Deferring
    snapshot writing in this manner improves the performance for
    the read/write transaction. However, read-only transactions that
    attempt to start after an active read/write transaction starts
    must wait for all active read/write users to complete their
    transactions.

4.3.109  –  STATISTICS_COLLECTION

    Syntax options:

       STATISTICS COLLECTION IS ENABLED
       STATISTICS COLLECTION IS DISABLED

 Specifies whether the collection of statistics for the database is
 enabled or disabled. When you disable statistics for the database,
 statistics are not displayed for any of the processes attached to
 the database. Statistics are displayed using the RMU Show Statistics
 command.

    The default is STATISTICS COLLECTION IS ENABLED. You can disable
    statistics using the ALTER DATABASE and IMPORT statements.

    For more information on the RMU Show Statistics command, see the
    Oracle RMU Reference Manual.

    You can enable statistics collection by defining the logical
    name RDM$BIND_STATS_ENABLED. For more information about when to
    use statistics collection, see the Oracle Rdb7 Guide to Database
    Performance and Tuning.

4.3.110  –  storage-area-params

    Parameters that control the characteristics of database storage
    area files. You can specify most storage area parameters for
    either single-file or multifile databases, but the effect of the
    clauses differs.

    o  For single-file databases, the storage area parameters
       specify the characteristics for the single storage area in
       the database.

    o  For multifile databases, the storage area parameters specify
       a set of default values for any storage areas created by
       the CREATE DATABASE statement that do not specify their own
       values for the same parameters. The default values apply to
       the RDB$SYSTEM storage area, plus any others named in CREATE
       STORAGE AREA database elements.

       The CREATE STORAGE AREA clauses in a CREATE DATABASE statement
       can override these default values. The default values do
       not apply to any storage areas created later with the ALTER
       DATABASE statement.

4.3.111  –  SWEEP_INTERVAL

    Syntax option:

    SWEEP INTERVAL IS n SECONDS

    Specifies the interval, in seconds, between each Record Cache
    Server (RCS) sweep. Allowable values must be in the range from 1
    second to 3600 seconds (1 hour). The default is 1.

    The Record Cache Server (RCS) is a detached server process
    automatically invoked by the monitor when row caching is active.

    A sweep is one full pass through all active row cache areas to
    write modified rows back to the database storage areas.

4.3.112  –  SYSTEM_INDEX_(COMPRESSION_IS_._._._)

    This clause allows the database creator choose compressed system
    indexes. The default is SYSTEM INDEX (COMPRESSION IS DISABLED).

    If enabled Oracle Rdb uses run-length compression, which
    compresses any sequences of two or more spaces from text data
    types or two or more binary zeros from non-character data
    types. Compressing system indexes results in reduced storage
    and improved I/O. Unless your applications frequently perform
    concurrent data definition, you should compress system indexes.

    Once you create a database specifying the SYSTEM INDEX
    (COMPRESSION IS . . . ) clause, you only can change it using the
    EXPORT and IMPORT statements. You cannot alter the database to
    change the compression mode.

    The clause SYSTEM INDEX COMPRESSION IS is identical to this
    clause and is retained for compatibility with older versions
    of Oracle Rdb.

4.3.113  –  SYSTEM_INDEX_(PREFIX_CARDINALITY_COLLECTION_IS_._._._)

    This clause allows the database creator to adjust the prefix
    cardinality collection for system indices. Refer to the CREATE
    INDEX Statement for more details on these clauses. The default is
    PREFIX CARDINALITY COLLECTION IS ENABLED.

4.3.114  –  SYSTEM_INDEX_(TYPE_IS_._._._)

    This clause allows the database creator choose between SORTED or
    SORTED RANKED indices for system table. The default is SORTED.
    SORTED RANKED indices have advantages in space usage and reduced
    CPU during DDL operations for those system indices with many
    duplicates.

4.3.115  –  SYNONYMS_ARE_ENABLED

    Adds the optional system table RDB$OBJECT_SYNONYMS that is
    used for the CREATE SYNONYM, ALTER . . . RENAME TO and RENAME
    statements. The default if omitted is disabled.

4.3.116  –  THRESHOLD pages option

    Syntax option:

    THRESHOLD IS number-pages PAGES

    This number represents the number of sequential buffer accesses
    that must be detected before prefetching is started. The default
    is four buffers.

    If you specify the THRESHOLD option, you must have also specified
    the DETECTED ASYNC PREFETCH clause. You receive an error if you
    attempt to specify the THRESHOLD option with the ASYNC PREFETCH
    clause.

4.3.117  –  THRESHOLDS values

    Syntax options

    THRESHOLDS ARE ( val1 [,val2 [,val3] ] )

    Specifies one, two, or three threshold values. The threshold
    values represent a fullness percentage on a data page and
    establish four possible ranges of guaranteed free space on the
    data pages. When a data page reaches the percentage defined by a
    given threshold value, the space area management (SPAM) entry for
    the data page is updated to reflect the new fullness percentage
    and its remaining free space.

    The default thresholds are 70, 85, and 95 percent. If you
    specify only one or two values, unspecified values default to
    100 percent.

    You cannot specify the THRESHOLDS storage area parameter for
    single-file databases, and you cannot specify THRESHOLDS unless
    you also explicitly specify PAGE FORMAT IS MIXED. To specify
    thresholds for uniform storage areas, use the CREATE STORAGE MAP
    statement.

    For more information about setting space area management
    parameters, see the Oracle Rdb Guide to Database Maintenance.

4.3.118  –  USER username

    Syntax option:

    USER 'username'

    A character string literal that specifies the operating system
    user name that the database system uses for privilege checking.
    This clause also sets the value of the SYSTEM_USER value
    expression.

4.3.119  –  USER_LIMIT

    Syntax option:

    USER LIMIT IS max-glo-buffers

    Specifies the maximum number of global buffers each attach
    allocates. Because global buffer pools are shared by all
    attachments, you must define an upper limit on how many global
    buffers a single attach can allocate. This limit prevents a user
    from defining the RDM$BIND_BUFFERS logical name to use all the
    buffers in the global buffer pool. (The behavior of RDM$BIND_
    BUFFERS which depends on whether you are using local or global
    buffers, is explained in the Oracle Rdb7 Guide to Database
    Performance and Tuning.)

    The user limit cannot be greater than the total number of global
    buffers. The default is 5 buffers. The user limit appears as
    "maximum global buffer count per user" in RMU Dump command
    output.

    Decide the maximum number of global buffers a process can
    allocate per attach by dividing the total number of global
    buffers set by the NUMBER IS clause by the total number of
    attachments for which you want to guarantee access to the
    database. For example, if the total number of global buffers is
    200 and you want to guarantee at least 10 attachments access to
    the database, set the maximum number of global buffers per attach
    to 20.

    In general, when you use global buffers, you should set the
    maximum global buffer count per user higher than the default
    database buffer count. For maximum performance on a VMScluster
    system, tune the two global buffer parameters on each node in
    the cluster using the RMU Open command with the Global_Buffers
    qualifier.

    Although you can change the USER LIMIT IS parameter on line, the
    change does not take effect until the next time the database is
    opened.

    The NUMBER IS and USER LIMIT IS parameters are the only two
    buffer parameters specific to global buffers. They are,
    therefore, in effect on a per node rather than a per process
    basis.

4.3.120  –  USING password

    Syntax option:

    USING 'password'

    A character string literal that specifies the user's password for
    the user name specified in the USER clause.

4.3.121  –  txn-modes

    Specifies the transaction modes for the database.

    Mode           Description

    ALL            All modes are enabled.
    NONE           No modes are enabled.

                            Transaction Types

    [NO]READ       Allows read-only transactions on the database.
    ONLY
    [NO]READ       Allows read/write transactions on the database.
    WRITE
    [NO] BATCH     Allows batch-update transactions on the database.
    UPDATE         This mode executes without the overhead, or
                   security, or a recovery-unit journal file.
                   The batch-update transaction is intended for
                   the initial loading of a database. Oracle Rdb
                   recommends that this mode be disabled.

                             Reserving Modes

    [NO] SHARED    Allows tables to be reserved for shared mode. That
    [READ |        is, other users can work with those tables.
    WRITE]
    [NO]           Allows tables to be reserved for protected mode.
    PROTECTED      That is, other users can read from those tables.
    [READ |
    WRITE]
    [NO]           Allows tables to be reserved for exclusive access.
    EXCLUSIVE      That is, other users are prevented access to those
    [READ |        tables, even in READ ONLY transactions.
    WRITE]
    ALL            Allows other users to work with all tables.
    NONE           Allows no access to tables.

    For detailed information about the txn-modes, see the SET_
    TRANSACTION statement.

4.3.122  –  WAIT option

    Syntax option:

    WAIT n MINUTES FOR CLOSE

    Specifies the amount of time that Oracle Rdb waits before
    automatically closing a database. If anyone attaches during that
    wait time, the database is not closed.

    The default value for n is zero (0)  if the WAIT clause is
    not specified. The value for n can range from zero (0)  to
    35,791,394. However, Oracle Rdb does not recommend using large
    values.

4.3.123  –  WORKLOAD_COLLECTION

    Syntax options:

    WORKLOAD COLLECTION IS ENABLED | WORKLOAD COLLECTION IS DISABLED

    Specifies whether or not the optimizer records workload
    information in the system table RDB$WORKLOAD. The WORKLOAD
    COLLECTION IS ENABLED clause creates this system table if it
    does not exist. If you later disable workload collection, the
    RDB$WORKLOAD system table is not deleted.

    A workload profile is a description of the interesting table
    and column references used by queries in a database workload.
    When workload collection is enabled, the optimizer collects
    and records these references in the RDB$WORKLOAD system table.
    This work load is then processed by the RMU Analyze Statistics
    command which records useful statistics about the work load.
    These workload statistics are used by the optimizer at run time
    to deliver more accurate access strategies.

    Workload collection is disabled by default.

4.4  –  Examples

    Example 1: Creating a single-file database

    This command file example creates a single-file database that
    contains one table, EMPLOYEES, made up of domains defined within
    the CREATE DATABASE statement. The EMPLOYEES table has the same
    definition as that in the sample personnel database.

    For an example that creates a multifile version of the personnel
    database, see the CREATE STORAGE_AREA.

    SQL> -- By omitting a FILENAME clause, the database root file
    SQL> -- takes the file name from the alias:
    SQL> CREATE DATABASE ALIAS personnel
    cont> --
    cont> -- This CREATE DATABASE statement takes default
    cont> -- database root file and storage area parameter values.
    cont> --
    cont> -- Create domains.
    cont> -- Note that database elements do not terminate with semicolons.
    cont> --
    cont> CREATE DOMAIN ID_DOM CHAR(5)
    cont> --
    cont> CREATE DOMAIN LAST_NAME_DOM CHAR(14)
    cont> --
    cont> CREATE DOMAIN FIRST_NAME_DOM CHAR(10)
    cont> --
    cont> CREATE DOMAIN MIDDLE_INITIAL_DOM CHAR(1)
    cont> --
    cont> CREATE DOMAIN ADDRESS_DATA_1_DOM CHAR(25)
    cont> --
    cont> CREATE DOMAIN ADDRESS_DATA_2_DOM CHAR(20)
    cont> --
    cont> CREATE DOMAIN CITY_DOM CHAR(20)
    cont> --
    cont> CREATE DOMAIN STATE_DOM CHAR(2)
    cont> --
    cont> CREATE DOMAIN POSTAL_CODE_DOM CHAR(5)
    cont> --
    cont> CREATE DOMAIN SEX_DOM CHAR(1)
    cont> --
    cont> CREATE DOMAIN DATE_DOM DATE
    cont> --
    cont> CREATE DOMAIN STATUS_CODE_DOM CHAR(1)
    cont> --
    cont> -- Create a table:
    cont> --
    cont> CREATE TABLE EMPLOYEES
    cont>    (
    cont>    EMPLOYEE_ID      ID_DOM
    cont>      CONSTRAINT     EMP_EMPLOYEE_ID_NOT_NULL
    cont>      NOT NULL
    cont>     NOT DEFERRABLE,
    cont>    LAST_NAME        LAST_NAME_DOM,
    cont>    FIRST_NAME       FIRST_NAME_DOM,
    cont>    MIDDLE_INITIAL   MIDDLE_INITIAL_DOM,
    cont>    ADDRESS_DATA_1   ADDRESS_DATA_1_DOM,
    cont>    ADDRESS_DATA_2   ADDRESS_DATA_2_DOM,
    cont>    CITY             CITY_DOM,
    cont>    STATE            STATE_DOM,
    cont>    POSTAL_CODE      POSTAL_CODE_DOM,
    cont>    SEX              SEX_DOM,
    cont>      CONSTRAINT     EMP_SEX_VALUES
    cont>      CHECK          (
    cont>                     SEX IN ('M', 'F') OR SEX IS NULL
    cont>                     )
    cont>     NOT DEFERRABLE,
    cont>    BIRTHDAY         DATE_DOM,
    cont>    STATUS_CODE      STATUS_CODE_DOM,
    cont>      CONSTRAINT     EMP_STATUS_CODE_VALUES
    cont>      CHECK          (
    cont>                     STATUS_CODE IN ('0', '1', '2')
    cont>                     OR STATUS_CODE IS NULL
    cont>                     )
    cont>     NOT DEFERRABLE
    cont>    )
    cont> --
    cont> -- End CREATE DATABASE by specifying a semicolon:
    cont> ;

    Example 2: Creating a database not using the repository

    The following example:

    o  Creates the database root file acct.rdb in the default working
       directory

    o  Creates the snapshot file acct.snp in the default working
       directory

    o  Does not store the database definition in the repository

    o  Enables writing to the snapshot file

    o  Sets the allocation of the snapshot file to 200 pages

    SQL>    CREATE DATABASE ALIAS acct
    cont>     FILENAME acct
    cont>     SNAPSHOT IS ENABLED IMMEDIATE
    cont>     SNAPSHOT ALLOCATION IS 200 PAGES;

    Example 3: Creating a database with the snapshot file disabled

    This statement creates a database root file and, to save disk
    space, disables snapshot writing and sets the initial allocation
    size to 1.

    SQL>    CREATE DATABASE ALIAS PERS
    cont>     FILENAME personnel
    cont>     SNAPSHOT IS DISABLED
    cont>     SNAPSHOT ALLOCATION IS 1 PAGES;

    Example 4: Creating a database with ANSI/ISO-style privileges

    This statement creates a database in which all ANSI/ISO-style
    privileges are granted to the creator of the database, WARRING,
    and no privileges are granted to the identifier [*,*], the PUBLIC
    identifier.

    SQL>    CREATE DATABASE ALIAS EXAMPLE
    cont>     FILENAME ansi_test
    cont>     PROTECTION IS ANSI;
    SQL>
    SQL> SHOW PROTECTION ON DATABASE EXAMPLE;
    Protection on Alias EXAMPLE
    [SQL,WARRING]:
      With Grant Option:        SELECT,INSERT,UPDATE,DELETE,SHOW,CREATE,ALTER,DROP,
                                DBCTRL,OPERATOR,DBADM,SECURITY,DISTRIBTRAN
      Without Grant Option:     NONE
    [*,*]:
      With Grant Option:        NONE
      Without Grant Option:     NONE

    Example 5: Creating a database with a German collating sequence

    This statement creates a database named LITERATURE and specifies
    a collating sequence named GERMAN (based on the GERMAN collating
    sequence defined in the NCS library).

    SQL> CREATE DATABASE FILENAME literature
    cont> COLLATING SEQUENCE GERMAN GERMAN;
    SQL> SHOW COLLATING SEQUENCE
    User collating sequences in schema with filename LITERATURE
         GERMAN

    Example 6: Creating a database with global buffers

    This statement creates a database named parts.rdb.

    SQL> CREATE DATABASE ALIAS PARTS FILENAME parts
    cont> GLOBAL BUFFERS ARE ENABLED (NUMBER IS 110, USER LIMIT IS 17);

    Example 7: Creating a database specifying the database default
    and national character sets

    The following SQL statements create a database specifying the
    database default character set of DEC_KANJI and the national
    character set of KANJI. Use the SHOW DATABASE statement to see
    the database settings.

    SQL> SET DIALECT 'SQL99';
    SQL> CREATE DATABASE FILENAME mia_char_set
    cont>    DEFAULT CHARACTER SET DEC_KANJI
    cont>    NATIONAL CHARACTER SET KANJI
    cont>    IDENTIFIER CHARACTER SET DEC_KANJI;
    SQL> --
    SQL> SHOW CHARACTER SET;
    Default character set is DEC_MCS
    National character set is DEC_MCS
    Identifier character set is DEC_MCS
    Literal character set is DEC_MCS
    Display character set is UNSPECIFIED

    Alias RDB$DBHANDLE:
            Identifier character set is DEC_KANJI
            Default character set is DEC_KANJI
            National character set is KANJI

    See the SHOW for information on the SHOW CHARACTER SETS
    statement.

    Example 8: This example demonstrates how to:

    o  Create a multifile database

    o  Reserve slots for journal files, storage areas, and row caches

    o  Restrict access to the database for the current session

    o  Enable system index compression, row caching, and workload
       collection

    o  Disable statistics and cardinality collection

    o  Specify a default storage area

    o  Specify ROW as the lock-level default for the database

    o  Delay closing the database

    o  Create and assign a row cache to a storage area

    o  Specify the location of the recovery-unit journal file

    SQL> CREATE DATABASE FILENAME sample
    cont>   SNAPSHOT IS DISABLED
    cont>   RESERVE 10 JOURNALS
    cont>   RESERVE 10 STORAGE AREAS
    cont>   RESERVE 5 CACHE SLOTS
    cont>   SYSTEM INDEX COMPRESSION IS ENABLED
    cont>   ROW CACHE IS ENABLED
    cont>   WORKLOAD COLLECTION IS ENABLED
    cont>   RESTRICTED ACCESS
    cont>   STATISTICS COLLECTION IS DISABLED
    cont>   CARDINALITY COLLECTION IS DISABLED
    cont>   LOCKING IS ROW LEVEL
    cont>   DEFAULT STORAGE AREA IS area1
    cont>   OPEN IS AUTOMATIC (WAIT 5 MINUTES FOR CLOSE)
    cont>   RECOVERY JOURNAL (LOCATION IS 'SQL_USER1:[DAY]')
    cont> CREATE CACHE cache1
    cont>   CACHE SIZE IS 1000 ROWS
    cont>   ROW LENGTH IS 1000 BYTES
    cont> CREATE STORAGE AREA area1
    cont>   CACHE USING cache1;
    SQL>
    SQL> SHOW DATABASE *;
    Default alias:
        Oracle Rdb database in file sample
            Multischema mode is disabled
            Number of users:               50
            Number of nodes:               16
            Buffer Size (blocks/buffer):   6
            Number of Buffers:             20
            Number of Recovery Buffers:    20
            Snapshots are Disabled
            Carry over locks are enabled
            Lock timeout interval is 0 seconds
            Adjustable lock granularity is enabled (count is 3)
            Global buffers are disabled (number is 250, user limit is 5,
                      page transfer via disk)
            Journal fast commit is disabled
                    ( checkpoint interval is 0 blocks,
                      checkpoint timed every 0 seconds,
                      no commit to journal optimization,
                      transaction interval is 256 )
            AIJ File Allocation:           512
            AIJ File Extent:               512
            Statistics Collection is DISABLED
            Unused Storage Areas:          10
            Unused Journals:               10
            System Index Compression is ENABLED
            Restricted Access
            Journal is Disabled
            Backup Server:   Manual
            Log Server:      Manual
            Overwrite:       Disabled
            Notification:    Disabled
            Asynchronous Prefetch is Enabled (depth is 5)
            Asynchronous Batch Write is Enabled (clean buffers 5, max buffers 4)
            Lock Partitioning is DISABLED
            Incremental Backup Scan Optim uses SPAM pages
            Shutdown Time is 60 minutes
            Unused Cache Slots:          5
            Workload Collection is Enabled
            Cardinality Collection is Disabled
            Metadata Changes are Enabled
            Row Cache is Enabled (Sweep interval is 1 second,
             No Location)
            Detected Asynch Prefetch is Enabled (depth is 4, threshold is 4)
            Default Storage Area AREA1
            Mode is Open Automatic (Wait 5 minutes for close)
            RUJ File Location SQL_USER1:[DAY]
            Database Transaction Mode(s) Enabled:
                ALL
            Dictionary Not Required
            ACL based protections
    Storage Areas in database with filename sample
         RDB$SYSTEM                      List storage area.
         AREA1                           Default storage area.
    Journals in database with filename sample
         No Journals Found
    Cache Objects in database with filename sample
         CACHE1
    SQL> SHOW CACHE cache1;

         CACHE1
            Cache Size:            1000 rows
            Row Length:            1000 bytes
            Row Replacement:       Enabled
            Shared Memory:         Process
            Large Memory:          Disabled
            Window Count:          100
            Reserved Rows:         20
            Sweep Rows:            3000
         Reserving Slots for Sequences
        No Sweep Thresholds
            Allocation:            100 blocks
            Extent:                100 blocks

    Example 9: Reserving Slots for Sequences

    SQL> CREATE DATABASE FILENAME many_sequences
    cont> RESERVE 320 SEQUENCES;

    Example 10: Creating a Database with a Row Cache

    SQL> create database
    cont>     filename SAMPLE
    cont>     snapshot is disabled
    cont>     reserve 10 journals
    cont>     reserve 10 storage areas
    cont>     reserve 5 cache slots
    cont>     system index (compression is enabled, type sorted ranked)
    cont>     row cache is enabled
    cont>     workload collection is enabled
    cont>     restricted access
    cont>     default storage area is AREA1
    cont>     open is automatic (wait 5 minutes for close)
    cont>
    cont>     create cache CACHE_AREA1
    cont>         shared memory is process
    cont>         row length is 1000 bytes
    cont>         cache size is 204 rows
    cont>         checkpoint all rows to backing file
    cont>
    cont>     create storage area AREA1
    cont>         page format is UNIFORM
    cont>         cache using CACHE_AREA1
    cont> ;
    SQL>
    SQL> show database *
    Default alias:
        Oracle Rdb database in file SAMPLE
            Multischema mode is disabled
            Number of users:               50
            Number of nodes:               16
            Buffer Size (blocks/buffer):   6
            Number of Buffers:             20
            Number of Recovery Buffers:    20
            Snapshots are Disabled
            Carry over locks are enabled
            Lock timeout interval is 0 seconds
            Adjustable lock granularity is enabled (count is 3)
            Global buffers are disabled (number is 250, user limit is 5,
                      page transfer via disk)
            Journal fast commit is disabled
                    ( checkpoint interval is 0 blocks,
                      checkpoint timed every 0 seconds,
                      no commit to journal optimization,
                      transaction interval is 256 )
            AIJ File Allocation:           512
            AIJ File Extent:               512
            Statistics Collection is ENABLED
            Unused Storage Areas:          10
            Unused Journals:               10
            Unused Cache Slots:            5
            Unused Sequences:              32
            Restricted Access
            Journal is Disabled
            Backup Server:   Manual
            Log Server:      Manual
            Overwrite:       Disabled
            Notification:    Disabled
            Asynchronous Prefetch is Enabled (depth is 5)
            Asynchronous Batch Write is Enabled (clean buffers 5, max buffers 4)
            Lock Partitioning is DISABLED
            Incremental Backup Scan Optim uses SPAM pages
            Shutdown Time is 60 minutes
            Workload Collection is Enabled
            Cardinality Collection is Enabled
            Metadata Changes are Enabled
            Row Cache is Enabled
            Row cache: No Location
            Row cache: checkpoint updated rows to backing file
            Detected Asynch Prefetch is Enabled (depth is 4, threshold is 4)
            Default Storage Area AREA1
            Mode is Open Automatic (Wait 5 minutes for close)
            No RUJ File Location
            recovery journal buffers are in local memory
            Database Transaction Mode(s) Enabled:
                ALL
            Shared Memory:         Process
            Large Memory:          Disabled
            Security Checking is External
            System Index Compression is ENABLED
            System Index:
                Type is sorted ranked
                Prefix cardinality collection is enabled
            Logminer support is disabled
            Galaxy support is disabled
            Prestarted transactions are enabled
            Dictionary Not Required
            ACL based protections
    Storage Areas in database with filename SAMPLE
         AREA1                           Default storage area
         RDB$SYSTEM                      List storage area.
    Journals in database with filename SAMPLE
         No Journals Found
    Cache Objects in database with filename SAMPLE
         CACHE_AREA1

5  –  DOMAIN

    Creates a domain definition.

    A domain defines the set of values, character set, collating
    sequence, and formatting clause that a column in a table can
    have. The CREATE DOMAIN statement specifies the set of values by
    associating a data type with a domain name.

    There are two ways to specify a domain definition:

    o  With a domain name, data type, and any combination of the
       following optional clauses:

       -  Default value

       -  Stored name

       -  Collating sequence

       -  Formatting clauses such as EDIT STRING or QUERY HEADER

    o  With the FROM clause and a repository path name that refers to
       a field already defined in the repository

    When the CREATE DOMAIN statement executes, SQL adds the domain
    definition to the database.

    If you attached to the database with the PATHNAME specification,
    the domain definition is also added to the repository.

    You can refer to a domain instead of an SQL data type in the
    CREATE and ALTER TABLE statements, and in formal parameter
    declarations in functions and procedures. If the domain has to
    change, you need only change that one domain definition (using
    the ALTER DOMAIN statement) to change all the tables. This
    ability makes it easier to keep applications consistent.

    A domain can be referenced in the following locations:

    o  CREATE, ALTER and DROP DOMAIN statements

    o  CREATE and ALTER TABLE statements as the data type for a
       column

    o  CREATE and ALTER MODULE statements as the data type of a
       routine parameter, or the data type of declared variable

    o  CREATE FUNCTION statement as the data type of a function
       parameter or function result

    o  CREATE PROCEDURE statement as the data type of a procedure
       parameter

    o  CREATE and ALTER SYNONYM statement as the base object for a
       synonym

    o  as the datatype of a CAST expression

    o  as a data type of a DECLARE variable statement in interactive
       SQL

    o  as the source in the EDIT USING clause of the SELECT and PRINT
       statements in interactive SQL. The EDIT STRING is inherited
       from that domain.

5.1  –  Environment

    You can use the CREATE DOMAIN statement:

    o  In interactive SQL

    o  Embedded in host language programs to be precompiled

    o  As part of a procedure in an SQL module

    o  In dynamic SQL as a statement to be dynamically executed

5.2  –  Format

  CREATE DOMAIN -+
  +--------------+
  +-> <domain-name> +-----------------------------------++
  |                 +-> STORED NAME IS <stored-name> ---+|
  |+-----------------------------------------------------+
  |++-> IS data-type -+-+----------------------------+---+
  | +-> AS data-type -+ +--> DEFAULT value-expr -----+   |
  |   +--------------------------------------------------+
  |   +-+--------------------------------------------+-+
  |     +-> COLLATING SEQUENCE IS <collation-name> --+ |
  |     +-> NO COLLATING SEQUENCE -------------------+ |
  |   +------------------------------------------------+
  |   +-+----------------------+-+------------------------++->
  |     +-> domain-constraint -+ ++> sql-and-dtr-clause -++|
  |                               +---------<------------+ |
  +-> FROM -> <path-name> +----------------->----------+---+
                          +-> DATABASE ALIAS <alias> --+

  domain-name =

  -+---------------------------+-> <name-of-domain> --->
   +-+-> <schema-name> -+-> . -+
     +-> <alias> -------+

  data-type =

  --+-> char-data-types ---------------------------+-->
    +-> TINYINT --------------+-----+----------+---+
    +-> SMALLINT -------------+     +-> (<n>) -+   |
    +-> INTEGER --------------+                    |
    +-> BIGINT ---------------+                    |
    +-> LIST OF BYTE VARYING -+                    |
    +-> DECIMAL -++-----------------------------+--+
    +-> NUMERIC -++-> ( -> <n> +----------+-> ) +  |
    |                          +-> , <n> -+        |
    +-> FLOAT -+----------+------------------------+
    |          +-> (<n>) -+                        |
    +-> REAL --------------------------------------+
    +-> DOUBLE PRECISION --------------------------+
    +-> date-time-data-types ----------------------+

  char-data-types =

  -+-> CHAR -------------++------------++--------------------------------+-+->
   +-> CHARACTER --------++-> ( <n> ) -++-> CHARACTER SET char-set-name -+ |
   +-> CHAR VARYING -----+                                                 |
   +-> CHARACTER VARYING +                                                 |
   +-> VARCHAR --+> ( <n> ) ---+--------------------------------+----------+
   +-> VARCHAR2 -+             +-> CHARACTER SET char-set-name -+          |
   +-> LONG VARCHAR  ------------------------------------------------------+
   +-> NCHAR --------------+-+------------+--------------------------------+
   +-> NATIONAL CHAR ------+ +-> ( <n> ) -+                                |
   +-> NATIONAL CHARACTER -+                                               |
   +-> NCHAR VARYING --------------+-+------------+------------------------+
   +-> NATIONAL CHAR VARYING ------+ +-> ( <n> ) -+                        |
   +-> NATIONAL CHARACTER VARYING -+                                       |
   +-> RAW -> ( <n> ) -----------------------------------------------------+
   +-> LONG -+--------+----------------------------------------------------+
             +-> RAW -+

  date-time-data-types =

  --+-> DATE -+----------+-----------------+-->
    |         +-> ANSI  -+                 |
    |         +-> VMS ---+                 |
    +-> TIME ---> frac --------------------+
    +-> TIMESTAMP --> frac ----------------+
    +-> INTERVAL ---> interval-qualifier --+

  interval-qualifier =

  --+-> YEAR ---> prec --+-------------+-----------------+->
    |                    +-> TO MONTH -+                 |
    +-> MONTH --> prec ----------------------------------+
    +-> DAY ----> prec --+-------------------------------+
    |                    +-> TO -+-> HOUR ---------------+
    |                            +-> MINUTE -------------+
    |                            +-> SECOND -> frac -----+
    +-> HOUR ---> prec --+-------------------------------+
    |                    +-> TO -+-> MINUTE -------------+
    |                            +-> SECOND -> frac -----+
    +-> MINUTE -> prec --+-------------------------------+
    |                    +-> TO SECOND ------> frac -----+
    +-> SECOND -> seconds-prec --------------------------+

  literal =

  --+-> numeric-literal ----+--->
    +-> string-literal -----+
    +-> date-time-literal --+
    +-> interval-literal ---+

  domain-constraint =

  --+----------------------------------------------------+---->
    +-> CHECK ( predicate ) -+--------------------------++
                             +-> constraint-attributes -+

  sql-and-dtr-clause =

  -+-> QUERY HEADER IS -+> <quoted-string> +------------------+->
   |                    +------ / <--------+                  |
   +-> EDIT STRING IS <quoted-string> ------------------------+
   |                                                          |
   +-> QUERY NAME FOR -+-> DTR --------+-> IS <quoted-string> +
   |                   +-> DATATRIEVE -+                      |
   +-> DEFAULT VALUE FOR -+-> DTR --------+-> IS <literal> ---+
   |                      +-> DATATRIEVE -+                   |
   +-> NO QUERY HEADER ---------------------------------------+
   +-> NO EDIT STRING ----------------------------------------+
   +-> NO QUERY NAME ----+--> FOR -+-> DTR --------+----------+
   +-> NO DEFAULT VALUE -+         +-> DATATRIEVE -+          |
   +-> COMMENT IS -+-> <quoted-string> -+---------------------+
                   +------ / <----------+

5.3  –  Arguments

5.3.1  –  char-data-types

    A character type. See the Data_Types HELP topic for more
    information on data types.

5.3.2  –  character-set-name

    A valid character set.

5.3.3  –  COLLATING_SEQUENCE

    Specifies a collating sequence for the named domain.

    The OpenVMS National Character Set (NCS) utility provides a
    set of predefined collating sequences and also lets you define
    collating sequences of your own. The COLLATING SEQUENCE clause
    accepts both predefined and user-defined NCS collating sequences.

    Before you use the COLLATING SEQUENCE clause in a CREATE DOMAIN
    statement, you must first specify the NCS collating sequence for
    SQL using the CREATE COLLATING SEQUENCE statement. The sequence-
    name argument in the COLLATING SEQUENCE clause must be the same
    as the sequence-name in the CREATE COLLATING SEQUENCE statement.

5.3.4  –  COMMENT_IS

    Adds a comment about the domain. SQL displays the text of the
    comment when it executes a SHOW DOMAIN statement. Enclose the
    comment in single quotation marks ( ') and separate multiple
    lines in a comment with a slash mark (/).

5.3.5  –  DATABASE ALIAS alias

    In the FROM path-name clause, specifies the name for an attach
    to a particular database. SQL adds the domain definition to the
    database referred to by the alias.

    If you do not specify an alias, SQL adds the domain definition to
    the default database. See the User_Supplied_Names HELP topic for
    more information on default databases and aliases.

5.3.6  –  date-time-data-types

    A data type that specifies a date, time, or interval. See the
    Data_Types HELP topic for more information about date-time data
    types.

5.3.7  –  DEFAULT value-expr

    Provides a default value for a domain.

    You can use any value expression including subqueries,
    conditional, character, date/time, and numeric expressions as
    default values. See Value Expressions for more information about
    value expressions.

    For more information about NULL, see the NULL_Keyword HELP topic.

    The value expressions described in Value Expressions include
    DBKEY and aggregate functions. However, the DEFAULT clause is
    not a valid location for referencing a DBKEY or an aggregate
    function. If you attempt to reference either, you receive a
    compile-time error.

    If you do not specify a DEFAULT for a column, it inherits the
    DEFAULT from the domain. If you do not specify a default for
    either the column or domain, SQL assigns NULL as the default
    value.

5.3.8  –  domain-constraint

    Creates a constraint for the named domain.

    Specify a domain constraint when you create a domain to limit
    which values can be stored in columns based on the domain. Domain
    constraints specify that columns based on the domain contain only
    certain data values or that data values can or cannot be null.

    Use the CHECK clause to specify that a value must be within a
    specified range or that it matches a list of values. When you
    specify a CHECK clause for a domain constraint, you ensure that
    all values stored in columns based on the domain are checked
    consistently.

5.3.9  –  domain-name

    The name of a domain you want to create. The domain name must be
    unique among domain names in the schema. You can qualify it with
    an alias or (in multischema databases only) a schema name.

5.3.10  –  FROM pathname

    Specifies the repository path name of a repository field
    definition. SQL creates the domain using the definition from
    this field and gives the domain the name of the field definition.

    Creating a domain based on a repository domain definition is
    useful when many applications share the same definition. Changes
    to the common definition can be automatically reflected in all
    applications that use it.

    You can create a domain using the FROM path-name clause only if
    the field definition in the repository was originally created
    using the repository CDO utility. For instance, you cannot create
    a domain using the FROM path-name clause if the definition was
    created in the repository as part of an SQL session. Oracle
    Rdb requires that the field names referenced in the VALID IF
    expression of the CDO utility match the name of the global field
    being defined or changed.

                                   NOTE

       Changes by other users or applications to the field
       definition in the repository will affect the domain
       definition once the database is integrated to match the
       repository with an INTEGRATE DATABASE . . . ALTER FILES
       statement.

    You can use the FROM path-name clause only if the database was
    attached specifying PATHNAME. You can specify either a full
    repository path name or a relative repository path name.

    You cannot specify formatting clauses when you use the FROM path-
    name form of the CREATE DOMAIN statement.

    You cannot use the FROM path-name clause when embedding a CREATE
    DOMAIN statement in a CREATE DATABASE statement.

5.3.11  –  data-type

    Syntax options:

       IS data-type
       AS data-type

    A valid SQL data type. See the Data_Types HELP topic for more
    information on data types.

5.3.12  –  NO_COLLATING_SEQUENCE

    Specifies that this domain uses the standard default collating
    sequence, that is, ASCII. Use the NO COLLATING SEQUENCE clause to
    override the collating sequence defined for the database in the
    CREATE DATABASE or ALTER DATABASE statement.

5.3.13  –  sql-and-dtr-clause

    Optional SQL and DATATRIEVE formatting clause. See the DATATRIEVE
    HELP topic for more information on formatting clauses.

5.3.14  –  STORED_NAME_IS

    Specifies a name that Oracle Rdb uses to access a domain created
    in a multischema database. The stored name lets you access
    multischema definitions using interfaces, such as Oracle RMU,
    the Oracle Rdb management utility, that do not recognize multiple
    schemas in one database. You cannot specify a stored name for a
    domain in a database that does not allow multiple schemas. For
    more information about stored names, see the User_Supplied_Names
    HELP topic.

5.4  –  Examples

    Example 1: Creating a domain for a standard EMPLOYEE_ID
    definition

    The following example creates the domain ID_DOM, which will be a
    standard definition of columns for the employee ID:

    SQL> CREATE DOMAIN ID_DOM CHAR(5)
    SQL> COMMENT IS
    cont> 'standard definition of employee id';

    Example 2: Creating a domain for standard date

    The following example creates the domain STANDARD_DATE_DOM, which
    includes the edit string DD-MMM-YYYY:

    SQL> CREATE DOMAIN STANDARD_DATE_DOM DATE
    cont> EDIT STRING IS 'DD-MMM-YYYY'
    SQL> COMMENT IS
    cont> 'standard definition for complete dates';

    Example 3: Creating domains with default values

    The following example creates two domains: ADDRESS_DATA2_DOM and
    WORK_STATUS_DOM. The ADDRESS_DATA2_DOM domain has a default value
    of NULL; the WORK_STATUS_DOM domain has a default value of 1 to
    signify full-time work status.

    SQL> CREATE DOMAIN ADDRESS_DATA2_DOM CHAR(20)
    cont> DEFAULT NULL;
    SQL> --
    SQL> CREATE DOMAIN WORK_STATUS_DOM SMALLINT
    cont> DEFAULT 1;

    Example 4: Basing a domain on a repository field definition

    The following example illustrates using the repository as a
    source for the definition in a CREATE DOMAIN statement:

    $ SQL$
    SQL> ATTACH 'PATHNAME CDD$TOP.SQL.RDB.TEST.DATE';
    SQL> CREATE DOMAIN FROM DOMAIN_TEST;
    SQL> SHOW DOMAIN
    User domains in database with pathname
            SYS$COMMON:[CDDPLUS]SQL.RDB.TEST.DATE;1
    DOMAIN_TEST                     BIGINT

    Example 5: Creating a domain with a collating sequence

    The following example creates a domain with the predefined NCS
    collating sequence SPANISH. Note that you must first execute the
    CREATE COLLATING SEQUENCE statement:

    SQL> --
    SQL> CREATE COLLATING SEQUENCE SPANISH SPANISH;
    SQL> CREATE DOMAIN LAST_NAME_SPANISH CHAR(14)
    cont> COLLATING SEQUENCE IS SPANISH;
    SQL> --
    SQL> SHOW DOMAIN LAST_NAME_SPANISH
    LAST_NAME_SPANISH               CHAR(14)
     Collating sequence: SPANISH

    Example 6: Creating a domain using the database default character
    set

    For each of the following examples, assume the database was
    created specifying the database default character set as DEC_
    KANJI and the national character set as KANJI.

    The following example creates the domain DEC_KANJI_DOM using the
    database default character set:

    SQL> SHOW CHARACTER SET;
    Default character set is DEC_KANJI
    National character set is KANJI
    Identifier character set is DEC_KANJI
    Literal character set is DEC_KANJI

    Alias RDB$DBHANDLE:
            Identifier character set is DEC_KANJI
            Default character set is DEC_KANJI
            National character set is KANJI
    SQL> CREATE DOMAIN DEC_KANJI_DOM CHAR(8);
    SQL> SHOW DOMAIN
    User domains in database with filename MIA_CHAR_SET
    DEC_KANJI_DOM                   CHAR(8)

    Because the CREATE DOMAIN statement does not specify a character
    set, Oracle Rdb defines the domain using the database default
    character set. The database default character set does not
    display with the SHOW DOMAIN statement.

    An equivalent statement to the previous CREATE DOMAIN statement
    is:

    SQL> CREATE DOMAIN DEC_KANJI_DOM CHAR(8) CHARACTER SET DEC_KANJI;

    Example 7: Creating a domain using the national character set

    The following example creates the domain KANJI_DOM using the
    NCHAR data type to designate use of the national character set:

    SQL> CREATE DOMAIN KANJI_DOM NCHAR(8);
    SQL> SHOW DOMAIN
    User domains in database with filename MIA_CHAR_SET
    DEC_KANJI_DOM                   CHAR(8)
    KANJI_DOM                       CHAR(8)
             KANJI 8 Characters,  16 Octets

    When a character set other than the default is specified, the
    SHOW DOMAIN statement displays the character set associated with
    the domain.

    Two statements equivalent to the previous CREATE DOMAIN statement
    are:

    SQL> CREATE DOMAIN KANJI_DOM NATIONAL CHAR(8);
    SQL> CREATE DOMAIN KANJI_DOM CHAR(8) CHARACTER SET KANJI;

    Example 8: Creating a domain constraint

    The following example creates a domain constraint:

    SQL> -- The SET DIALECT 'SQL99' statement sets the default date format
    SQL> -- to the ANSI/ISO SQL standard format.
    SQL> --
    SQL>  SET DIALECT 'SQL99';
    SQL> --
    SQL> -- The following domain ensures that any dates inserted into the database
    SQL> -- are later than January 1, 1900:
    SQL> --
    SQL> CREATE DOMAIN TEST_DOM DATE
    cont>       DEFAULT NULL
    cont>       CHECK (VALUE > DATE'1900-01-01' OR
    cont>              VALUE IS NULL)
    cont>           NOT DEFERRABLE;
    SQL>
    SQL> -- The following example creates a table with one column based on the
    SQL> -- domain TEST_DOM:
    SQL> --
    SQL> CREATE TABLE DOMAIN_TEST
    cont>       (DATE_COL   TEST_DOM);
    SQL> --
    SQL> -- SQL returns an error if you attempt to insert data that does not
    SQL> -- conform to the domain constraint:
    SQL> --
    SQL> INSERT INTO DOMAIN_TEST
    cont>   VALUES (DATE'1899-01-01');
    %RDB-E-NOT_VALID, validation on field DATE_COL caused operation to fail

6  –  FUNCTION

    Creates an external function as a schema object in an Oracle Rdb
    database.

    The CREATE FUNCTION statement is documented under the CREATE
    Routine. For complete information on creating an external
    function definition, see the CREATE Routine Help topic.

7  –  INDEX

    Creates an index for a table. An index allows direct access to
    the rows in the table to avoid sequential searching.

    You define an index by listing the columns in a table that make
    up the index. You can define more than one index for a table. The
    index can be made up of one column, or two or more columns. An
    index made up of two or more columns is called a multisegmented
    index.

    Optional arguments to the CREATE INDEX statement let you specify:

    o  The type of index structure (hashed, sorted nonranked, or
       sorted ranked)

    o  The names of a storage area or storage areas that contain the
       index

    o  Physical characteristics of a sorted index structure, such as
       index node size and the initial fullness percentage of each
       node

    o  Compression characteristics, including compressed key suffixes
       for text indexes and integer column compression for smallint
       or integer numeric columns

    o  Compression of space characters from text data types and of
       binary zeros from nontext data types

    o  Thresholds for the logical storage areas that contain the
       index

    o  A comment for the index definition

    o  Whether logging to the .ruj and .aij files is enabled or
       disabled for the create index operation

7.1  –  Environment

    You can use the CREATE INDEX statement:

    o  In interactive SQL

    o  Embedded in host language programs to be precompiled

    o  As part of a procedure in an SQL module

    o  In dynamic SQL as a statement to be dynamically executed

7.2  –  Format

  CREATE -+-----------+-> INDEX <index-name> ------------------+
          +-> UNIQUE -+                                        |
  +------------------------------------------------------------+
  +--+-----------------------------------+-> ON <table-name> --+
     +-> STORED NAME IS <stored-name> ---+                     |
  +----------------------------- <-----------------------------+
  +> ( +> <column-name> --+
       |   +--------------+
       |   +-+-------------++-----------------------------+-+- ) -+
       |     +> ASCENDING -++> SIZE IS <n> ---------------+ |     |
       |     +> DESCENDING ++> MAPPING VALUES <l> TO <h> -+ |     |
       +---------------------- , <--------------------------+     |
  +------------------------------ <-------------------------------+
  ++----------------+-+----------------------------+-----------+
   +-> type-clause -+ +-> index-attributes-clause -+           |
  +------------------------------<-----------------------------+
  ++-----------------------+-------------------------------------->
   +-> index-store-clause -+

  type-clause =

  -> TYPE IS +> HASHED +-------------+------------------------------+>
             |         +> ORDERED ---+                              |
             |         +> SCATTERED -+                              |
             +> SORTED +-----------------------------------------+-+|
                       +> RANKED -+-----------------------------++ ||
                                  +> DUPLICATES ARE COMPRESSED -+  ||
                     +---------------------------------------------+|
                     +-+-----------------------+--------------------+
                       +> sorted-index-clause -+

  sorted-index-clause =

  --+-+-> NODE SIZE <number-bytes> ----------+-+-->
    | +-> PERCENT FILL <percentage> ---------+ |
    | +-> USAGE -+-> UPDATE -+---------------+ |
    |            +-> QUERY --+                 |
    +------------------- <---------------------+

  index-attributes-clause =

  -+-+---------------------------------------------------------+-+->
   | +-> ENABLE COMPRESSION  rlc-attr -------------------------+ |
   | +-> DISABLE COMPRESSION ----------------------------------+ |
   | +-> threshold-clause -------------------------------------+ |
   | +-> LOGGING ----------------------------------------------+ |
   | +-> NOLOGGING --------------------------------------------+ |
   | +-> COMMENT IS -+-> '<string>' -+-------------------------+ |
   | |               +------- / <----+                         | |
   | +-> PREFIX CARDINALITY COLLECTION IS -+-> ENABLED ------+-+ |
   | |                                     +-> ENABLED FULL -+ | |
   | |                                     +-> DISABLED -----+ | |
   | +-> MAINTENANCE IS -+-> DISABLED -----------------+-------+ |
   |                     +-> ENABLED -+--------------+-+         |
   |                                  +-> DEFERRED --+           |
   |                                  +-> IMMEDIATE -+           |
   +---------------------------- <-------------------------------+

  rlc-attr =

  --+--------------------------------+--------->
    +--> (MINIMUM RUN LENGTH <n> ) --+

  index-store-clause =

  STORE ----------------------+
  +---------------------------+
  ++-> IN area-spec ---------------------------------------------+>
   +-> USING -> ( -+--> <column-name> -+-> ) ----------+         |
                   +------- , <--------+               |         |
   +---------------------------------------------------+         |
   ++> IN area-spec -------------------------------------+       |
    | +--------------------------------------------------+       |
    | +-> WITH LIMIT OF -> ( -+--> <literal> -+-> ) ---+---+     |
    |                         +------ , <-----+        |   |     |
    +-----------------------<--------------------------+   |     |
  +--------------------------------------------------------+     |
  ++------------------------------------------------------------++
   +-> OTHERWISE IN area-spec ----------------------------------+

  threshold-clause =

  --+-> THRESHOLD -+-> IS -+-> ( --> <val1> --> ) ---------+->
    |              +-> OF -+                               |
    |                                                      |
    +-> THRESHOLDS -+-> ARE -+-----------+                 |
                    +-> OF  -+           |                 |
      +----------------------------------+                 |
      +-> ( --> <val1> -+---------------------------+-> ) -+
                        +-> , <val2> -+-------------+
                                      +-> , <val3> -+

  area-spec =

  --> <area-name> -+---------------------------------------------------+->
                   +-> ( -++-> threshold-clause ---------------++-> ) -+
                          |+-> LOGGING ------------------------+|
                          |+-> NOLOGGING ----------------------+|
                          |+-> PARTITION <name> ---------------+|
                          |+-> COMMENT IS -+--> 'string' ---+--+|
                          |                +------- / <-----+   |
                          +---------------- ,  -----------------+

7.3  –  Arguments

7.3.1  –  ASCENDING

    An optional keyword that causes SQL to create ascending index
    segments. If you omit the ASCENDING or DESCENDING keyword,
    ascending is the default.

7.3.2  –  BUILD_ALL_PARTITIONS

    This clause operates on an index in build-pending state (created
    using MAINTENANCE IS ENABLED DEFERRED) and builds all incomplete
    partitions. If the index is not in build-pending state then the
    statement completes successfully with a warning.

    No other clauses may appear in the same ALTER INDEX statement.

7.3.3  –  BUILD PARTITION partition-name

    This clause operates on an index in build-pending state (created
    using MAINTENANCE IS ENABLED DEFERRED) and builds the named
    partition. If the index is not in build-pending state then the
    statement completes successfully with a warning.

    No other clauses may appear in the same ALTER INDEX statement.

7.3.4  –  column-name

    The name of the column or columns that make up the index key.

    You can create a multisegmented index key by naming two or more
    columns, which are joined to form the index key. All the columns
    must be part of the same table. Separate multiple column names
    with commas.

                                   NOTE

       If column-name refers to a column defined as CHAR, VARCHAR
       or LONG VARCHAR data type, the size of the column must be
       less than or equal to 254 characters, or the SIZE IS clause
       must be used.

7.3.5  –  COMMENT IS 'string '

    Adds a comment about the storage map definition for the index.
    SQL displays the text of the comment when it executes a SHOW
    INDEXES statement. Enclose the comment in single quotation marks
    ( ') and separate multiple lines in a comment with a slash mark
    (/).

7.3.6  –  DESCENDING

    An optional keyword that causes SQL to create descending index
    segments. If you omit the ASCENDING or DESCENDING keyword,
    ascending is the default.

7.3.7  –  DISABLE_COMPRESSION

    Disables compression indexes.

    If compression is disabled, no form of compression is used for
    hashed indexes, and prefix compression or suffix compression is
    used for sorted indexes. Prefix compression is the compression
    of the first bytes of an index key that are common in consecutive
    index keys. Prefix compression saves space by not storing these
    common bytes of information. Conversely, suffix compression is
    the compression of the last bytes from adjacent index keys. These
    bytes are not necessary to guarantee uniqueness.

    You cannot enable index compression using the ALTER INDEX
    statement once you specified the DISABLE COMPRESSION clause of
    the CREATE INDEX statement.

    Index compression is disabled by default.

7.3.8  –  DUPLICATES_ARE_COMPRESSED

    Specifies that duplicates are compressed. If a sorted ranked
    index allows duplicate entries, you can store many more records
    in a small space when you compress duplicates, therefore,
    minimizing I/O and increasing performance. Oracle Rdb uses
    patented technology called byte-aligned bitmap compression
    to represent the dbkeys for the duplicate entries instead of
    chaining the duplicate entries together with uncompressed dbkeys.

    Duplicates are compressed by default if you specify RANKED
    without specifying the DUPLICATES ARE COMPRESSED clause.

    You cannot use the DUPLICATES ARE COMPRESSED clause when you
    create nonranked indexes or when you specify the UNIQUE keyword.

    See the Oracle Rdb Guide to Database Design and Definition for
    more information on sorted ranked B-tree indexes.

7.3.9  –  ENABLE_COMPRESSION

    Specifies that sorted and hashed indexes are stored in a
    compressed form.

    If compression is enabled, Oracle Rdb uses run-length compression
    to compress a sequence of space characters (octets) from text
    data types and binary zeros from nontext data types. Different
    character sets have different representations of the space
    character. Oracle Rdb compresses the representation of the space
    character for the character sets of the columns comprising the
    index values.

    You cannot disable index compression using the ALTER INDEX
    statement once you specified the ENABLE COMPRESSION clause of
    the CREATE INDEX statement.

    For more information on compressed indexes, see the Oracle Rdb
    Guide to Database Design and Definition.

7.3.10  –  IN area name

    Associates the index directly with a single storage area. All
    entries in the index are stored in the area you specify.

7.3.11  –  index-name

    The name of the index. You can use this name to refer to the
    index in other statements. You must qualify the index name with
    the authorization identifier if the schema is not the default
    schema. When choosing a name, specify a valid name. See the User_
    Supplied_Names HELP topic for more information.

7.3.12  –  index-store-clause

    A storage map definition for the index. You can specify a store
    clause for indexes in a multifile database only. The STORE clause
    in a CREATE INDEX statement allows you to specify which storage
    area files are used to store the index entries:

    o  All index entries can be associated with a single storage
       area.

    o  Index entries can be systematically distributed, or
       partitioned, among several storage areas by specifying upper
       limits on the values for a key in a particular storage area.

    If you omit the storage map definition, the default is to store
    all the entries for an index in the main default storage area.

    You should define a storage area for an index that matches the
    storage map for the table with which it is associated.

    In particular, under the following conditions, the database
    system stores the index entry for a row on or near the same data
    page that contains the actual row:

    o  The storage areas for a table have a mixed page format.

    o  You specify an identical store clause for the index as exists
       in the storage map for the table.

    o  The storage map for the table also names the index in the
       PLACEMENT VIA INDEX clause.

    Such coincidental clustering of indexes and rows can reduce I/O
    operations. With hashed indexes and coincidental clustering, the
    database system can retrieve rows for exact-match queries in one
    I/O operation.

    For sorted indexes, specifying an identical storage map reduces
    I/O contention on index nodes.

7.3.13  –  LOGGING

    Syntax options:

    LOGGING |NOLOGGING The LOGGING clause specifies that index nodes
    and hash buckets be logged when written to the database. Logging
    includes writing data and management records to the recovery-unit
    journal file (.ruj) and after-image journal files (.aij). When
    the NOLOGGING clause is specified then only a small number of
    management records are logged in the recovery-unit journal file
    (.ruj) and after-image journal files (.aij). See the Usage Notes
    below for more information.

    LOGGING and NOLOGGING can be specified per storage area
    (partition) or as a default for the CREATE INDEX statement. The
    LOGGING and NOLOGGING clauses are mutually exclusive; specify
    only one. The LOGGING clause is the default.

7.3.14  –  MAINTENANCE_IS_DISABLED

    An index created using this clause is not maintained. The index
    definition serves only as a template.

7.3.15  –  MAINTENANCE_IS_ENABLED_DEFERRED

    An index created using this clause does not contain index keys
    for the current rows in the table. Until this index is built
    (using ALTER INDEX . . . BUILD), the index is placed in a build-
    pending state. Any table with a build-pending index can not be
    updated using the INSERT, DELETE, or UPDATE statements.

7.3.16  –  MAINTENANCE_IS_ENABLED_IMMEDIATE

    This is the default behavior for CREATE INDEX.

7.3.17  –  MAPPING_VALUES

    l to h

    A compression clause for all-numeric columns that translates the
    column values into a compact, encoded form. You can mix mapped
    and unmapped columns, but the most storage space is gained by
    building indexes of multiple columns of data type SMALLINT or
    INTEGER. Oracle Rdb attempts to compress all such columns into
    the smallest possible space.

    The l (low) through h (high) specifies the range of integers as
    the value of the index key.

    The Oracle Rdb SQL Reference Manual describes addiional
    restrictions about this argument.

7.3.18  –  MINIMUM_RUN_LENGTH

    Specifies the minimum length of the sequence that Oracle Rdb
    should compress. You cannot alter this value once you set it.

    If you specify MINIMUM RUN LENGTH 2, Oracle Rdb compresses
    sequences of two or more spaces or of two or more binary zeros
    for single-octet character sets, and compresses one space or
    one binary zero for multi-octet character sets. As it compresses
    the sequences, Oracle Rdb replaces the sequence with the value
    of the minimum run length plus 1 byte. If many of the index
    values contain one space between characters in addition to
    trailing spaces, use a minimum run length of 2, so that you do
    not inadvertently expand the index beyond the 255-byte limit. If
    you inadvertently expand the index beyond 255 bytes during index
    creation, Oracle Rdb returns a warning message.

    The default minimum run length value is 2. Valid values for the
    minimum run length range from 1 to 127. Oracle Rdb determines
    which characters are compressed.

7.3.19  –  NODE_SIZE

    The size in bytes of each index node.

    The number and level of the resulting index nodes depend on:

    o  This number-bytes value

    o  The number and size of the index keys

    o  The value specified in the PERCENT FILL or USAGE clauses

    If you omit the NODE SIZE clause, the default value is:

    o  430 bytes if the total index key size is 120 bytes or less

    o  860 bytes if the total index key size is more than 120 bytes

    The index key size is the number of bytes it takes to represent
    the column value in the sorted index.

    See the Oracle Rdb SQL Reference Manual for details on
    determining the valid range for a user-specified index node size.

7.3.20  –  OTHERWISE IN area name

    For partitioned storage maps only, specifies the storage area
    that is used as the overflow partition. An overflow partition
    is a storage area that holds any values that are higher than
    those specified in the last WITH LIMIT TO clause. An overflow
    partition holds those values that "overflow" the partitions that
    have specified limits.

7.3.21  –  PARTITION name

    Names the partition. The name can be a delimited identifier.
    Partition names must be unique within the index. If you do not
    specify this clause, Oracle Rdb generates a default name for the
    partition.

7.3.22  –  PERCENT_FILL

    Specifies the initial fullness percentage for each node in the
    index structure being changed. The valid range is 1 percent to
    100 percent. The default is 70 percent.

    Both the PERCENT FILL and USAGE clauses specify how full an index
    node should be initially. Specify either PERCENT FILL or USAGE,
    but not both.

7.3.23  –  PREFIX_CARDINALITY_COLLECTION_IS_DISABLED

    This setting disables the cardinality collection and, instead,
    uses a fixed scaling algorithm which assumes a well balanced
    index tree.

7.3.24  –  PREFIX_CARDINALITY_COLLECTION_IS_ENABLED

    This is the default behavior for CREATE INDEX. The Oracle Rdb
    optimizer collects approximate cardinality values for the index
    columns to help in future query optimization. Note that no extra
    I/O is incurred to collect these values and, therefore, adjacent
    key values from other index nodes can not be checked. Hence, some
    inaccuracy may be seen for these indexes. In most cases, this is
    adequate for query optimizations.

7.3.25  –  PREFIX_CARDINALITY_COLLECTION_IS_ENABLED_FULL

    This setting requests that extra I/O be performed, if required,
    to ensure that the cardinality values reflect the key value
    changes of adjacent index nodes.

7.3.26  –  REBUILD_ALL_PARTITIONS

    This clause combines the TRUNCATE and BUILD actions into a single
    function. No other clauses may appear in the same ALTER INDEX
    statement.

7.3.27  –  REBUILD PARTITION partition-name

    This clause combines the TRUNCATE and BUILD actions into a single
    function for the named partition. No other clauses may appear in
    the same ALTER INDEX statement.

7.3.28  –  SIZE IS n

    A compression clause for text or varying text index keys that
    limits the number of characters used for retrieving data. The n
    specifies the number of characters of the key that are used in
    the index.

                                   NOTE

       Although you can create a SIZE IS index and specify the
       UNIQUE clause, truncating the index key values may make the
       key values non-unique. In this case, the index definition or
       insert or update statements fail.

7.3.29  –  STORE IN area name

    Associates the index directly with a single storage area. All
    entries in the index are stored in the area you specify.

7.3.30  –  STORE_USING

    Specifies columns whose values are used as limits for
    partitioning the index across multiple storage areas. You cannot
    name columns not specified as index key segments.

    If the index key is multisegmented, you can include some or all
    the columns that are joined to form the index key. You must
    specify the columns in the order in which they were specified
    when the index key was defined. If you only include a subset
    of the columns, you must include the leading segments of the
    multisegmented index.

    For example, if a CREATE INDEX statement specifies a
    multisegmented index based on the columns LAST_NAME, FIRST_NAME,
    and MIDDLE_INITIAL, then the USING clause must include the first
    segment LAST_NAME, or the first two segments, LAST_NAME, and
    FIRST_NAME, or all the segments of the index. This is true for
    sorted indices only.

    The database system uses the values of the columns specified in
    the STORE USING clause as a key to determine in which storage
    area an index entry associated with a new table row belongs.

    There is no restriction for hashed scattered indexes. For hashed
    ordered indexes, all segments listed, except the last segment
    can be included. Also, HASHED ORDERED indexes have further
    restrictions on the data type of the final column; it must be
    a date/time or integer numeric data type.

7.3.31  –  STORED_NAME_IS

    Specifies a name that Oracle Rdb uses to access an index created
    in a multischema database. The stored name allows you to access
    multischema definitions using interfaces, such as Oracle RMU,
    the Oracle Rdb management utility, that do not recognize multiple
    schemas in one database. You cannot specify a stored name for
    an index in a database that does not allow multiple schemas. For
    more information about stored names, see the User_Supplied_Names
    HELP topic.

7.3.32  –  table-name

    The name of the table that includes the index. The table must be
    in the same schema as the index.

7.3.33  –  threshold-clause

    Specifies one, two, or three default threshold values for logical
    areas that contain the index in storage areas with uniform
    page formats. By setting threshold values, you can make sure
    that Oracle Rdb does not overlook a page with sufficient space
    to store compressed data. The threshold values (val1, val2,
    and val3) represent a fullness percentage on a data page and
    establish three possible ranges of guaranteed free space on the
    data pages. For more information about logical area thresholds,
    see the CREATE STORAGE_MAP.

    If you use data compression, you should use logical area
    thresholds to obtain optimum storage performance.

    You cannot specify the thresholds for the storage map attribute
    for any area that is a mixed page format. If you have a mixed
    page format, set the thresholds for the storage area using the
    ADD STORAGE AREA or CREATE STORAGE AREA clause of the ALTER
    DATABASE, CREATE DATABASE, or IMPORT statements.

    For more information about SPAM pages, see the Oracle Rdb Guide
    to Database Design and Definition.

7.3.34  –  TRUNCATE_ALL_PARTITIONS

    This clause operates in a similar way to TRUNCATE TABLE, but just
    on one index. The index is automatically set to MAINTENANCE IS
    ENABLED DEFERRED (i.e. build-pending state) if it was currently
    ENABLED IMMEDIATE. Otherwise is stays in a disabled state.

    No other clauses may appear in the same ALTER INDEX statement.

7.3.35  –  TRUNCATE PARTITION partition-name

    This clause operates on just the named index partition. The index
    is automatically set to MAINTENANCE IS ENABLED DEFERRED (that
    is, build-pending state) if it was currently ENABLED IMMEDIATE.
    Otherwise is stays in a disabled state.

    No other clauses may appear in the same ALTER INDEX statement.

7.3.36  –  TYPE_HASHED

    Syntax options:

    TYPE IS HASHED ORDERED | TYPE IS HASHED SCATTERED

    Specifies that the index is a hashed index. If you specify
    HASHED, you cannot use the NODE SIZE, PERCENT FILL, or USAGE
    clauses. You can, however, specify if the data is ORDERED or
    SCATTERED. SCATTERED is the default.

    The TYPE IS HASHED SCATTERED clause is appropriate in situations
    where data is not evenly distributed across storage areas. This
    option places a record in a page that is chosen by applying a
    hashing algorithm to the index key. As a result, the record
    distribution pattern is not guaranteed to be even; therefore,
    some pages may be chosen more often than others. The TYPE IS
    HASHED SCATTERED clause is the default and is recommended unless
    your data meets the following criteria for the TYPE IS HASHED
    ORDERED clause:

    o  The last column of the index key must be one of the following
       data types:

       -  TINYINT

       -  SMALLINT

       -  INTEGER

       -  BIGINT

       -  DATE (both ANSI and VMS)

       -  TIME

       -  TIMESTAMP

       -  INTERVAL

    o  The index must be ascending.

    o  The index must not be compressed or have mapping values.

    The TYPE IS HASHED ORDERED clause is ideal for applications where
    the index key values are evenly distributed across a given range.
    This places a record in a page derived by applying an ordered
    hashing algorithm to the index key. As a result, the distribution
    pattern is guaranteed to follow the index key distribution. In
    addition, if you know the range of values, you can size the
    storage area and pages to minimize overflows. If the index
    key values are not evenly distributed, use the TYPE IS HASHED
    SCATTERED clause.

    Hashed indexes must be stored in storage areas created with
    mixed page format, which means they are valid only in multifile
    databases.

    Hashed indexes provide fast and direct access to specific rows
    and are effective mainly for queries that specify an exact-match
    retrieval on a column or columns that are also the key to a
    hashed index. (For instance, SELECT EMPLOYEE_ID FROM EMPLOYEES
    WHERE EMPLOYEE_ID = "00126", makes effective use of a hashed
    index with EMPLOYEE_ID as the index key.)

    In a hashed indexing scheme, the index key value is converted
    mathematically to a relative page number in the storage area
    of a particular table. A hash bucket is a data structure that
    maintains information about an index key, and a list of internal
    pointers, called database keys or dbkeys, to rows that contain
    the particular value of the index key. To find a row using the
    hashed index, the database system searches the hash bucket, finds
    the appropriate dbkey, and then fetches the table row.

    Hashed indexes are most effective for random, direct access when
    the query supplies the entire index key on which the hashed index
    is defined. For these types of access, I/O operations can be
    significantly reduced. This is particularly useful for tables
    with many rows and large indexes. For example, to retrieve a
    row using a sorted index that is four levels deep, the database
    system may need to perform five I/O operations. By using hashing,
    the number of I/O operations is reduced to two, at most.

    You can define a hashed index and a sorted index for the same
    column. Then, depending on the type of query you use, the Oracle
    Rdb optimizer chooses the appropriate method of retrieval. For
    example, if your query contains an exact-match retrieval, the
    optimizer uses hashed index access. If your query contains
    a range retrieval, the optimizer uses the sorted index. This
    strategy incurs the additional overhead of maintaining two
    indexes, therefore, you need to consider the advantages of fast
    retrieval against the disadvantages of updating two indexes for
    every change to data.

    See the Oracle Rdb Guide to Database Design and Definition for
    a detailed discussion of the relative advantages of hashed and
    sorted indexes.

7.3.37  –  TYPE_IS_SORTED

    Specifies that the index is a sorted, nonranked (B-tree) index.
    If you omit the TYPE IS clause, SORTED is the default. Sorted
    indexes improve the performance of queries that compare values
    using range operators (like BETWEEN and greater than (>)).  (For
    example, SELECT EMPLOYEE_ID FROM EMPLOYEES WHERE EMPLOYEE_ID
    > 200 is a query that specifies a range retrieval and makes
    effective use of a sorted index.)

    You can define a hashed index and a sorted index for the same
    column. Then, depending on the type of query you use, the Oracle
    Rdb optimizer chooses the appropriate method of retrieval. For
    example, if your query contains an exact-match retrieval, the
    optimizer may use hashed index access. If your query contains
    a range retrieval, the optimizer uses the sorted index. This
    strategy incurs the additional overhead of maintaining two
    indexes; however, you need to consider the advantages of fast
    retrieval against the disadvantages of updating two indexes for
    every change to data.

    See the Oracle Rdb Guide to Database Design and Definition for
    more information on the relative advantages of hashed and sorted
    indexes.

    If you specify a SORTED index, you can optionally specify
    NODE SIZE, PERCENT FILL, and USAGE clauses that control the
    characteristics of the nodes in the index.

7.3.38  –  TYPE_IS_SORTED_RANKED

    Specifies that the index is a sorted, ranked (B-tree) index.
    The ranked B-tree index allows better optimization of queries,
    particularly queries involving range retrievals. Oracle Rdb can
    make better estimates of cardinality, reducing disk I/O and lock
    contention. Oracle Rdb recommends using ranked sorted indexes.

7.3.39  –  UNIQUE

    A keyword that specifies whether or not each value of the index
    must be unique. If you try to store the same value twice in a
    column or set of columns that have an index defined as UNIQUE,
    SQL returns an error message the second time and does not store
    or modify the row that contains the value. This is true for null
    values as well as any other value.

    If you specify UNIQUE, SQL checks as it executes the CREATE INDEX
    statement to see if the table already contains duplicate values
    for the index.

7.3.40  –  USAGE

    Syntax options:

    USAGE UPDATE | USAGE QUERY

    Specifies a PERCENT FILL value appropriate for update- or query-
    intensive applications. The USAGE UPDATE clause sets the PERCENT
    FILL value at 70 percent. The USAGE QUERY clause sets the PERCENT
    FILL value at 100 percent.

7.3.41  –  WITH_LIMIT_OF

    Specifies the highest value for the index key that resides in a
    particular storage area if ASCENDING is defined. If DESCENDING
    is defined, the lowest value is specified for the index key that
    resides in a particular storage are. For multicolumn index keys,
    specify a literal value for each column.

    The number of literals in the list must be the same as the number
    of columns in the USING clause. Repeat this clause to partition
    the entries of an index among multiple storage areas. The data
    type of the literals must agree with the data type of the column.
    For character columns, enclose the literals in single quotation
    marks.

    If you are creating a multisegmented index using multisegmented
    keys and the STORE USING . . . WITH LIMIT clause, and if the
    values for the first key are all the same, then set the limit
    for the first key at that value. This ensures that the value of
    the second key determines the storage area in which each row is
    stored.

7.4  –  Examples

    Example 1: Creating a simple table index

    This statement names the index (EMP_EMPLOYEE_ID) and names the
    column to serve as the index key (EMPLOYEE_ID).

    The UNIQUE argument causes SQL to return an error message if a
    user tries to store an identification number that is already
    assigned.

    SQL> CREATE UNIQUE INDEX EMP_EMPLOYEE_ID ON EMPLOYEES
    cont>    (EMPLOYEE_ID);

    Example 2: Creating an index with descending index segments

    This statement names the index (EMP_EMPLOYEE_ID) and names
    the column to serve as the descending index key (EMPLOYEE_ID
    DESCENDING).

    The DESCENDING keyword causes the keys to be sorted in descending
    order. If you do not specify DESCENDING or ASCENDING, SQL sorts
    the keys in ascending order.

    SQL> CREATE UNIQUE INDEX EMP_EMPLOYEE_ID ON EMPLOYEES
    cont>    (EMPLOYEE_ID DESCENDING);

    Example 3: Creating a multisegmented index

    SQL> CREATE INDEX EMP_FULL_NAME ON EMPLOYEES
    cont>     (LAST_NAME,
    cont>      FIRST_NAME,
    cont>      MIDDLE_INITIAL);

    This statement names three columns to be used in the index EMP_
    FULL_NAME. SQL concatenates these three columns to make the
    multisegmented index.

    Example 4: Creating a compressed numeric index

    SQL> CREATE INDEX YEAR1_IND ON DEGREES
    cont> (YEAR_GIVEN ASCENDING MAPPING VALUES 1950 TO 1970);

    This statement creates ascending index segments for the YEAR_
    GIVEN column in the DEGREES table, compressing the year values.

    Example 5: Creating a truncated text index

    SQL> CREATE INDEX COL_NAME_IND ON COLLEGES
    cont> (COLLEGE_NAME SIZE IS 20);

    This statement creates a compressed index, COL_NAME_IND, on the
    COLLEGES table so that the number of octets from the COLLEGE_NAME
    column that are used as a key cannot exceed 20 octets.

    Example 6: Creating an index in a uniform storage area with
    thresholds.

    SQL> ALTER DATABASE FILENAME mf_personnel
    cont>     ADD STORAGE AREA UNIFORM1 PAGE FORMAT IS UNIFORM;
    SQL> ALTER DATABASE FILENAME mf_personnel
    cont>     ADD STORAGE AREA UNIFORM2 PAGE FORMAT IS UNIFORM;
    SQL> ATTACH 'FILENAME mf_personnel';
    SQL> CREATE UNIQUE INDEX EMP_THRESHOLDS ON EMPLOYEES (EMPLOYEE_ID)
    cont>     TYPE IS SORTED
    cont>     STORE USING (EMPLOYEE_ID)
    cont>         IN RDB$SYSTEM (THRESHOLDS ARE (60,75,90))
    cont>             WITH LIMIT OF ('00200')
    cont>         IN UNIFORM1 (THRESHOLD IS (65))
    cont>             WITH LIMIT OF ('00400')
    cont>         OTHERWISE IN UNIFORM2
    cont>             (THRESHOLD OF (90));
    %RDB-W-META_WARN, metadata successfully updated with the reported warning
    -RDMS-W-IDXCOLEXIST, an index with this column list already exists
    SQL> --
    SQL> SHOW INDEX EMP_THRESHOLDS
    Indexes on table EMPLOYEES:
    EMP_THRESHOLDS                  with column EMPLOYEE_ID
      No Duplicates allowed
      Type is Sorted
      Key suffix compression is DISABLED
      Node size  430
     Store clause:  STORE USING (EMPLOYEE_ID)
            IN RDB$SYSTEM (THRESHOLDS ARE (60,75,90))
                WITH LIMIT OF ('00200')
            IN UNIFORM1 (THRESHOLD IS (65))
                WITH LIMIT OF ('00400')
            OTHERWISE IN UNIFORM2
                (THRESHOLD OF (90))

    This statement uses the STORE clause to partition the index into
    different uniform page format storage areas and apply thresholds.

    In Examples 7 and 8, the table COLOURS in the database MIA_CHAR_
    SET is defined as:

    SQL> CREATE TABLE COLOURS
    cont>     (ENGLISH            MCS_DOM,
    cont>      FRENCH             MCS_DOM,
    cont>      JAPANESE           KANJI_DOM,
    cont>      ROMAJI             DEC_KANJI_DOM,
    cont>      KATAKANA           KATAKANA_DOM,
    cont>      HINDI              HINDI_DOM,
    cont>      GREEK              GREEK_DOM,
    cont>      ARABIC             ARABIC_DOM,
    cont>      RUSSIAN            RUSSIAN_DOM);

    Example 7: Creating a simple table index using the octets
    character length, which is the default

    SQL> SET CHARACTER LENGTH 'OCTETS';
    SQL> CREATE INDEX COLOUR_INDEX ON COLOURS (JAPANESE SIZE IS 4)
    cont> TYPE IS SORTED;
    SQL> SHOW INDEX COLOUR_INDEX;
    Indexes on table COLOURS:
    COLOUR_INDEX                    with column JAPANESE
                                    size of index key is 4 octets
      Duplicates are allowed
      Type is Sorted

    The previous statement creates a compressed index key of 4
    octets.

    Example 8: Creating an index using the CHARACTERS character
    length

    SQL> SET CHARACTER LENGTH 'CHARACTERS';
    SQL> CREATE INDEX COLOUR_INDEX_2 ON COLOURS (JAPANESE SIZE IS 4)
    cont> TYPE IS SORTED;
    SQL> SHOW INDEX COLOUR_INDEX_2;
    Indexes on table COLOURS:
    COLOUR_INDEX_2                  with column JAPANESE
                                    size of index key is 4 characters
      Duplicates are allowed
      Type is Sorted

    The previous statement creates a compressed index key of 4
    characters.

    Example 9: Creating an index that enables compression

    The following example shows how to create an index and enable
    compression with a minimum run length of 2:

    SQL> CREATE INDEX EMP_NDX ON EMPLOYEES
    cont> (EMPLOYEE_ID SIZE IS 4)
    cont>  ENABLE COMPRESSION (MINIMUM RUN LENGTH 2);
    SQL> SHOW INDEX EMP_NDX;
    Indexes on table EMPLOYEES:
    EMP_NDX                         with column EMPLOYEE_ID
                                    size of index key is 4
      Duplicates are allowed
      Type is Sorted
      Compression is ENABLED  (Minimum run length  2)

    Example 10: Using the Index Attributes Clause

    SQL> CREATE UNIQUE INDEX JOB_JOB_CODE
    cont> ON JOBS (
    cont> JOB_CODE
    cont> ASC)
    cont> TYPE IS SORTED
    cont> THRESHOLDS ARE (75,83,90)
    cont> ENABLE COMPRESSION
    cont> NOLOGGING
    cont> COMMENT IS 'Used for translation of job codes';
    %RDB-W-META_WARN, metadata successfully updated with the reported warning
    -RDMS-W-DATACMIT, unjournaled changes made; database may not be recoverable
    SQL> -- SQL returned this message because the NOLOGGING attribute
    SQL> -- was set.

    Example 11: Creating an Index and Displaying the Default Node
    Size

    SQL> -- Create a simple table upon which to define
    SQL> -- some indexes
    SQL>
    SQL> CREATE TABLE TEST_INDEX_TABLE
    cont>    (A CHAR(70),
    cont>     B INTEGER);
    SQL>
    SQL> -- Default value is 430 bytes
    SQL>
    SQL> CREATE UNIQUE INDEX TEST_INDEX_DEF
    cont>    ON TEST_INDEX_TABLE (A, B)
    cont>    TYPE IS SORTED
    cont>    USAGE UPDATE;
    SQL>
    SQL> SHOW TABLE (INDEX) TEST_INDEX_TABLE
    Information for table TEST_INDEX_TABLE
    TEST_INDEX_DEF                  with column A
                                    and column B
      No Duplicates allowed
      Type is Sorted
      Compression is DISABLED
      Node size  430
      Percent fill  70

    Example 12: Naming Partitions

    SQL> -- Alter mf_personnel database to add three slots
    SQL> -- for storage areas and then add three storage areas.
    SQL> ALTER DATABASE FILENAME MF_PERSONNEL
    cont> RESERVE 3 STORAGE AREAS;
    %RDMS-W-DOFULLBCK, full database backup should be done to ensure future recovery
    SQL> ALTER DATABASE FILENAME MF_PERSONNEL
    cont> ADD STORAGE AREA WAGE_LOW;
    SQL> ALTER DATABASE FILENAME MF_PERSONNEL
    cont> ADD STORAGE AREA WAGE_MID;
    SQL> ALTER DATABASE FILENAME MF_PERSONNEL
    cont> ADD STORAGE AREA WAGE_HIGH;
    SQL> ATTACH 'FILENAME MF_PERSONNEL.RDB';
    SQL> -- Create an index on the JOBS table and name the partitions
    SQL> CREATE INDEX WAGE_CLASS_IDX ON JOBS (WAGE_CLASS)
    cont> TYPE IS SORTED
    cont> STORE USING (WAGE_CLASS)
    cont> IN WAGE_LOW (PARTITION WAGE_LOW) WITH LIMIT OF ('1')
    cont> IN WAGE_MID (PARTITION WAGE_MID) WITH LIMIT OF ('3')
    cont> OTHERWISE IN WAGE_HIGH (PARTITION WAGE_HIGH);

    Example 13: Creating a Large Index Partitioned Across Many
    Storage Areas

    First, create the database definition:

    SQL> CREATE INDEX ... MAINTENANCE IS ENABLED DEFERRED ...;

    Next submit batch jobs to build each partition in parallel. For
    example, each batch job would execute a script similar to the
    following:

    ATTACH 'filename testdatabase';
    SET FLAGS 'index_stats';
    ALTER INDEX TRANSACTIONS_INDEX BUILD PARTITION PART_1;
    COMMIT;

    Finally, after the batch jobs have completed, the database
    administrator must make the index active for query usage by
    changing the maintenance mode to ENABLED IMMEDIATE. A BUILD
    ALL PARTITIONS clause could be added in case any step failed
    (possibly due to resource limitations or a failed node).

    SQL> SET FLAGS 'index_stats';
    SQL> SET TRANSLATION READ WRITE RESERVING...FOR EXCLUSIVE WRITES;
    SQL> ALTER INDEX ... BUILD ALL PARTITIONS;
    SQL> ALTER INDEX ... MAINTENANCE IS ENABLED IMMEDIATE;
    SQL> COMMIT;

    This scheme has several advantages over issuing a CREATE INDEX
    statement directly:

    o  The build actions can be run in parallel, which allows
       better resource usage (read and sort fewer rows), and reduced
       execution time for the index creation.

    o  The partitions being processed are relatively small when
       compared to the full index and, therefore, smaller quantities
       of data will be processed. This will result in smaller .ruj
       files and less AIJ file space for these transactions.

    o  Each build partition runs in a separate transaction, can
       easily be repeated if a step fails, and does not require
       repeating the entire CREATE INDEX statement.

    o  If any steps have failed, they will also be repeated by the
       BUILD ALL PARTITIONS clause included in the script.

8  –  MODULE

    Defines a module as an object in an Oracle Rdb database. Stored
    with the module are its functions and procedures. A function or
    procedure written in SQL that resides with the data in a database
    is called a stored function or stored procedure. Likewise, a
    module stored in a database is called a stored module. A stored
    routine refers to either a stored procedure or stored function.

    You invoke a stored procedure with the CALL statement from a
    simple statement procedure in embedded SQL, SQL module language,
    or interactive SQL or with the CALL statement from within a
    compound statement.

    You invoke a stored function by specifying the function name in a
    value expression.

    SQL uses the concept of a module as its mechanism for storing,
    showing, deleting, and granting and revoking privileges on stored
    routines within a database. This means you cannot store, delete,
    or grant and revoke privileges on individual stored routines.
    Should you need to remove a stored routine, use the DROP FUNCTION
    routine-name CASCADE or DROP PROCEDURE routine-name CASCADE
    syntax.

    In general, SQL operates on modules, not stored routines.
    However, there are a few exceptions: DROP FUNCTION, DROP
    PROCEDURE, RENAME, SHOW FUNCTION, SHOW PROCEDURE, and CALL. The
    SHOW FUNCTION statement displays information about functions.
    The SHOW PROCEDURE statement displays individual procedures in a
    stored module. The CALL statement can invoke only a single stored
    procedure.

8.1  –  Environment

    You can use the CREATE MODULE statement in a simple statement
    procedure:

    o  In interactive SQL

    o  Embedded in host language programs to be precompiled

    o  As part of a procedure in an SQL module

    o  In dynamic SQL as a statement to be dynamically executed

8.2  –  Format

  CREATE MODULE -> <module-name> +---------------------------------+-+
                                 +-> STORED NAME IS <stored-name> -+ |
  +------------------------------------<-----------------------------+
  +-+-------------------+---+----------------------------+-----------+
    +-> LANGUAGE SQL ---+   +-> AUTHORIZATION <auth-id> -+           |
  +------------------------------------------------------------------+
  ++---------------------------------+-+--------------------+--------+
   +-> COMMENT IS -+-> 'string' ---+-+ +-> declare-clause --+        |
                   +------ / <-----+                                 |
  +------------------------------------------------------------------+
  +-+-> routine-clause ---+--> END MODULE --->
    +-------- <-----------+

  declare-clause =

  --+-+-> declare-transaction-statement -----------+-+-->
    | +-> declare-local-temporary-table-statement -+ |
    | +-> declare-variable-statement --------------+ |
    +----------------------<-------------------------+

  routine-clause =

  -+> PROCEDURE <procedure-name> +-+-------------------> -----------++
   +> FUNCTION <function-name> --+ +> STORED NAME IS <stored-name> -+|
  +----------------------------------------- <-----------------------+
  +---+--------------------> ---------------------+---+
      +--> ( -+----------------------------+-- ) -+   |
              ++-> parameter-decl --------++          |
               +----------- , <-----------+           |
  +---------------------------------------------------+
  ++----------------------------++----------------------+---------+
   +> RETURNS result-data-type -++---> function-attr ---+         |
  +------------------------------------------ <-------------------+
  ++--------------------------------+-> ; -+-> compound-statement -----+> ; -->
   +> routine-attr -----------------+      +-> compound-use-statement -+
                                           +-> external-body-clause ---+

  parameter-decl =

  --+----------++---------------------++-> data-type -----+---+
    +-> IN ----++-> <parameter-name> -++-> <domain-name> -+   |
    +-> OUT ---+                                              |
    +-> INOUT -+                                              |
    +------------------------------<--------------------------+
    +-+---------------------+-+-----------------------+-------+
      +-> mechanism-clause -+ +-> DEFAULT value-expr -+       |
    +---------------------------------------------------------+
    +--+--------------------------------+------------------------->
       +-> COMMENT IS -+-> 'string' ---++
                       +------ / <-----+

  function-attr =

  -++--------+-+-> VARIANT -------++->
   |+-> NOT -+ +-> DETERMINISTIC -+|
   +--> LANGUAGE SQL --------------+

  routine-attr =

  --+-> COMMENT IS --+-> 'string' --+-+-->
    |                +------ , <----+ |
    +-> USAGE IS -+-> LOCAL ---+------+
                  +-> GLOBAL --+

8.3  –  Arguments

8.3.1  –  AUTHORIZATION auth id

    A name that identifies the definer of a module and is used to
    perform privilege validation for the module. the User_Supplied_
    Names HELP topic for information about using authorization
    identifiers.

8.3.2  –  COMMENT_IS

    Adds a comment about the module, routine, and parameter. SQL
    displays the text of the comment when it executes a SHOW MODULE,
    SHOW FUNCTION, or SHOW PROCEDURE statement. Enclose the comment
    in single quotation marks (')  and separate multiple lines in a
    comment with a slash mark (/).

8.3.3  –  compound-statement

    Allows you to include more than one SQL statement in a stored
    routine. See the Compound_Statement HELP topic for more
    information.

8.3.4  –  compound-use-statement

    Allows you to include one SQL statement in a stored routine. See
    the Compound_Statement HELP topic for more information.

    If you are defining a stored function, the simple statement must
    be the RETURNS clause.

8.3.5  –  data-type

    A valid SQL data type. Specifying an explicit data type is an
    alternative to specifying a domain name. See the Data_Types HELP
    topic for more information on data types.

8.3.6  –  decl-local-temp-table-statement

    Declares a local temporary table for the module. See the DECLARE
    LOCAL_TEMPORARY_TABLE statement for more information.

8.3.7  –  declare-transaction-statement

    Declares a transaction for the module. Only one declare-
    transaction-statement is permitted for each module. If omitted,
    an implicit DECLARE TRANSACTION READ WRITE is used. See the
    DECLARE TRANSACTION statement for more information.

8.3.8  –  declare-variable-statement

    Declares a global variable for the module. See the statement
    DECLARE Variable for more information.

8.3.9  –  DEFAULT value-expr

    Specifies the default value of a parameter for a function or
    procedure defined with mode IN. If you omit this parameter or if
    the Call statement argument list or function invocation specifies
    the DEFAULT keyword, then the value-expr specified with this
    clause is used. The parameter uses NULL as the default if you do
    not specify a value expression explicitly.

8.3.10  –  DETERMINISTIC

    Syntax options:

    DETERMINISTIC | NOT DETERMINISTIC

    The clause controls the evaluation of an external function in the
    scope of a query:

    o  NOT DETERMINISTIC

       Specifying the NOT DETERMINISTIC clause forces evaluation
       of corresponding functions (in scope of a single query)
       every time the function appears. If a function can return a
       different result each time it is invoked, you should use the
       DETERMINISTIC clause.

    o  DETERMINISTIC

       Specifying the DETERMINISTIC clause can result in a single
       evaluation of corresponding function expressions (in scope
       of a single query), and the resulting value is used in all
       occurrences of the corresponding function expression. When you
       use the DETERMINISTIC clause, Oracle Rdb evaluates whether or
       not to invoke the function each time it is used.

       For example:

       SELECT * FROM T1 WHERE F1() > 0 AND F1() < 20;

       If you define the F1 function as DETERMINISTIC, the function
       F1() may be evaluated just once depending on the optimizer. If
       you define the F1 function as NOT DETERMINISTIC, the function
       F1() is evaluated twice.

       DETERMINISTIC is the default.

    The DETERMINISTIC or NOT DETERMINISTIC clause is not allowed on
    procedure definitions.

8.3.11  –  domain-name

    The name of a domain created in a CREATE DOMAIN statement. For
    more information about domains, see the CREATE DOMAIN statement.

8.3.12  –  DEFAULT value-expr

    Specifies the default value of a parameter for a function or
    procedure defined with mode IN. If you omit this parameter or if
    the Call statement argument list or function invocation specifies
    the DEFAULT keyword, then the value-expr specified with this
    clause is used. The parameter uses NULL as the default if you do
    not specify a value expression explicitly.

8.3.13  –  FUNCTION function-name

    A user-supplied name that you give to a function in a module. The
    name you specify must be unique within the database definition.

8.3.14  –  IN parameter name

    Specifies the parameter modes used in the procedure. The IN
    parameter names the parameter that is read into the routine,
    however is never set and cannot be written to.

    The IN parameter is the only mode allowed for functions.

    Each parameter name must be unique within the routine.

8.3.15  –  INOUT parameter name

    Specifies the parameter modes used in the procedure. The INOUT
    parameter names a parameter that inputs data (is read) as well as
    receives data (is set). The INOUT parameter is a parameter that
    is modified.

    Each parameter name must be unique within the procedure.

    You cannot use the INOUT parameter mode for stored functions.

8.3.16  –  LANGUAGE_SQL

    The LANGUAGE keyword and the SQL argument signify that the
    procedures in a module are to be invoked by SQL statements, not a
    host language program.

    With unstored procedures, the LANGUAGE keyword specifies the name
    of a host language; this identifies the host language in which
    the program calling a module's procedures is written.

    Beginning with Oracle Rdb Release 7.1, this clause is optional.

8.3.17  –  module-name

    A user-supplied name that you assign to a module.

    See the User_Supplied_Names HELP topic for more information on
    user-supplied names.

8.3.18  –  OUT parameter name

    Specifies the parameter modes used in the procedure. The OUT
    parameter names the parameter into which data is being sent. The
    OUT parameter is set, but never read.

    Each parameter name must be unique within the procedure.

    You cannot use the OUT parameter mode for stored functions.

8.3.19  –  parameter-decl

    Specifies the parameters and parameter modes used in a stored or
    external routine.

8.3.20  –  PROCEDURE procedure-name

    A user-supplied name that you give to a procedure in a module.
    The name you specify must be unique within the database
    definition.

8.3.21  –  RETURNS result data type

    Specifies the data type or domain of the result of the function
    invocation. This clause is only valid when defining a function.
    You can only use the RETURNS clause when defining a function.

8.3.22  –  routine-clause

    The definition of a stored function or stored procedure created
    in a module.

8.3.23  –  STORED_NAME_IS

    Specifies a name that Oracle Rdb uses to access a module
    procedure or function created in a multischema database. Or
    specifies a name that Oracle Rdb uses to access a procedure or
    a function created in a stored module.

8.3.24  –  USAGE_IS

    Specifies how the function or procedure can be called:

    o  USAGE IS GLOBAL indicates that the function or procedure can
       be called outside the current module. This is the default.

    o  USAGE IS LOCAL specifies that the routine is restricted to
       references within the module. This clause is provided for
       compatibility with CREATE MODULE but is not allowed for CREATE
       FUNCTION or CREATE PROCEDURE.

8.3.25  –  VARIANT

    Syntax options:

    VARIANT | NOT VARIANT

    These clauses are synonyms for the DETERMINISTIC and NOT
    DETERMINISTIC clauses. The DETERMINISTIC clause indicates that
    the same inputs to the function will generate the same output.
    It is the same as the NOT VARIANT clause. The NOT DETERMINISTIC
    clause indicates that the output of the function does not depend
    on the inputs. It is the same as the VARIANT clause.

    This clause is deprecated. Use DETERMINISTIC instead.

8.3.26  –  variant-clause

    Syntax options:

    DETERMINISTIC | NOT DETERMINISTIC

    The clause controls the evaluation of an external function in the
    scope of a query:

    o  NOT DETERMINISTIC

       Specifying the NOT DETERMINISTIC clause forces evaluation
       of corresponding functions (in scope of a single query)
       every time the function appears. If a function can return a
       different result each time it is invoked, you should use the
       DETERMINISTIC clause.

    o  DETERMINISTIC

       Specifying the DETERMINISTIC clause can result in a single
       evaluation of corresponding function expressions (in scope
       of a single query), and the resulting value is used in all
       occurrences of the corresponding function expression. When you
       use the DETERMINISTIC clause, Oracle Rdb evaluates whether or
       not to invoke the function each time it is used.

       For example:

       SELECT * FROM T1 WHERE F1() > 0 AND F1() < 20;

       If you define the F1 function as DETERMINISTIC, the function
       F1() may be evaluated just once depending on the optimizer. If
       you define the F1 function as NOT DETERMINISTIC, the function
       F1() is evaluated twice.

       DETERMINISTIC is the default.

    The DETERMINISTIC or NOT DETERMINISTIC clause is not allowed on
    procedure definitions.

8.4  –  Examples

    Example 1: Creating a stored module and stored procedure

    The following example shows how to create a stored module and
    stored procedure using interactive SQL:

    SQL> CREATE MODULE testmod LANGUAGE SQL
    cont> PROCEDURE testproc;
    cont> COMMIT;
    cont> END MODULE;
    SQL> SHOW MODULE testmod
     Module name is: TESTMOD
     Source:
     TESTMOD LANGUAGE SQL
     Owner is:
     Module ID is: 1

    Example 2: Creating a stored module with SQL module language

    The following code fragment shows how to create a stored module
    as part of a procedure in a nonstored module:

    PROCEDURE create_them
        SQLCODE;
        CREATE MODULE my LANGUAGE SQL AUTHORIZATION smith

        PROCEDURE p1 ( :x CHAR(5) );
            BEGIN
            INSERT INTO s (snum) VALUES (:x);
            END;
        PROCEDURE p2 ( :y SMALLINT );
            BEGIN
            SELECT STATUS INTO :y FROM s LIMIT TO 1 ROW;
            END;
        PROCEDURE p3 (:x INT, :y SMALLINT );
            BEGIN
            INSERT INTO s (snum) VALUES (:x);
            SELECT STATUS INTO :y FROM s WHERE snum = :x;
            END;
        PROCEDURE p4 (:x CHAR(5), :y CHAR(20) );
            BEGIN
            INSERT INTO s (snum,sname) VALUES (:x, :y);
            SELECT sname INTO :y FROM s WHERE snum = :x;
            END;
        END MODULE;

    Example 3: Creating a stored module containing a stored routines

    SQL> CREATE MODULE utility_functions
    cont>   LANGUAGE SQL
    cont> --
    cont> -- Define a stored procedure.
    cont> --
    cont>   PROCEDURE trace_date (:dt DATE);
    cont>      BEGIN
    cont>         TRACE :dt;
    cont>      END;
    cont> --
    cont>   FUNCTION mdy (IN :dt DATE) RETURNS CHAR(10)
    cont>   COMMENT 'Returns the date in month/day/year format';
    cont>      BEGIN
    cont>         IF :dt IS NULL THEN
    cont>            RETURN '**/**/****';
    cont>         ELSE
    cont>            CALL trace_date (:dt);
    cont>            RETURN CAST(EXTRACT(MONTH FROM :dt) AS VARCHAR(2)) || '/' ||
    cont>                   CAST(EXTRACT(DAY FROM :dt) AS VARCHAR(2)) || '/' ||
    cont>                   CAST(EXTRACT(YEAR FROM :dt) AS VARCHAR(4));
    cont>         END IF;
    cont>      END;
    cont> END MODULE;

    Example 4: Using a stored function in a SELECT statement

    SQL> SELECT mdy(job_end), job_end
    cont>   FROM job_history WHERE employee_id = '00164';
                 JOB_END
    **/**/****   NULL
    9/20/1981    20-Sep-1981
    2 rows selected

    Example 5: Using declared local temporary tables in stored
    procedures

    SQL> -- The following table must exist in order to execute the following
    SQL> -- queries.
    SQL> --
    SQL> CREATE TABLE payroll
    cont> (employee_id CHAR(5),
    cont> hours_worked INTEGER,
    cont> hourly_sal REAL,
    cont> week_date CHAR(10));
    SQL> COMMIT;
    SQL> --
    SQL> -- Create the module containing a declared local temporary table.
    SQL> --
    SQL> CREATE MODULE paycheck_decl_mod
    cont>   LANGUAGE SQL
    cont>   DECLARE LOCAL TEMPORARY TABLE module.paycheck_decl_tab
    cont>          (employee_id ID_DOM,
    cont>           last_name CHAR(14) ,
    cont>           hours_worked INTEGER,
    cont>           hourly_sal INTEGER(2),
    cont>           weekly_pay   INTEGER(2))
    cont>           ON COMMIT PRESERVE ROWS
    cont> --
    cont> -- Create the procedure to insert rows.
    cont> --
    cont>   PROCEDURE paycheck_ins_decl;
    cont>   BEGIN
    cont>     INSERT INTO module.paycheck_decl_tab
    cont>          (employee_id, last_name, hours_worked, hourly_sal, weekly_pay)
    cont>           SELECT p.employee_id, e.last_name,
    cont>                     p.hours_worked, p.hourly_sal,
    cont>                     p.hours_worked * p.hourly_sal
    cont>                  FROM employees e, payroll p
    cont>                  WHERE e.employee_id = p.employee_id
    cont>                  AND p.week_date = '1995-08-01';
    cont>   END;
    cont> --
    cont> -- Create the procedure to count the low hours.
    cont> --
    cont>   PROCEDURE low_hours_decl (:cnt INTEGER);
    cont>   BEGIN
    cont>     SELECT COUNT(*) INTO :cnt FROM module.paycheck_decl_tab
    cont>            WHERE hours_worked < 40;
    cont>   END;
    cont> END MODULE;
    SQL> --
    SQL> -- Call the procedure to insert the rows.
    SQL> --
    SQL> CALL paycheck_ins_decl();
    SQL> --
    SQL> -- Declare a variable and call the procedure to count records with
    SQL> -- low hours.
    SQL> --
    SQL> DECLARE :low_hr_cnt integer;
    SQL> CALL low_hours_decl(:low_hr_cnt);
      LOW_HR_CNT
               2

    SQL> --
    SQL> -- Because the table is a declared local temporary table, you cannot
    SQL> -- access it from outside the stored module that contains it.
    SQL> --
    SQL> SELECT * FROM module.paycheck_decl_tab;
    %SQL-F-RELNOTDCL, Table PAYCHECK_DECL_TAB has not been declared in module or
    environment

    Example 6: Creating a stored procedure containing a simple
    statement

    SQL> CREATE MODULE a
    cont> LANGUAGE SQL
    cont> PROCEDURE new_salary_proc
    cont> (:id CHAR (5),
    cont> :new_salary INTEGER (2));
    cont> UPDATE salary_history
    cont>              SET salary_end = CURRENT_TIMESTAMP
    cont>                  WHERE employee_id = :id;
    cont> END MODULE;

    Example 7: Declaring a Global Variable to Exchange Information
    Between Two Routines

    SQL> CREATE MODULE sample
    cont>  LANGUAGE SQL
    cont>  DECLARE :iter_count INTEGER
    cont>  PROCEDURE set_iter (IN :val INTEGER)
    cont>  COMMENT IS 'Validate the iteration count and assign'
    cont>  /          'to a global variable.';
    cont>  BEGIN
    cont>  IF (:val IS NULL) OR (:val < 1) THEN
    cont>     SIGNAL 'XXXXX'; --illegal value
    cont>  ELSE
    cont>     SET :iter_count  =:val;
    cont>     TRACE 'Iteration count set to ', :val;
    cont>  END IF;
    cont>  END;
    cont> FUNCTION GET_ITER ()
    cont> RETURNS INTEGER
    cont> COMMENT IS 'Trace the value used and then return the'
    cont> / 'value from the global variable.';
    cont> BEGIN
    cont> TRACE 'Using iteration count ', :iter_count;
    cont> RETURN :iter_count;
    cont> END;
    cont> END MODULE;

    Example 8: Using a cursor implemented by external routines

    This example uses multiple external routines to manage a table
    cursor in the external routine database environment. This
    management includes the OPEN, FETCH and CLOSE of a single cursor.

    Several domains are defined so that parameter data types can be
    consistently defined in the database that contain the application
    and also the database upon which the cursor is open.

    create domain SQLSTATE_T char(5);
    create domain STATUS_CODE char(1);
    create domain STATUS_NAME char(8);
    create domain STATUS_TYPE char(14);

    The external function interface is contained within a single
    CREATE MODULE statement. This module also contains the
    application in a single stored SQL procedure.

    create module EX
        language SQL

        -- These procedure define the interface to the external
        -- routines that implement the transaction and cursor operations
        --
        procedure EX_START_READ_TXN
            (inout :ss sqlstate_t);
            external location 'TEST$SCRATCH:EX.EXE'
            language general
            general parameter style
            comment is 'start a READ ONLY transaction';

        procedure EX_COMMIT
            (inout :ss sqlstate_t);
            external location 'TEST$SCRATCH:EX.EXE'
            language general
            general parameter style;

        procedure EX_OPEN_CURSOR
            (inout :ss sqlstate_t);
            external location 'TEST$SCRATCH:EX.EXE'
            language general
            general parameter style
            comment is 'find all rows in WORK_STATUS order by STATUS_CODE';

        procedure EX_CLOSE_CURSOR
            (inout :ss sqlstate_t);
            external location 'TEST$SCRATCH:EX.EXE'
            language general
            general parameter style;

        procedure EX_FETCH_CURSOR
            (inout :ss sqlstate_t,
             out :s_code STATUS_CODE, out :s_code_ind integer,
             out :s_name STATUS_NAME, out :s_name_ind integer,
             out :s_type STATUS_TYPE, out :s_type_ind integer);
            external location 'TEST$SCRATCH:EX.EXE'
            language general
            general parameter style;

        -- This SQL procedures implements a simple application
        --
        procedure WORK_STATUS
            comment is  'Use an external cursor to fetch all rows in the'
            /           'WORK_STATUS table';
            begin
            declare :s_code STATUS_CODE;
            declare :s_name STATUS_NAME;
            declare :s_type STATUS_TYPE;
            declare :s_code_ind, :s_name_ind, :s_type_ind integer;
            declare :ss sqlstate_t;

            -- start a read-only transaction on the PERSONNEL database
            call EX_START_READ_TXN (:ss);
            if :ss ^= '00000' then
                SIGNAL :ss;
            end if;

            -- open the cursor on the work-status table
            call EX_OPEN_CURSOR (:ss);
            if :ss ^= '00000' then
                SIGNAL :ss;
            end if;

            -- now loop and fetch all the rows
            FETCH_LOOP:
            loop
                call EX_FETCH_CURSOR (:ss,
                                       :s_code, :s_code_ind,
                                       :s_name, :s_name_ind,
                                       :s_type, :s_type_ind);
                case :ss
                    when '02000' then
                        -- no more rows to fetch
                        leave FETCH_LOOP;

                    when '00000' then
                        begin
                        -- we have successfully fetched a row, so display it
                        trace 'Status Code: ', case when :s_code_ind < 0
                                                    then 'NULL'
                                                    else :s_code
                                               end;
                        trace 'Status Name: ', case when :s_name_ind < 0
                                                    then 'NULL'
                                                    else :s_name
                                               end;
                        trace 'Status Type: ', case when :s_type_ind < 0
                                                    then 'NULL'
                                                    else :s_type
                                               end;
                        trace '***';
                        end;
                    else
                        -- signal will implicitly leave the stored procedure
                        SIGNAL :ss;
                end case;
            end loop;

            -- close the cursor
            call EX_CLOSE_CURSOR (:ss);
            if :ss ^= '00000' then
                SIGNAL :ss;
            end if;

            -- commit the transaction
            call EX_COMMIT (:ss);
            if :ss ^= '00000' then
                SIGNAL :ss;
            end if;
            end;

    end module;

    The external procedures for this this example are written using
    the SQL module language. However, any language with embedded SQL,
    such as C, could have been used.

    module EX
    language GENERAL
    parameter colons
    -- EX: Sample application
    -- Process the WORK_STATUS table using a table cursor
    --
    declare alias filename 'PERSONNEL'

    declare c cursor for
        select status_code, status_name, status_type
         from WORK_STATUS
         order by status_code

    procedure EX_START_READ_TXN
        (sqlstate);
        begin
        -- abort any stray transactions
        rollback;
        -- start a READ ONLY transaction
        set transaction read only;
        end;

    procedure EX_COMMIT
        (sqlstate);
        commit work;

    procedure EX_ROLLBACK
        (sqlstate);
        rollback work;

    procedure EX_OPEN_CURSOR
        (sqlstate);
        open c;

    procedure EX_CLOSE_CURSOR
        (sqlstate);
        close c;

    procedure EX_FETCH_CURSOR
        (sqlstate,
         :s_code            STATUS_CODE,
         :s_code_ind        integer,
         :s_name            STATUS_NAME,
         :s_name_ind        integer,
         :s_type            STATUS_TYPE,
         :s_type_ind        integer);
        fetch c
         into :s_code indicator :s_code_ind,
              :s_name indicator :s_name_ind,
              :s_type indicator :s_type_ind;

    procedure EX_DISCONNECT
        (sqlstate);
        disconnect default;

    When run the application calls the external procedures to open
    the cursor and fetch the rows and display them using the TRACE
    statement.

    SQL> set flags 'trace';
    SQL>
    SQL> call WORK_STATUS ();
    ~Xt: Status Code: 0
    ~Xt: Status Name: INACTIVE
    ~Xt: Status Type: RECORD EXPIRED
    ~Xt: ***
    ~Xt: Status Code: 1
    ~Xt: Status Name: ACTIVE
    ~Xt: Status Type: FULL TIME
    ~Xt: ***
    ~Xt: Status Code: 2
    ~Xt: Status Name: ACTIVE
    ~Xt: Status Type: PART TIME
    ~Xt: ***
    SQL>

    Oracle recommends that the cursors be closed, and the external
    routines database environment be disconnected before the calling
    session is disconnected. This can be achieved by using NOTIFY
    routines.

    For example, the external procedure that starts the transaction
    could be modified as shown below to declare a NOTIFY routine (EX_
    RUNDOWN) that when called would close the cursors, rollback the
    transaction and disconnect from the database.

        procedure EX_START_READ_TXN
            (inout :ss sqlstate_t);
            external location 'TEST$SCRATCH:EX.EXE'
            language general
            general parameter style
            notify EX_RUNDOWN on BIND
            comment is 'start a READ ONLY transaction';

    The BIND notification ensures that EX_RUNDOWN will be called
    during the DISCONNECT of the caller and allow the transaction to
    be rolled back and the session disconnected. ROLLBACK or COMMIT
    will implicitly close any open cursors, unless the cursor were
    defined as WITH HOLD. In this case it is important to also close
    that cursor. Code similar to the following (in C) could implement
    this rundown routine.

    #include <string.h>
    #include <stdio.h>
    #define RDB$K_RTX_NOTIFY_ACTV_END 2
    #define SQLSTATE_LEN 5
    void sql_signal ();
    void EX_CLOSE_CURSOR (char sqlstate [SQLSTATE_LEN]);
    void EX_DISCONNECT (char sqlstate [SQLSTATE_LEN]);
    void EX_ROLLBACK (char sqlstate [SQLSTATE_LEN]);

    extern void EX_RUNDOWN
        (int *func_code,
         int *u1,                   /* U1, U2, U3 are currently unused */
         int *u2,                   /* and are reserved for future use */
         int *u3)
    {
    char sqlstate [SQLSTATE_LEN];

        if (*func_code == RDB$K_RTX_NOTIFY_ACTV_END)
        {
            /* we are running down this external routine, so
             * close the cursor
             */
            EX_CLOSE_CURSOR (sqlstate);
            if (memcmp ("00000", sqlstate, SQLSTATE_LEN) != 0
                && memcmp ("24000", sqlstate, SQLSTATE_LEN) != 0)
                /* we expect success or maybe 24000 (bad cursor state)
                 */
                sql_signal ();

            /* rollback the transaction
             */
            EX_ROLLBACK (sqlstate);
            if (memcmp ("00000", sqlstate, SQLSTATE_LEN) != 0
                && memcmp ("25000", sqlstate, SQLSTATE_LEN) != 0)
                /* we expect success or maybe 25000 (bad transaction state)
                 */
                sql_signal ();

            /* disconnect from the database
             */
            EX_DISCONNECT (sqlstate);
            if (memcmp ("00000", sqlstate, SQLSTATE_LEN) != 0)
                /* we expect success or maybe 25000 (bad transaction state)
                 */
                sql_signal ();
        }
    }

    The application can be compiled and built using this fragment of
    DCL code:

    $       create ex.opt
    symbol_vector = (EX_START_READ_TXN = procedure)
    symbol_vector = (EX_COMMIT = procedure)
    symbol_vector = (EX_ROLLBACK = procedure)
    symbol_vector = (EX_OPEN_CURSOR = procedure)
    symbol_vector = (EX_CLOSE_CURSOR = procedure)
    symbol_vector = (EX_FETCH_CURSOR = procedure)
    symbol_vector = (EX_DISCONNECT = procedure)
    symbol_vector = (EX_RUNDOWN = procedure)
    psect_attr = RDB$MESSAGE_VECTOR,noshr
    psect_attr = RDB$DBHANDLE,noshr
    psect_attr = RDB$TRANSACTION_HANDLE,noshr
    sql$user/library
    $
    $       cc EX_RUNDOWN
    $       sql$mod EX
    $       link/share EX,EX_RUNDOWN,EX/option

9  –  OUTLINE

    Creates a new query outline and stores this outline in the
    database.

    A query outline is an overall plan for how a query can be
    implemented and may contain directives that control the join
    order, join methods, index usage (or all of these) the optimizer
    selects when processing a query. Use of query outlines helps
    ensure that query performance is highly stable across releases of
    Oracle Rdb.

9.1  –  Environment

    You can use the CREATE OUTLINE statement only in interactive SQL.

9.2  –  Format

  CREATE OUTLINE <outline-name> -+--------------------------------++
                                 +> STORED NAME IS <stored-name> -+|
  +------------------------- <-------------------------------------+
  ++-> FROM --> ( --> <sql-query> --> ) ----------+---------+
   +-> on-clause ---------------------------------+         |
   +-> ID 'id-number' ----------------------------+         |
    +------------------------------ <-----------------------+
    +-----+------------++--------------------------------+--+
          +> MODE mode ++> AS ---+>( -> query-list -> )--+  |
                        +> USING +                          |
  +--------------------------- <----------------------------+
  ++-----------------------------+--------------------------+
   +> COMPLIANCE -+-> MANDATORY -+                          |
                  +-> OPTIONAL --+                          |
  +--------------------------- <----------------------------+
  ++-------------------------------------------------------++
   +> EXECUTION OPTIONS --> ( --> execution-options --> ) -+|
  +--------------------------- <----------------------------+
  ++--------------------------------+----------------------------->
   +> COMMENT IS --+-> 'string' ---++
                   +----- / <------+

  on-clause =

  ---> ON --+-> PROCEDURE -+-+-> ID proc-id ----+-+->
            +-> FUNCTION --+ +-> NAME <name> ---+ |
            +-> COLUMN ------+-----> <name> ------+
            +-> CONSTRAINT --+
            +-> TRIGGER -----+
            +-> VIEW --------+

  query-list =

  ---+-> QUERY (source) ----------+---------->
     +-------------<--------------+

  source =

  -+-+-------------+--+-> table-access --------------+--+-------->
   | +-> FLOATING -+  +-> ORDERED ---+--> (source) --+  |
   |                  +-> UNORDERED -+               |  |
   |                  +-> subquery-list -------------+  |
   | +--------------------------------------------------+
   | +-> JOIN BY -+--> CROSS ------+--- TO -----+--+
   | |            +--> MATCH ------+            |  |
   | |            +--> ANY METHOD -+            |  |
   | +-> UNION WITH ----------------------------+  |
   +------------------------<----------------------+

  table-access =

  ---> <table-name> -+-------------------------+-> context --+
                     +-> MODULE <module-name> -+             |
  +----------------------------------------------------------+
  +-> ACCESS --> PATH ---+------------------------------+--->
                         +--> ANY ----------------------+
                         +--> SEQUENTIAL ---------------+
                         +--> DBKEY --------------------+
                         +--> ROWID --------------------+
                         +--> NO INDEX -----------------+
                         +--> INDEX -+> <index-name> --++
                                     +------ , <-------+

  subquery-list =

  ---+-> SUBQUERY (source) -------+---------->
     +-------------<--------------+

  execution-options =

  -+-> ANY --------+------>
   +-> NONE -------+
   +-> FAST FIRST -+
   +-> TOTAL TIME -+

9.3  –  Arguments

9.3.1  –  ACCESS_PATH

    Syntax options:

       ACCESS PATH ANY
       ACCESS PATH SEQUENTIAL
       ACCESS PATH DBKEY
       ACCESS PATH ROWID
       ACCESS PATH NO INDEX

    See also ACCESS_PATH_INDEX. Specifies the access path to use to
    retrieve data from the underlying database table. The following
    table lists the valid access paths.

    Path           Meaning

    ANY            Indicates that the optimizer may choose the most
                   appropriate method.
    SEQUENTIAL     Indicates that sequential access should be used.
    DBKEY          Indicates the access by database key should be
                   used.
    ROWID          Indicates the access by database key should be
                   used.
    NO INDEX       Indicates that any access path not requiring
                   an index can be used. NOINDEX is accepted as a
                   synonym for NO INDEX.

    There is no default access path. An access path must be specified
    for each database table specified within a query outline
    definition.

9.3.2  –  ACCESS_PATH_INDEX

    Specifies that data should be retrieved using the specified index
    or list of indexes. If more that one index can be used, then
    separate each index name with a comma.

    Any index name specified should indicate an existing index
    associated with the table with which the access method is
    associated.

9.3.3  –  AS query list

    Provides the main definition of an outline.

    This clause is only required when creating an outline using the
    ID id-number clause.

9.3.4  –  COMMENT_IS

    Adds a comment about the outline. SQL displays the text when it
    executes a SHOW OUTLINES statement in interactive SQL. Enclose
    the comment in single quotation marks ( ')  and separate multiple
    lines in a comment with a slash mark (/).

9.3.5  –  COMPLIANCE

    Syntax options:

    COMPLIANCE MANDATORY | COMPLIANCE OPTIONAL

    Specifies the compliance level for this outline.

    MANDATORY indicates that all outline directives such as table
    order and index usage should be followed as specified. If the
    optimizer is unable to follow any outline directive, an exception
    is raised.

    OPTIONAL indicates that all outline directives are optional and
    that if they cannot be followed, no exception should be raised.
    If OPTIONAL is specified, the strategy chosen by the optimizer
    to carry out the underlying request may not match the strategy
    specified within the outline.

    Use MANDATORY when the strategy that the optimizer chooses must
    be followed exactly as specified from version to version of
    Oracle Rdb even if the optimizer finds a more efficient strategy
    in a future version of Oracle Rdb.

    The default is COMPLIANCE OPTIONAL.

9.3.6  –  context

    Specifies the context number for this table. Specify an unsigned
    integer. This number is allocated to the table by the optimizer
    during optimization. Context numbers are unique within queries.

9.3.7  –  EXECUTION_OPTIONS

    Specifies options that the optimizer should take into account
    during optimization. The following table lists the valid options.

    Option         Meaning

    ANY            Indicates that the optimizer can choose any
                   optimization method
    FAST FIRST     Indicates that the optimizer can use FAST FIRST
                   optimization if and when appropriate
    NONE           Indicates that optional optimizations should not
                   be applied
    TOTAL TIME     Indicates that the optimizer can use TOTAL TIME
                   optimization if and when appropriate

    The default is EXECUTION OPTIONS (ANY).

9.3.8  –  FLOATING

    Specifies that the following data source should be considered to
    be floating and that the order of the data source relative to the
    other data sources within the same level is not fixed.

9.3.9  –  FROM sql query

    Enables an outline to be created directly from an SQL statement.

    If the AS clause is not specified, the sql-query is compiled and
    the resulting outline is stored. If the AS clause is specified,
    the sql-query provides an alternate means of specifying the ID.
    If the USING clause is specified, the sql-query is optimized
    using the designated outline as a starting point.

    The only statement accepted as an sql-query in the FROM clause is
    a SELECT statement. Do not end the sql-query with a semicolon.

9.3.10  –  ID id number

    Specifies the internal hash identification number of the request
    to which this outline should be applied. Specify a 32-byte string
    representing a 32-hexadecimal character identification code. The
    internal hash identification code is generated by the optimizer
    whenever query outlines are created by the Oracle Rdb optimizer
    during optimization.

    You can optionally specify the MODE clause. You are required to
    specify the AS clause. You cannot specify the USING clause with
    the ID id-number clause.

9.3.11  –  JOIN_BY

    Syntax options:

       JOIN BY CROSS
       JOIN BY MATCH
       JOIN BY ANY METHOD

 Specifies the method with which two data sources should be joined.
 The following table lists the valid methods.

    Method         Meaning

    CROSS          Indicates that a cross strategy should be used
    MATCH          Indicates that a match strategy should be used
    ANY METHOD     Indicates that the optimizer can choose any method
                   to join the two data sources

                                   NOTE

       The match join strategy requires that an equivalent join
       column exist between the inner and outer context of the
       join order. If the query for which the outline is created
       does not have an equivalent join column, then the optimizer
       cannot use the match join strategy specified in the outline.

    There is no default join method.

9.3.12  –  MODE mode

    Mode is a value assigned to an outline when it is generated by
    the optimizer. The default mode is 0. Specify a signed integer.

    If you create multiple outlines for a single query, the outlines
    cannot have the same outline mode. When more than one outline
    exists for a query, you can set the RDMS$BIND_OUTLINE_MODE
    logical name to the value of the outline mode for the outline you
    want the optimizer to use. For example, if you have a query that
    runs during the day and at night and you created two outlines for
    the query, you could keep the default outline mode of 0 for the
    outline to be used during the day, and assign an outline mode of
    -1 for the outline to be used at night. By setting the RDMS$BIND_
    OUTLINE_MODE logical name to -1 at night, the appropriate outline
    is run at the appropriate time.

    Valid values for modes are -2,147,483,648 to 2,147,483,647.
    Positive mode values are reserved for future use, so it is
    recommended that you specify a value between 0 and -2,147,483,648
    for the mode value.

9.3.13  –  MODULE module name

    Associates an outline with a declared local temporary table by
    qualifying the table name with the name of the stored module. In
    order to apply the outline to the declared local temporary table,
    the keyword MODULE is required.

9.3.14  –  ON_COLUMN

    Syntax options:

    ON COLUMN name

    Generates an outline for the specified columns DEFAULT, COMPUTED
    BY or AUTOMATIC expression. This is a partial outline which will
    be used when the column is referenced. If a column has both an
    AUTOMATIC UPDATE AS clause and a DEFAULT expression, then only
    one outline is created for the AUTOMATIC clause.

9.3.15  –  ON_CONSTRAINT

    Syntax options:

    ON CONSTRAINT name

    Generates an outline definition for the specified constraint.

9.3.16  –  ON_FUNCTION

    Syntax options:

    ON FUNCTION ID proc-id | ON FUNCTION NAME name

    Generates an outline definition for the specified stored
    function.

9.3.17  –  ON_PROCEDURE

    Syntax options:

    ON PROCEDURE ID proc-id | ON PROCEDURE NAME name

    Generates an outline definition for the specified stored
    procedure.

9.3.18  –  ON_TRIGGER

    Syntax options:

    ON TRIGGER name

    Generates an outline definition for the specified trigger.

9.3.19  –  ON_VIEW

    Syntax options:

    ON VIEW name

    Generates an outline definition for the specified view.

9.3.20  –  ORDERED

    Specifies that all nonfloating data sources within the
    parentheses should be retrieved in the order specified. Join
    items in the group are placed adjacently.

9.3.21  –  outline-name

    The name of the new query outline. The name has a maximum length
    of 31 characters.

9.3.22  –  QUERY

    Specifies that the data sources within the parentheses belong to
    a separate query.

9.3.23  –  SUBQUERY

    Specifies that the data sources within the parentheses belong to
    a separate subquery.

9.3.24  –  table-name

    Specifies the name of a database table.

9.3.25  –  UNION_WITH

    Specifies the union of two data sources.

    Either a join or union method must be specified between all data
    sources with the exception of QUERY source blocks.

                                   NOTE

       When a join method appears immediately before an ordered
       or unordered group, the join method is associated with the
       first join item named in the group.

    The union strategy is only valid for queries that use the UNION
    operator, and all queries that specify the UNION operator must
    use the union strategy.

9.3.26  –  UNORDERED

    Specifies that all data sources within the parentheses should be
    considered floating and that no order is implied. Join items in
    the group are placed adjacently.

9.3.27  –  USING query list

    Specifies the outline to be used for compilation of the contents
    of the FROM and ON clauses.

    You cannot use this clause with the ID id-number clause.

9.4  –  Examples

    Example 1: Creating an outline named AVAILABLE_EMPLOYEES

    SQL> CREATE OUTLINE available_employees
    cont> ID '09ADFE9073AB383CAABC4567BDEF3832'  MODE 0
    cont> AS (
    cont>     QUERY (
    cont> --
    cont> -- Cross the employees table with departments table first.
    cont> --
    cont>           employees 0 ACCESS PATH SEQUENTIAL JOIN BY MATCH TO
    cont>           departments 3 ACCESS PATH INDEX dept_index JOIN BY MATCH TO
    cont>           SUBQUERY (
    cont>               job_fitness 2 ACCESS PATH INDEX job_fit_emp, job_fit_dept
    cont>            JOIN BY CROSS TO
    cont>               SKILLS 4 ACCESS PATH ANY
    cont>                        ) JOIN BY MATCH TO
    cont>          SUBQUERY (
    cont>               major_proj 1 ACCESS PATH ANY JOIN BY CROSS TO
    cont>               education 6 ACCESS PATH ANY
    cont>                         ) JOIN BY CROSS TO
    cont>          research_projects 5 ACCESS PATH ANY UNION WITH
    cont> --
    cont> -- Always do the union with employees table last
    cont> --
    cont>          employees 7 ACCESS PATH ANY
    cont>           )
    cont>   )
    cont> COMPLIANCE OPTIONAL
    cont> COMMENT IS 'Available employees';

    Example 2: Creating an outline using the FROM clause

    SQL> CREATE OUTLINE degrees_for_emps_over_65
    cont> FROM
    cont>    (SELECT e.last_name, e.first_name, e.employee_id,
    cont>              d.degree, d.year_given
    cont>          FROM employees e, degrees d
    cont>          WHERE e.birthday < '31-Dec-1930'
    cont>          AND e.employee_id = d.employee_id
    cont>          ORDER BY e.last_name)
    cont> USING
    cont>    (QUERY
    cont>       (SUBQUERY
    cont>          (degrees 1 ACCESS PATH SEQUENTIAL
    cont>           JOIN BY CROSS TO
    cont>           employees 0 ACCESS PATH ANY
    cont>          )
    cont>       )
    cont>    )
    cont> COMPLIANCE OPTIONAL
    cont> COMMENT IS 'Outline to find employees over age 65 with college degrees';
    SQL> --
    SQL> SHOW OUTLINE degrees_for_emps_over_65
         DEGREES_FOR_EMPS_OVER_65
     Comment:       Outline to find employees over age 65 with college degrees
     Source:

    -- Rdb Generated Outline : 13-NOV-1995 15:28
    create outline DEGREES_FOR_EMPS_OVER_65
    id 'B6923A6572B28E734D6F9E8E01598CD8'
    mode 0
    as (
      query (
        subquery (
          DEGREES 1       access path sequential
            join by cross to
          EMPLOYEES 0     access path index       EMPLOYEES_HASH
          )
        )
      )
    compliance optional     ;

    Example 3: Creating an outline using the ON FUNCTION clause

    SQL> CREATE OUTLINE out1
    cont> ON FUNCTION NAME function1;
    SQL> COMMIT;
    SQL> SHOW OUTLINE out1
         OUT1
     Source:

    -- Rdb Generated Outline :  2-FEB-1996 15:46
    create outline OUT1
    id '264A6DDADCB483AE5B2CDF629C9C8C0F'
    mode 0
    as (
      query (
        subquery (
          EMPLOYEES 0     access path index       EMPLOYEES_HASH
          )
        )
      )
    compliance optional     ;

    Example 4: Creating an outline on a procedure that accesses a
    declared local temporary table (see the CREATE MODULE statement
    for the stored procedure and temporary table definition)

    SQL> CREATE OUTLINE outline1
    cont> ON PROCEDURE NAME paycheck_ins_decl
    cont> MODE 0
    cont> AS (
    cont>     QUERY (
    cont>            module.paycheck_decl_tab MODULE paycheck_decl_mod
    cont>            0
    cont>            ACCESS PATH SEQUENTIAL
    cont>           )
    cont>    )
    cont> COMPLIANCE OPTIONAL;
    SQL> SHOW OUTLINE outline1
         OUTLINE1
     Source:

    create outline OUTLINE1
    mode 0
    as (
      query (
        PAYCHECK_DECL_TAB       MODULE PAYCHECK_DECL_MOD 0
        access path sequential
        )
      )
    compliance optional     ;

    Example 5: New Output from Query Outlines

    SQL> BEGIN
    cont> DECLARE :x INTEGER;
    cont> -- Assignment
    cont> SET :x = (SELECT COUNT(*) FROM TOUT_1);
    cont> -- Delete statement
    cont> DELETE FROM TOUT_1;
    cont> -- Update statement
    cont> UPDATE TOUT_1
    cont>     SET a = (SELECT AVG(a) FROM TOUT_2)
    cont>     WHERE a IS NULL;
    cont> -- Singleton Select
    cont> SELECT a INTO :x
    cont>     FROM TOUT_1
    cont>     WHERE a = 1;
    cont> -- Trace (nothing if TRACE is disabled)
    cont> TRACE 'The first value: ', (SELECT a FROM TOUT_1 LIMIT TO 1 ROW);
    cont> END;

    The query outline generated by Oracle Rdb appears with comments
    after the QUERY keyword in the outline.

    -- Rdb Generated Outline : 29-MAY-1997 23:17
    create outline QO_C11395E6020C6FFA_00000000
    id 'C11395E6020C6FFA5A183A6CCE7C1F33'
    mode 0
    as (
      query (
    -- Set
        subquery (
          TOUT_1 0        access path sequential
          )
        )
      query (
    -- Delete
        subquery (
          TOUT_1 0        access path sequential
          )
        )
      query (
    -- Update
        subquery (
          subquery (
            TOUT_2 1        access path sequential
            )
            join by cross to
          subquery (
            TOUT_1 0        access path sequential
            )
          )
        )
      query (
    -- Select
        subquery (
          TOUT_1 0        access path sequential
          )
        )
      query (
    -- Trace
        subquery (
          TOUT_1 0        access path sequential
          )
        )
      )
    compliance optional     ;

10  –  PROCEDURE

    Creates an external procedure as a schema object in an Oracle Rdb
    database.

    The CREATE PROCEDURE statement is documented under the CREATE
    Routine. For complete information on creating an external
    procedure definition, see the CREATE Routine Help topic.

11  –  PROFILE

    Creates a profile that extends a user definition within the
    database with special attributes that control transactions
    and resource usage. When a user attaches to the database using
    ATTACH, CONNECT or SET SESSION AUTHORIZATION, they will either
    load their assigned profile definition or inherit the default
    profile (if defined).

11.1  –  Environment

    You can use the CREATE PROFILE statement:

    o  In interactive SQL

    o  Embedded in host language programs

    o  As part of a procedure in an SQL module or other compound
       statement

    o  In dynamic SQL as a statement to be dynamically executed

11.2  –  Format

  CREATE -+--> PROFILE --> <profilename> -------------+--+-> profile-options -+->
          +--> DEFAULT PROFILE -+--------------------++  +---------<----------+
                                +> ALIAS aliasname  -+

  profile-options =

  --+-> COMMENT IS -+-> char-literal --+--------------------+>
    |               +------- / <-------+                    |
    +-> DEFAULT TRANSACTION --> txn-options ----------------+
    +-> TRANSACTION MODES --> (txn-modes) ------------------+
    +-> LIMIT -+-+-> ROWS limit-value --------------------+++
    |          | +-> TIME limit-value -----+-+-----------++||
    |          | +-> CPU TIME limit-value -+ +-> SECONDS + ||
    |          |                             +-> MINUTES + ||
    |          +-------------------- <---------------------+|
    +-> NO -+> DEFAULT TRANSACTION --+----------------------+
            +> TRANSACTION MODES  -+-+
            +> LIMIT-+-> CPU TIME -+
                     +-> ROWS   ---+
                     +-> TIME  ----+

  limit-value =

  --+-> positive-integer-literal -+->
    +-> UNLIMITED ----------------+
    +-> DEFAULT ------------------+

11.3  –  Arguments

11.3.1  –  ALIAS aliasname

    When attached to multiple databases, the aliasname is required to
    direct the CREATE command to the appropriate database.

11.3.2  –  COMMENT_IS

    This optional clause can be used to add several lines of comment
    to the profile object. The comment is displayed by the SHOW
    PROFILES statement. Enclose the comment in single quotation marks
    (') and separate multiple lines in a comment with a slash mark
    (/).

11.3.3  –  DEFAULT_PROFILE

    Creates the special profile RDB$DEFAULT_PROFILE. This profile
    will be used by any user who is not assigned a profile using the
    PROFILE clause of CREATE or ALTER PROFILE.

11.3.4  –  DEFAULT_TRANSACTION

    DEFAULT TRANSACTION provides a default transaction for the user.
    By default, Oracle Rdb starts a READ WRITE transaction if none is
    explicitly started. Use the DECLARE TRANSACTION or START DEFAULT
    TRANSACTION statement to make use of this definition. You can
    override this clause with a DECLARE or SET TRANSACTION statement.

                                   NOTE

       Oracle Rdb does not permit the RESERVING or EVALUATING
       clauses to appear in the default transaction.

11.3.5  –  LIMIT_CPU_TIME

    Syntax options:

    LIMIT CPU TIME | NO LIMIT CPU TIME

    LIMIT CPU TIME sets the maximum CPU time that can be used by the
    query compiler. The keyword DEFAULT indicates that no value is
    defined by this profile and is equivalent to NO LIMIT CPU TIME.

    If a numeric value or the keyword UNLIMITED is specified then
    this value will be used even when the SET QUERY LIMIT CPU TIME
    statement is present in the session, or when the logical name
    RDMS$BIND_QG_CPU_TIMEOUT is defined.

    NO LIMIT CPU TIME is the default. Units can be specified as
    seconds or minutes.

11.3.6  –  LIMIT_ROWS

    Syntax options:

    LIMIT ROWS | NO LIMIT ROWS

    LIMIT ROWS sets the maximum number of rows that can be returned
    by a query started by the user. The keyword DEFAULT indicates
    that no value is defined by this profile and is equivalent to NO
    LIMIT ROWS.

    If a numeric value or the keyword UNLIMITED is specified then
    this value will be used even when the SET QUERY LIMIT ROWS
    statement is present in the session, or when the logical name
    RDMS$BIND_QG_REC_LIMIT is defined.

    NO LIMIT ROWS is the default.

11.3.7  –  LIMIT_TIME

    Syntax options:

    LIMIT TIME | NO LIMIT TIME

    LIMIT TIME sets the maximum elapsed time that can be used by the
    query compiler. The keyword DEFAULT indicates that no value is
    defined by this profile and is equivalent to NO LIMIT TIME.

    If a numeric value or the keyword UNLIMITED is specified then
    this value will be used even when the SET QUERY LIMIT TIME
    statement is present in the session, or when the logical name
    RDMS$BIND_QG_TIMEOUT is defined.

    NO LIMIT TIME is the default. Units can be specified as seconds
    or minutes.

11.3.8  –  TRANSACTION_MODES

    Syntax options:

    TRANSACTION MODES | NO TRANSACTION MODES

    TRANSACTION MODES provides the list of allowable transactions
    for this user. Please see the SET TRANSACTION MODES clause of the
    CREATE DATABASE and ALTER DATABASE statements for more details of
    txn-modes.

    The transaction modes specified may include modes disabled
    for all database users by CREATE, IMPORT, or ALTER DATABASE
    statements. However, only the subset allowed by both profile and
    database settings will be used. For instance, if the database
    specifies (READ ONLY, SHARED READ, PROTECTED READ) and the
    profile specifies (READ ONLY, SHARED), the session will be
    allowed the subset (READ ONLY, SHARED READ).

11.4  –  Examples

    Example 1

    The following example specifies the allowed transaction modes for
    any user assigned this profile.

    SQL> CREATE PROFILE DECISION_SUPPORT
    cont>   COMMENT IS 'limit transactions used by report writers'
    cont>   TRANSACTION MODES (NO READ WRITE, READ ONLY);

    Example 2

    This example shows the use of the LIMIT clauses to set boundaries
    for standard database users.

    SQL> create profile STANDARD_USER
    cont>    limit rows 10000
    cont>    limit time 10 minutes
    cont>    limit cpu time 20 seconds;
    SQL> show profile STANDARD_USER;
         STANDARD_USER
         Limit rows 10000
         Limit time 10 minutes
         Limit CPU time 20 seconds
    SQL> alter profile STANDARD_USER
    cont>    limit time 60 minutes;

12  –  ROLE

    Creates a role to which privileges and other roles can be
    granted. A role can be granted to a user or another role. For
    example, you can create a role for members of a department.
    When a user leaves the department, the departmental role can
    be revoked from that user and thus exclude that user's access to
    the departmental data.

12.1  –  Environment

    You can use the CREATE ROLE statement:

    o  In interactive SQL

    o  Embedded in host language programs

    o  As part of a procedure in an SQL module or other compound
       statement

    o  In dynamic SQL as a statement to be dynamically executed

12.2  –  Format

  CREATE ROLE ---> <role-name> ----------------------+
  +---------------------<----------------------------+
  +-----+--------------------------------+-----------+
        +--> IDENTIFIED EXTERNALLY ------+           |
        +--> NOT IDENTIFIED -------------+           |
  +--------------------<-----------------------------+
  +-----+----------------------------------+----------->
        +--> COMMENT IS --+-> 'string' --+-+
                          +------ / <----+

12.3  –  Arguments

12.3.1  –  COMMENT IS 'string'

    Adds a comment about the role. SQL displays the text of the
    comment when it executes a SHOW ROLES statement. Enclose the
    comment in single quotation marks (') and separate multiple lines
    in a comment with a slash mark (/).

12.3.2  –  IDENTIFIED_EXTERNALLY

    The IDENTIFIED EXERNALLY clause indicates that SQL should inherit
    the roles defined by the facilities of the operating system,
    such as rights identifiers. When a session is started, any role
    that is defined externally is established as part of the current
    user's profile.

12.3.3  –  NOT_IDENTIFIED

    Indicates that the role is used only with the database. The
    database must have SECURITY CHECKING IS INTERNAL set before using
    this clause.

12.3.4  –  role-name

    A user-supplied name that you assign to the role. The special
    roles BATCH, DIALUP, INTERACTIVE, LOCAL, NETWORK, and REMOTE are
    reserved names that cannot be specified as a role-name.

12.4  –  Examples

    Example 1: Creating a Role

    SQL> ALTER DATABASE FILENAME 'mf_personnel.rdb'
    cont> SECURITY CHECKING IS INTERNAL;
    SQL> ATTACH 'FILENAME mf_personnel.rdb';
    SQL> CREATE ROLE WRITER;
    SQL> SHOW ROLES;
    Roles in database with filename mf_personnel.rdb
         WRITER

    Example 2: Creating Roles and Granting Privileges to Those Roles

    SQL> ALTER DATABASE FILENAME mf_personnel.rdb
    cont> SECURITY CHECKING IS INTERNAL;
    SQL> -- Create a role for employees in the payroll department
    SQL> ATTACH 'FILENAME MF_PERSONNEL.RDB';
    SQL> CREATE ROLE PAYROLL
    cont> COMMENT IS 'This role allows access to various tables'
    cont> /          'and procedures for use by the PAYROLL dept.';
    SQL> -- Create another role for a subset of employees.
    SQL> CREATE ROLE ANNUAL_LEAVE
    cont> COMMENT IS 'This role is granted to PAYROLL personnel'
    cont> /          'who adjust the annual leave data';
    SQL> -- Grant EXECUTE privilege on module and ALL privilege on table
    SQL> -- SALARY_HISTORY to all employees to whom the PAYROLL role has
    SQL> -- been granted.  Grant EXECUTE privilege on module LEAVE_ADJUSTMENT
    SQL> --  only to those employees who have been granted both the PAYROLL
    SQL> -- and ANNUAL_LEAVE roles.
    SQL> GRANT EXECUTE ON MODULE PAYROLL_UTILITIES TO PAYROLL;
    SQL> GRANT ALL ON TABLE SALARY_HISTORY TO PAYROLL;
    SQL> GRANT EXECUTE ON MODULE LEAVE_ADJUSTMENT
    cont> to PAYROLL, ANNUAL_LEAVE;
    SQL> -- User STUART joins the personnel department.  Grant him
    SQL> -- the PAYROLL and ANNUAL_LEAVE roles so that he can
    SQL> -- perform all functions in the payroll department.
    SQL> CREATE USER STUART
    cont> IDENTIFIED EXTERNALLY
    SQL> GRANT PAYROLL, ANNUAL_LEAVE TO STUART;
    SQL> -- User STUART is promoted to supervisor and thus
    SQL> -- no longer needs access to the objects controlled by
    SQL> -- the ANNUAL_LEAVE role.  Revoke that role from user
    SQL> -- STUART.
    SQL> REVOKE ANNUAL_LEAVE FROM STUART;

    Example 3: Creating roles explictly using CREATE ROLE and
    implicitly using GRANT

    This examples demonstrates creating roles that match an OpenVMS
    rights identifiers. The CREATE ROLE statement is used first,
    and then the GRANT statement. GRANT issues a warning message to
    alert the database administrator of the side-effect of the GRANT
    statement.

    SQL> create database
    cont>   filename SAMPLE
    cont>   security checking is internal;
    SQL> show roles;
    Roles in database with filename sample
     No Roles found
    SQL> create role dba_mgr identified externally;
    SQL> show roles;
    Roles in database with filename sample
         DBA_MGR
    SQL> grant saldb_user to smith;
    %RDB-W-META_WARN, metadata successfully updated with the reported warning
    -RDMS-W-PRFCREATED, some users or roles were created
    SQL> show roles;
    Roles in database with filename sample
         DBA_MGR
         SALDB_USER
    SQL>

13  –  Routine

    Creates an external routine definition as a schema object in an
    Oracle Rdb database. External routine refers to both external
    functions and external procedures. A routine definition stores
    information in the database about a subprogram (a function or
    procedure) written in a 3GL language. The routine definition and
    the routine image are independent of each other, meaning one can
    exist without the other. However, to invoke an external routine,
    you need both the routine definition and routine image.

    SQL can invoke an external function from anywhere you can specify
    a value expression. External procedures are invoked using the
    CALL Compound_Statement.

13.1  –  Environment

    You can use the CREATE FUNCTION and CREATE PROCEDURE statements:

    o  In interactive SQL

    o  Embedded in host language programs to be precompiled

    o  As part of a procedure in an SQL module

    o  In dynamic SQL as a statement to be dynamically executed

13.2  –  Format

  CREATE -+-> FUNCTION ---+-> <external-routine-name> ---------+
          +-> PROCEDURE --+                                    |
    +----------------------------<-----------------------------+
    +-+--------------------------------+-----------------------+
      +-> STORED NAME IS <identifier> -+                       |
    +----------------------------<-----------------------------+
    +-> ( -+-----------------------+-> ) ----------------------+
           ++-> parameter-list --+-+                           |
            +-------- , <--------+                             |
    +----------------------------<-----------------------------+
    +-+-------------------+--> --+------------------+-> ; --> -+
      +-> returns-clause -+      +-> LANGUAGE SQL --+          |
                                                               |
    +----------------------------<-----------------------------+
    +----> external-body-clause ---------------------------------->

  parameter-list =

  -+----------+-+-------------------+-+-> data-type -----+----------+
   +-> IN ----+ +> <parameter-name> + +-> <domain-name> -+          |
   +-> OUT ---+                                                     |
   +-> INOUT -+                                                     |
  +-----------------------------------------------------------------+
  +-+---------------------------+--+---------------------+----------+
    +-> DEFAULT value-expr -----+  +-> mechanism-clause -+          |
   +------------------------------<---------------------------------+
   ++---------------------------------+------------------------------->
    +-> COMMENT IS -+-> 'string' ---+-+
                    +------ / <-----+

  mechanism-clause =

  ----> BY --+-> DESCRIPTOR -+--->
             +-> LENGTH -----+
             +-> REFERENCE --+
             +-> VALUE ------+

  external-body-clause =

  --> EXTERNAL --+------------------------------+-------------+
                 +-> NAME <external-body-name> -+             |
  +----------------------------------- <----------------------+
  ++-----------------------------+-> LANGUAGE language-name --+
   +-> external-location-clause -+                            |
  +----------------------------------<------------------------+
  ++-> PARAMETER STYLE GENERAL -+-----------------------------+
   +-> GENERAL PARAMETER STYLE -+                             |
  +-----------------------------------<-----------------------+
  ++----------------------------+------------------------------>
   +-> external-body-clause-2 --+

  external-body-clause-2 =

  ---+--+-> COMMENT IS -+-> '<string> ' -+----+--+-->
     |  |               +------ / <------+    |  |
     |  +-> bind-site-clause -----------------+  |
     |  +-> bind-scope-clause ----------------+  |
     |  +-> notify-clause --------------------+  |
     |  +-> CALLED ON NULL INPUT -------------+  |
     |  +-> RETURNS NULL ON NULL INPUT -------+  |
     |  +-> USAGE IS -+-> LOCAL ---+----------+  |
     |  |             +-> GLOBAL --+          |  |
     |  +-+--------+--+-------------------+---+  |
     |    +-> NOT -+  +-> VARIANT --------+      |
     |                +-> DETERMINISTIC --+      |
     +---------------------- <-------------------+

  external-location-clause =

  ---+--> DEFAULT LOCATION ------------+-------------------------+
     +--> LOCATION '<image-location>' -+                         |
   +-------------------------------<-----------------------------+
   +-+----------------------------->--------------------------+-->
     +--> WITH --+-> ALL -----+--> LOGICAL_NAME TRANSLATION --+
                 +-> SYSTEM --+

  language-name =

  --+-> ADA -----+-->
    +-> C -------+
    +-> COBOL ---+
    +-> FORTRAN -+
    +-> PASCAL --+
    +-> GENERAL -+

  bind-site-clause =

  --> BIND ON --+--> CLIENT --+--> SITE --->
                +--> SERVER --+

  bind-scope-clause =

  ---> BIND SCOPE --+-> CONNECT ------+-->
                    +-> TRANSACTION --+

  notify-clause =

  -> NOTIFY notify-entry-name --> ON -+-+-> BIND ---------+-+->
                                      | +-> CONNECT ------+ |
                                      | +-> TRANSACTION --+ |
                                      +--------- , <--------+

13.3  –  Arguments

13.3.1  –  bind-site-clause

    Syntax options:

    BIND ON CLIENT SITE | BIND ON SERVER SITE

    Selects the execution model and environment for external routine
    execution.

    CLIENT site binding causes the external routine to be activated
    and executed in the OpenVMS database client (application)
    process. This is the default binding. This binding offers
    the most efficient execution characteristics, allows sharing
    resources such as I/O devices, and allows debugging of external
    routines as if they were part of the client application. However,
    this binding may suffer from address space limitations. Because
    it shares virtual memory with the database buffers, this binding
    is restricted to the client process system user environment, and
    prohibits external routine execution in cases of an application
    running with elevated privileges.

    SERVER site binding causes the external routine to be activated
    in a separate process from the database client and server. The
    process is started on the same node at the database process.
    This binding offers reasonable execution characteristics, a
    larger address space, a true session user environment, and has
    no restrictions regarding client process elevated privileges.
    However, this binding does not permit sharing resources such
    as I/O devices with the client (in particular, there is no
    connection to the client interactive terminal), and debugging
    of routines is generally not possible.

13.3.2  –  bind-scope-clause

    Syntax options:

    BIND SCOPE CONNECT | BIND SCOPE TRANSACTION

    Defines the scope during which an external routine is activated
    and at what point the external routine is deactivated. The
    default scope is CONNECT.

    o  CONNECT

       An active routine is deactivated when you detach from the
       database (or exit without detaching).

    o  TRANSACTION

       An active routine is deactivated when a transaction is
       terminated (COMMIT or ROLLBACK). In the event that a
       transaction never occurs, the scope reverts to CONNECT.

13.3.3  –  COMMENT_IS

    A description about the nature of the parameter or external
    routine. SQL displays the text of the comment when you execute
    a SHOW FUNCTION or SHOW PROCEDURE statement. Enclose the comment
    in single quotation marks (')  and separate multiple lines in a
    comment with a slash (/).

13.3.4  –  DEFAULT value-expr

    Specifies the default value of a parameter for a function or
    procedure defined with mode IN. If you omit this parameter or if
    the Call statement argument list or function invocation specifies
    the DEFAULT keyword, then the value-expr specified with this
    clause is used. The parameter uses NULL as the default if you do
    not specify a value expression explicitly.

13.3.5  –  DETERMINISTIC

    Syntax options:

    DETERMINISTIC | NOT DETERMINISTIC

    The clause controls the evaluation of an external function in the
    scope of a query:

    o  NOT DETERMINISTIC

       Specifying the NOT DETERMINISTIC clause forces evaluation
       of corresponding functions (in scope of a single query)
       every time the function appears. If a function can return a
       different result each time it is invoked, you should use the
       DETERMINISTIC clause.

    o  DETERMINISTIC

       Specifying the DETERMINISTIC clause can result in a single
       evaluation of corresponding function expressions (in scope
       of a single query), and the resulting value is used in all
       occurrences of the corresponding function expression. When you
       use the DETERMINISTIC clause, Oracle Rdb evaluates whether or
       not to invoke the function each time it is used.

       For example:

       SELECT * FROM T1 WHERE F1() > 0 AND F1() < 20;

       If you define the F1 function as DETERMINISTIC, the function
       F1() may be evaluated just once depending on the optimizer. If
       you define the F1 function as NOT DETERMINISTIC, the function
       F1() is evaluated twice.

       DETERMINISTIC is the default.

    The DETERMINISTIC or NOT DETERMINISTIC clause is not allowed on
    procedure definitions.

13.3.6  –  external-body-clause

    Identifies key characteristics of the routine: its name, where
    the executable image of the routine is located, the language in
    which the routine is coded, and so forth.

13.3.7  –  external-body-name

    The name of the external routine. If you do not specify a name,
    SQL uses the name you specify in the external-routine-name
    clause.

    This name defines the routine entry address that is called for
    each invocation of the routine body. The named routine must exist
    in the external routine image selected by the location clause.

    Unquoted names are converted to uppercase characters.

13.3.8  –  external-location-clause

    Syntax options:

       DEFAULT LOCATION
       LOCATION 'image-location'

    A file specification referencing the image that contains the
    routine body and optional notify entry points.

13.3.9  –  external-routine-name

    The name of the external routine. The name must be unique among
    external and stored routines in the schema and can be qualified
    with an alias or, in a multischema database, a schema name.

13.3.10  –  FUNCTION

    Creates an external function definition.

    A function optionally accepts a list of IN parameters, always
    returns a value, and is referenced by name as an element of a
    value expression.

13.3.11  –  GENERAL_PARAMETER_STYLE

    This is synonymous with PARAMETER STYLE GENERAL and is
    deprecated.

13.3.12  –  language-name

    The name of the host language in which the external routine
    was coded. You can specify ADA, C, COBOL, FORTRAN, PASCAL, or
    GENERAL. The GENERAL keyword allows you to call routines written
    in any language.

13.3.13  –  LANGUAGE_SQL

    Names the language that calls the routine.

13.3.14  –  mechanism-clause

    Defines the passing mechanism. The following list describes the
    passing mechanisms.

    o  BY DESCRIPTOR

       Allows passing character data with any parameter access mode
       to routines compiled by language compilers that implement the
       OpenVMS calling standard.

    o  BY LENGTH

       The LENGTH passing mechanism is the same as the DESCRIPTOR
       passing mechanism.

    o  BY REFERENCE

       Allows passing data with any parameter access mode as a
       reference to the actual data.

       This is the default passing mechanism for parameters. This
       is also the default passing mechanism for a function value
       returning character data.

    o  BY VALUE

       Allows passing data with the IN parameter access mode to a
       routine as a value and allows functions to return a value.

       This is the default passing mechanism for a function value
       returning noncharacter data.

13.3.15  –  notify-clause

    Specifies the name of a second external routine called (notified)
    when certain external routine or database-related events occur.
    This name defines the routine entry address that is called, for
    each invocation of the notify routine. The named routine must
    exist in the external routine image selected by the location
    clause.

    The events of interest to the notify routine are ON BIND, ON
    CONNECT, and ON TRANSACTION. Multiple events can be specified.

    The following describes the events and scope of each event:

         BIND        Routine activation to routine deactivation
         CONNECT     Database attach to database disconnect
         TRANSACTION Start transaction to commit or roll back
                     transaction

13.3.16  –  parameter-list

    The optional parameters of the external routine. For each
    parameter you can specify a parameter access mode (IN, OUT, and
    INOUT), a parameter name, a data type, and a passing mechanism
    (by DESCRIPTOR, LENGTH, REFERENCE, or VALUE).

    The parameter access mode (IN, OUT, and INOUT) is optional and
    specifies how the parameter is accessed (whether it is read,
    written, or both). IN signifies read only, OUT signifies write
    only, and INOUT signifies read and write. The parameter access
    mode defaults to IN.

    Only the IN parameter access mode may be specified with
    parameters to an external function. Any of the parameter access
    modes (IN, OUT, and INOUT) may be specified with parameters to an
    external procedure.

    The optional parameter name is prefixed with a colon (:).
    The parameter name must be unique within the external routine
    parameters.

    The data type is required and describes the type of parameter
    using either an SQL data type or a domain name.

    You cannot declare a parameter as the LIST OF BYTE VARYING data
    type.

13.3.17  –  PARAMETER_STYLE_GENERAL

    Passes arguments and returns values in a manner similar to the
    OpenVMS convention for passing arguments and returning function
    values.

13.3.18  –  PROCEDURE

    Creates an external procedure definition.

    A procedure optionally accepts a list of IN, OUT, or INOUT
    parameters, and is referenced by name in a CALL statement.

13.3.19  –  RETURNS

    Describes a function (returned) value. You can specify a data
    type and a passing mechanism (BY DESCRIPTOR, LENGTH, REFERENCE,
    or VALUE). The function value is, by definition, an OUT access
    mode value.

    The data type is required and describes the type of parameter
    using either an SQL data type or a domain name.

    You cannot declare a function value as the LIST OF BYTE VARYING
    data type.

13.3.20  –  STORED_NAME_IS

    The name that Oracle Rdb uses to access the routine when defined
    in a multischema database. The stored name allows you to access
    multischema definitions using interfaces that do not recognize
    multiple schemas in one database. You cannot specify a stored
    name for a routine in a database that does not allow multiple
    schemas. For more information about stored names, see Stored
    Names.

13.3.21  –  USAGE_IS

    Specifies how the function or procedure can be called:

    o  USAGE IS GLOBAL indicates that the function or procedure can
       be called outside the current module. This is the default.

    o  USAGE IS LOCAL specifies that the routine is restricted to
       references within the module. This clause is provided for
       compatibility with CREATE MODULE but is not allowed for CREATE
       FUNCTION or CREATE PROCEDURE.

13.3.22  –  VARIANT

    Syntax options:

    VARIANT | NOT VARIANT

    These clauses are synonyms for the DETERMINISTIC and NOT
    DETERMINISTIC clauses. The DETERMINISTIC clause indicates that
    the same inputs to the function will generate the same output.
    It is the same as the NOT VARIANT clause. The NOT DETERMINISTIC
    clause indicates that the output of the function does not depend
    on the inputs. It is the same as the VARIANT clause. This clause
    is deprecated. Use DETERMINISTIC instead.

13.4  –  Examples

    Example 1: System provided integer absolute value routine

    SQL> CREATE FUNCTION IABS (IN INTEGER BY REFERENCE)
    cont>   RETURNS INTEGER BY VALUE;
    cont>   EXTERNAL NAME MTH$JIABS
    cont>   LOCATION 'SYS$SHARE:DPML$SHR.EXE'
    cont>   LANGUAGE GENERAL
    cont>   PARAMETER STYLE GENERAL
    cont>   NOT DETERMINISTIC;
    SQL> --
    SQL> SELECT IABS(-33) FROM JOBS LIMIT TO 1 ROW;

              33
    1 row selected

    Example 2: Using the NOT DETERMINISTIC clause, instead of the
    DETERMINISTIC clause

    The first CREATE FUNCTION statement in the following example
    creates a function with the DETERMINISTIC clause. The
    DETERMINISTIC clause indicates to Oracle Rdb that the function
    would return the same result no matter how many times it is
    called. Because the argument is a string literal (and could never
    change), Oracle Rdb optimizes the entire function call so that it
    is not called in subsequent select statements.

    SQL> -- Create a function with a DETERMINISTIC clause.
    SQL> CREATE function DO_COM (IN VARCHAR(255) BY DESCRIPTOR)
    cont>       RETURNS INTEGER;
    cont>       EXTERNAL NAME LIB$SPAWN
    cont>                LOCATION 'SYS$SHARE:LIBRTL.EXE'
    cont>       LANGUAGE GENERAL
    cont>       PARAMETER STYLE GENERAL
    cont>       DETERMINISTIC;
    SQL> --
    SQL> -- Use a SELECT statement to pass a string literal to the function.
    SQL> --
    SQL> -- Because Oracle Rdb optimizes functions with the DETERMINISTIC
    SQL> -- clause, and the function is passed a string literal,
    SQL> -- Oracle Rdb does not call the function from subsequent
    SQL> -- statements.
    SQL> --
    SQL> SELECT DO_COM('WRITE SYS$OUTPUT "HELLO"'), employee_id FROM employees
    cont> LIMIT TO 5 ROWS;
    HELLO
          DO_COM   EMPLOYEE_ID
               1   00164
               1   00165
               1   00166
               1   00167
               1   00168
    5 rows selected
    SQL> --
    SQL> -- Use the NOT DETERMINISTIC clause to create the function:
    SQL> --
    SQL> CREATE function DO_COM (IN VARCHAR(255) BY DESCRIPTOR)
    cont>       RETURNS INTEGER;
    cont>       EXTERNAL NAME lib$SPAWN
    cont>                LOCATION 'SYS$SHARE:LIBRTL.EXE'
    cont>       LANGUAGE GENERAL
    cont>       PARAMETER STYLE GENERAL
    cont>       NOT DETERMINISTIC;
    SQL> SELECT DO_COM('WRITE SYS$OUTPUT "HELLO"'), EMPLOYEE_ID FROM EMPLOYEES
    cont> LIMIT TO 5 ROWS;
    HELLO
    HELLO
          DO_COM   EMPLOYEE_ID
               1   00164
    HELLO
               1   00165
    HELLO
               1   00166
    HELLO
               1   00167
               1   00168
    5 rows selected

    Example 3: External function and external procedure definition

    The following example demonstrates:

    o  An external function and an external procedure

    o  Both CLIENT SITE and SERVER SITE binding

    o  BIND SCOPE

    o  A NOTIFY routine and events

    o  SQL callback using embedded SQL and SQL module language

    o  SQL$PRE options required when using callback

    o  Linker options required when using callback

    In this example, a new column is added to the EMPLOYEES table in
    the MF_PERSONNEL database. External routines are used to set this
    column to spaces and to the SOUNDEX value corresponding to the
    various employee names. Transaction control at the application
    level (in this instance, in SQL) in conjunction with a notify
    routine demonstrates how the actions of the external routines can
    be affected by actions of the application.

    The space-filling is performed by an external function, CLEAR_
    SOUNDEX, (written in C) containing embedded SQL, which opens
    another instance of the MF_PERSONNEL database and leaves it open
    until deactivated.

    The SOUNDEX name-setting is performed by an external procedure
    (written in FORTRAN), assisted by a notify routine (written in
    FORTRAN) which performs the database connection and transaction
    control. All the database operations are performed by SQL module
    language routines. The procedure also opens another instance
    of the MF_PERSONNEL database, which is disconnected by the
    notify routine when the routine is deactivated at the end of the
    transaction. Display statements executed by the notify routine
    serve to demonstrate the progress of the database operations.

    SQL> ATTACH 'FILENAME MF_PERSONNEL';
    SQL> --
    SQL> -- Add the new column SOUNDEX_NAME to the EMPLOYEES table.
    SQL> --
    SQL> ALTER TABLE EMPLOYEES ADD SOUNDEX_NAME CHAR(4);
    SQL> --
    SQL> -- Define the CLEAR_SOUNDEX function.
    SQL> --
    SQL> CREATE FUNCTION CLEAR_SOUNDEX ()
    cont>  RETURNS INTEGER BY VALUE;
    cont>     EXTERNAL NAME CLEAR_SOUNDEX
    cont>       LOCATION 'CLEAR_SOUNDEX.EXE'
    cont>     LANGUAGE C PARAMETER STYLE GENERAL NOT DETERMINISTIC
    cont>     BIND ON SERVER SITE BIND SCOPE CONNECT;
    SQL> --
    SQL> -- Define the ADD_SOUNDEX_NAME procedure.
    SQL> --
    SQL> CREATE PROCEDURE ADD_SOUNDEX_NAME
    cont>  (INOUT INTEGER BY REFERENCE);
    cont>     EXTERNAL NAME ADD_SOUNDEX_NAME
    cont>       LOCATION 'ADD_SOUNDEX.EXE'
    cont>     LANGUAGE FORTRAN PARAMETER STYLE GENERAL
    cont>     BIND ON CLIENT SITE BIND SCOPE TRANSACTION
    cont>     NOTIFY ADD_SOUNDEX_NOTIFY ON BIND, TRANSACTION;
    SQL> --
    SQL> COMMIT;
    SQL> DISCONNECT ALL;
    SQL> EXIT;

    Example 4: The CLEAR_SOUNDEX.SC program written in C

    /* Set the soundex_name column to spaces, return any error as function value */

    static int state = 0;

    extern int clear_soundex () {
        exec sql include sqlca ;
        exec sql declare alias filename MF_PERSONNEL;
        if (state == 0) {
            exec sql attach 'filename MF_PERSONNEL';
            state = 1;
        }
        exec sql set transaction read write;
        if (SQLCA.SQLCODE < 0)
            return SQLCA.SQLCODE;
        exec sql update employees set soundex_name = '    ';
        if (SQLCA.SQLCODE < 0)
            return SQLCA.SQLCODE;
        exec sql commit;
        if (SQLCA.SQLCODE < 0)
            return SQLCA.SQLCODE;
        return 0;
    }

    Example 5: Compiling, creating a linker options file, and linking
    the CLEAR_SOUNDEX program

    $ SQL$PRE/CC/NOLIST/SQLOPT=ROLLBACK_ON_EXIT CLEAR_SOUNDEX.SC

    $ CREATE CLEAR_SOUNDEX.OPT
        SYMBOL_VECTOR = (CLEAR_SOUNDEX=PROCEDURE)
        PSECT_ATTR=RDB$MESSAGE_VECTOR,NOSHR
        PSECT_ATTR=RDB$DBHANDLE,NOSHR
        PSECT_ATTR=RDB$TRANSACTION_HANDLE,NOSHR

    $ LINK/SHARE=CLEAR_SOUNDEX.EXE -
      CLEAR_SOUNDEX.OBJ, SQL$USER:/LIBRARY, -
      CLEAR_SOUNDEX.OPT/OPT
        SYMBOL_VECTOR = (CLEAR_SOUNDEX=PROCEDURE)
        PSECT_ATTR=RDB$MESSAGE_VECTOR,NOSHR
        PSECT_ATTR=RDB$DBHANDLE,NOSHR
        PSECT_ATTR=RDB$TRANSACTION_HANDLE,NOSHR

    Example 6: The ADD_SOUNDEX.FOR program written in FORTRAN

    C  Set the soundex values, returning any error in the IN/OUT parameter

            SUBROUTINE ADD_SOUNDEX_NAME (ERROR)
            CHARACTER ID*5,LAST*14,SX_NAME*4
            INTEGER ERROR
            ERROR = 0
            ID = '00000'
    10      CALL GET_NAME (ID, LAST, ERROR)
            IF (ERROR .NE. 0) GO TO 80
            CALL MAKE_SOUNDEX_NAME (LAST, SX_NAME)
            CALL SET_SOUNDEX_NAME (ID, SX_NAME, ERROR)
            IF (ERROR .EQ. 0) GO TO 10
    80      IF (ERROR .EQ. 100) ERROR = 0
    90      RETURN
            END

    C  Perform database connection and transaction operations for notify events

            SUBROUTINE ADD_SOUNDEX_NOTIFY (FUNC, RSV1, RSV2, RSV3)
            INTEGER FUNC, RSV1, RSV2, RSV3, SQLCODE
            SQLCODE = 0
            GO TO (10,20,5,5,30,40,50),FUNC
    5       TYPE *,'*** ADD_SOUNDEX_NOTIFY bad func ***'
            GO TO 90
    10      TYPE *,'*** ADD_SOUNDEX_NOTIFY activate ***'
            CALL ATTACH_DB (SQLCODE)
            IF (SQLCODE .NE. 0) GO TO 80
            GO TO 90
    20      TYPE *,'*** ADD_SOUNDEX_NOTIFY deactivate ***'
            CALL DETACH_DB (SQLCODE)
            IF (SQLCODE .NE. 0) GO TO 80
            GO TO 90
    30      TYPE *,'*** ADD_SOUNDEX_NOTIFY start tran ***'
            CALL START_TRAN (SQLCODE)
            IF (SQLCODE .NE. 0) GO TO 80
            GO TO 90
    40      TYPE *,'*** ADD_SOUNDEX_NOTIFY commit tran ***'
            CALL COMMIT_TRAN (SQLCODE)
            IF (SQLCODE .NE. 0) GO TO 80
            GO TO 90
    50      TYPE *,'*** ADD_SOUNDEX_NOTIFY rollback tran ***'
            CALL ROLLBACK_TRAN (SQLCODE)
            IF (SQLCODE .NE. 0) GO TO 80
            GO TO 90
    80      CALL SQL_SIGNAL ()
    90      RETURN
            END

    C       A 'substitute' SOUNDEX routine for demonstration purposes only

            SUBROUTINE MAKE_SOUNDEX_NAME (NAME, SOUNDEX_NAME)
            CHARACTER NAME*(*),SOUNDEX_NAME*4
            SOUNDEX_NAME(1:1)=NAME(1:1)
            IV = ICHAR(NAME(1:1))+22
            SOUNDEX_NAME(2:2)=CHAR(MOD(IV,10)+48)
            SOUNDEX_NAME(3:3)=CHAR(MOD(IV/10,10)+48)
            SOUNDEX_NAME(4:4)=CHAR(IV/100+48)
            RETURN
            END

    Example 7: The ADD_SOUNDEXM.SQLMOD module

    -- Support for set soundex routine

    MODULE ADD_SOUNDEX
    LANGUAGE FORTRAN
    PARAMETER COLONS

    PROCEDURE ATTACH_DB (SQLCODE);
        ATTACH 'FILENAME MF_PERSONNEL';
    PROCEDURE DETACH_DB (SQLCODE);
        DISCONNECT DEFAULT;

    PROCEDURE START_TRAN (SQLCODE);
        SET TRANSACTION READ WRITE;
    PROCEDURE COMMIT_TRAN (SQLCODE);
        COMMIT;
    PROCEDURE ROLLBACK_TRAN (SQLCODE);
        ROLLBACK;

    PROCEDURE GET_NAME (:ID CHAR(5), :LASTNAME CHAR(14), SQLCODE);
        SELECT EMPLOYEE_ID, LAST_NAME INTO :ID, :LASTNAME
        FROM EMPLOYEES WHERE EMPLOYEE_ID > :ID LIMIT TO 1 ROW;

    PROCEDURE SET_SOUNDEX_NAME (:ID CHAR(5), :SX_NAME CHAR(4), SQLCODE);
        UPDATE EMPLOYEES SET SOUNDEX_NAME = :SX_NAME WHERE EMPLOYEE_ID = :ID;

    Example 8: Compiling, creating the linker options file, and
    linking the FORTRAN and SQL module language programs

    $ FORTRAN/NOLIST ADD_SOUNDEX.FOR
    $ SQL$MOD ADD_SOUNDEXM.SQLMOD

    $ CREATE ADD_SOUNDEX.OPT
        SYMBOL_VECTOR = (ADD_SOUNDEX_NAME=PROCEDURE)
        SYMBOL_VECTOR = (ADD_SOUNDEX_NOTIFY=PROCEDURE)
        PSECT_ATTR=RDB$MESSAGE_VECTOR,NOSHR
        PSECT_ATTR=RDB$DBHANDLE,NOSHR
        PSECT_ATTR=RDB$TRANSACTION_HANDLE,NOSHR

    $ LINK/SHARE=ADD_SOUNDEX.EXE -
      ADD_SOUNDEX.OBJ, ADD_SOUNDEXM.OBJ, SQL$USER:/LIBRARY, -
      ADD_SOUNDEX.OPT/OPT
        SYMBOL_VECTOR  = ADD_SOUNDEX_NAME
        SYMBOL_VECTOR  = ADD_SOUNDEX_NOTIFY
        PSECT_ATTR=RDB$MESSAGE_VECTOR,NOSHR
        PSECT_ATTR=RDB$DBHANDLE,NOSHR
        PSECT_ATTR=RDB$TRANSACTION_HANDLE,NOSHR

    Example 9: Using the routines with interactive SQL

    $ SQL
    SQL> ATTACH 'FILENAME MF_PERSONNEL';
    SQL> --
    SQL> DECLARE :ERROR INTEGER;
    SQL> --
    SQL> SELECT EMPLOYEE_ID,SOUNDEX_NAME FROM EMPLOYEES
    cont>  LIMIT TO 3 ROWS;
     EMPLOYEE_ID   SOUNDEX_NAME
     00165         NULL
     00190         NULL
     00187         NULL
    3 rows selected
    SQL> COMMIT;
    SQL> --
    SQL> BEGIN
    cont>  SET :ERROR = CLEAR_SOUNDEX ();
    cont> END;
    SQL> PRINT :ERROR;
           ERROR
               0
    SQL> --
    SQL> SELECT EMPLOYEE_ID,SOUNDEX_NAME FROM EMPLOYEES
    cont>  LIMIT TO 3 ROWS;
     EMPLOYEE_ID   SOUNDEX_NAME
     00165
     00190
     00187
    3 rows selected
    SQL> COMMIT;
    SQL> --
    SQL> SET TRANSACTION READ ONLY;
    SQl> BEGIN
    cont>  SET :ERROR = 0;
    cont>  CALL ADD_SOUNDEX_NAME (:ERROR);
    cont> END;
    *** ADD_SOUNDEX_NOTIFY activate ***
    *** ADD_SOUNDEX_NOTIFY start tran ***
    SQL> PRINT :ERROR;
           ERROR
               0
    SQL> COMMIT;
    *** ADD_SOUNDEX_NOTIFY commit tran ***
    *** ADD_SOUNDEX_NOTIFY deactivate ***
    SQL> --
    SQL> SELECT EMPLOYEE_ID,SOUNDEX_NAME FROM EMPLOYEES
    cont>  LIMIT TO 3 ROWS;
     EMPLOYEE_ID   SOUNDEX_NAME
     00165         S501
     00190         O101
     00187         L890
    3 rows selected
    SQL> COMMIT;
    SQL> --
    SQL> BEGIN
    cont>  SET :ERROR = CLEAR_SOUNDEX ();
    cont> END;
    SQL> PRINT :ERROR;
           ERROR
               0
    SQL> --
    SQL> SET TRANSACTION READ ONLY;
    SQL> BEGIN
    cont>  SET :ERROR = 0;
    cont>  CALL ADD_SOUNDEX_NAME (:ERROR);
    cont> END;
    *** ADD_SOUNDEX_NOTIFY activate ***
    *** ADD_SOUNDEX_NOTIFY start tran ***
    SQL> PRINT :ERROR;
           ERROR
               0
    SQL> ROLLBACK;
    *** ADD_SOUNDEX_NOTIFY rollback tran ***
    *** ADD_SOUNDEX_NOTIFY deactivate ***
    SQL> --
    SQL> SELECT EMPLOYEE_ID,SOUNDEX_NAME FROM EMPLOYEES
    cont>  LIMIT TO 3 ROWS;
     EMPLOYEE_ID   SOUNDEX_NAME
     00165
     00190
     00187
    3 rows selected
    SQL> COMMIT;

14  –  SCHEMA

    Creates a new schema in the current default catalog of a
    multischema database.

                                   NOTE

       Use of the CREATE SCHEMA statement to create a database is
       a deprecated feature. If you specify physical attributes of
       a database such as the root file parameters, you receive an
       informational message, but SQL creates the database anyway.

       SQL> CREATE SCHEMA FILENAME TEST SNAPSHOT IS DISABLED;
       %SQL-I-DEPR_FEATURE, Deprecated Feature: SCHEMA (meaning DATABASE)

       If you do not specify any physical attributes, you may
       receive an error message noting that you must enable
       multischema naming.

       SQL> CREATE SCHEMA PARTS
       %SQL-F-SCHCATMULTI, Schemas and catalogs may only be referenced with
       multischema enabled

    A schema is a group of definitions within a database. The CREATE
    SCHEMA statement lets you specify in a single SQL statement all
    data and privilege definitions for a new schema. You can also add
    definitions to the schema later.

    A database, in addition to schema definitions, includes database
    system files and user data. If you need to specify any physical
    database characteristics such as the database root file or
    storage area parameters, use the CREATE DATABASE statement. See
    the CREATE DATABASE statement for more information.

    You can specify any number of optional schema elements to the
    CREATE SCHEMA statement. Schema elements are any of the CREATE
    statements (except CREATE STORAGE AREA, CREATE DOMAIN . . . FROM
    path-name, and CREATE TABLE . . . FROM path-name) or a GRANT
    statement.

    These statements require statement terminators, except when they
    are part of a CREATE SCHEMA or CREATE DATABASE statement. When
    you use these statements within a CREATE SCHEMA statement, use a
    statement terminator on the last schema element only. The first
    statement terminator that SQL encounters ends the CREATE SCHEMA
    statement. Later CREATE or GRANT statements are not within the
    scope of the CREATE SCHEMA statement.

14.1  –  Environment

    You can use the CREATE SCHEMA statement:

    o  In interactive SQL

    o  Embedded in host language programs to be precompiled

    o  As part of a procedure in an SQL module

    o  In dynamic SQL as a statement to be dynamically executed

14.2  –  Format

  CREATE SCHEMA -+-> <schema-name> -------------------------+-+
                 +-> AUTHORIZATION <auth-id> ---------------+ |
                 +-> <schema-name> AUTHORIZATION <auth-id> -+ |
                 +--------------------------------------------+
                 +-+-------------------------+--------------->
                   +-+--> schema-element --+-+
                     +----------<----------+

  schema-name  =

  --+---------------------------------------------+
    +------> <catalog-name> --------------+->. ---+
    +-> " -> <alias>.<catalog-name> ->" --+       |
    |   +-----------------------------------------+
    |   +--------------> <name-of-schema> ------+->
    +-> " -> <alias>.<name-of-schema> ->" ------+

  schema-element =

  -+-> create-collating-sequence-statement -+->
   +-> create-domain-statement -------------+
   +-> create-index-statement --------------+
   +-> create-sequence-statement -----------+
   +-> create-storage-map-statement --------+
   +-> create-table-statement --------------+
   +-> create-trigger-statement ------------+
   +-> create-view-statement ---------------+
   +-> grant-statement ---------------------+

14.3  –  Arguments

14.3.1  –  AUTHORIZATION auth id

    If you do not specify a schema name, the authorization identifier
    specifies the default schema.

    If you want to comply with the ANSI/ISO 1989 standard, specify
    the AUTHORIZATION clause without the schema name. Specify both
    the AUTHORIZATION clause and the schema name to comply with the
    current ANSI/ISO SQL standard.

14.3.2  –  create-collating-sequence-statement

    See the CREATE COLLATING_SEQUENCE statement for details.

    If you want to specify a collating sequence in a CREATE DOMAIN
    statement embedded in a CREATE SCHEMA statement, you must first
    specify a CREATE COLLATING SEQUENCE statement within the same
    CREATE SCHEMA statement.

14.3.3  –  create-domain-statement

    See the CREATE DOMAIN statement for details.

    You cannot use the FROM path-name clause when embedding a CREATE
    DOMAIN statement in a CREATE SCHEMA statement. You can, however,
    issue a separate CREATE DOMAIN statement following the CREATE
    SCHEMA statement. You can also describe the domain directly
    within the CREATE SCHEMA statement.

    If you want to specify a collating sequence in your embedded
    CREATE DOMAIN statement, you must first specify a CREATE
    COLLATING SEQUENCE statement within the same CREATE SCHEMA
    statement.

14.3.4  –  create-function-statement

    See the CREATE Routine statement for details.

14.3.5  –  create-index-statement

    See the CREATE INDEX statement for details.

14.3.6  –  create-module-statement

    See the CREATE MODULE statement for details.

14.3.7  –  create-procedure-statement

    See the CREATE Routine statement for details.

14.3.8  –  create-sequence-statement

    See the CREATE SEQUENCE statement for details.

14.3.9  –  create-storage-map-statement

    See the CREATE STORAGE_MAP statement for details.

14.3.10  –  create-table-statement

    See the CREATE TABLE statement for details.

    You cannot use the FROM path-name clause when embedding a CREATE
    TABLE statement in a CREATE SCHEMA statement. You can, however,
    issue a separate CREATE TABLE statement following the CREATE
    SCHEMA statement. You can also describe the table directly within
    the CREATE SCHEMA statement.

    The CREATE TABLE statements in a CREATE SCHEMA statement can
    refer to domains not yet created, provided that CREATE DOMAIN
    statements for the domains are in the same CREATE SCHEMA
    statement.

14.3.11  –  create-trigger-statement

    See the CREATE TRIGGER statement for details.

14.3.12  –  create-view-statement

    See the CREATE VIEW statement for details.

14.3.13  –  grant-statement

    See the GRANT statement for details.

14.3.14  –  schema-element

    Some CREATE statements or a GRANT statement.

14.3.15  –  schema-name

    Specifies the name of the schema created by the CREATE SCHEMA
    statement.

    You can qualify the schema name with either a catalog name or the
    catalog name qualified by the alias. You must enclose the alias
    and catalog name in double quotation marks and separate them with
    a period. You must issue the SET QUOTING RULES statement before
    you specify the alias and catalog name pair, or SQL issues an
    error message about the use of double quotation marks.

    For information on qualifying schema names with aliases and
    catalog names, see the User_Supplied_Names HELP topic.

14.4  –  Example

    Example 1: Creating a schema within a multischema database

    The following interactive statements create a database that
    contains a schema within a catalog. You issue the CREATE SCHEMA
    statement alone or as part of a CREATE DATABASE statement.

    SQL> SET DIALECT 'SQL99';
    SQL> CREATE DATABASE ALIAS PERS_ALIAS FILENAME personnel MULTISCHEMA IS ON;
    SQL> CREATE CATALOG "PERS_ALIAS.ADMIN";
    SQL> CREATE SCHEMA "PERS_ALIAS.ADMIN".PAYROLL;
    SQL> SHOW SCHEMAS;
    Schemas in database PERS_ALIAS
        "PERS_ALIAS.ADMIN".PAYROLL
        "PERS_ALIAS.RDB$CATALOG".RDB$SCHEMA

15  –  SEQUENCE

    Creates a sequence. A sequence is a database object from
    which multiple users can generate unique integers. You can use
    sequences to automatically generate primary key values.

15.1  –  Environment

    You can use the CREATE SEQUENCE statement:

    o  In interactive SQL

    o  Embedded in host language programs

    o  As part of a procedure in an SQL module or other compound
       statement

    o  In dynamic SQL as a statement to be dynamically executed

15.2  –  Format

  CREATE SEQUENCE <sequence-name> ------------------+
  +--------------------<----------------------------+
  +---+---------------->-------------------------+--+
      +---> STORED NAME IS ----> <stored-name> --+  |
  +--------------------<----------------------------+
  +-+------------------>-------------------------+-->
    +-+-+---> sequence-attributes --------+-+----+
      | +---> START WITH <numeric-value> -+ |
      +------------------<------------------+

  sequence-attributes =

   --+--> INCREMENT BY <numeric-value> ---------+->
     +--> sequence-range -----------------------+
     +--> CYCLE --------------------------------+
     +--> NOCYCLE ------------------------------+
     +--> CACHE <numeric-value> ----------------+
     +--> NOCACHE ------------------------------+
     +--> ORDER --------------------------------+
     +--> NOORDER ------------------------------+
     +--> RANDOMIZE ----------------------------+
     +--> NORANDOMIZE --------------------------+
     +--> RESTART WITH -------------------------+
     +--> WAIT ---------------------------------+
     +--> NOWAIT -------------------------------+
     +--> DEFAULT WAIT -------------------------+
     +--> COMMENT -+-------+--+-> '<string>' -+-+
                   +-> IS -+  +------ / <-----+

  sequence-range =

  -+-> MINVALUE -+-+--> <numeric-value> -+--+-->
   +-> MAXVALUE -+ +--> TINYINT      ----+  |
   |               +--> SMALLINT      ---+  |
   |               +--> INTEGER      ----+  |
   |               +--> BIGINT      -----+  |
   +-> NOMINVALUE --------------------------+
   +-> NOMAXVALUE --------------------------+

15.3  –  Arguments

15.3.1  –  CACHE

    Syntax options:

    CACHE numeric-value | NOCACHE

    The CACHE clause specifies how many values of the sequence Oracle
    Rdb should preallocate and keep in memory for faster access. The
    numeric value must be between 2 and 2147483647.

    You cannot cache more values than will fit in a given cycle of
    sequence numbers; thus, the maximum value allowed for the CACHE
    clause must be less than the value resulting from the following
    formula:

    (MAXVALUE-MINVALUE)/ABS(INCREMENT)

    The SET FLAGS option SEQ_CACHE can be used to override the
    setting of CACHE at runtime. See the SET_FLAGS statement for
    more details.

    A cache for a given sequence is populated at the first request
    for a number from that sequence, and whenever a value is
    requested when the cache is empty. If a system failure occurs,
    or when the cache is released any unfetched values will be
    discarded. The maximum number of lost values is equal to the
    current cache size. This may be the value specified by CACHE or
    by the SET FLAGS SEQ_CACHE option.

    The NOCACHE clause specifies that values will be allocated one
    at a time. This will require more I/O to the Rdb root file than
    using a CACHE value.

    By default, Oracle Rdb caches 20 sequence values.

15.3.2  –  COMMENT IS 'string '

    Adds a comment about the sequence. SQL displays the text of the
    comment when it executes a SHOW SEQUENCE statement. Enclose the
    comment in single quotation marks (') and separate multiple lines
    in a comment with a slash mark (/).

15.3.3  –  CYCLE

    Syntax options:

    CYCLE | NOCYCLE

    The CYCLE clause specifies that the sequence is to continue
    generating values after reaching either the MINVALUE or MAXVALUE.
    After an ascending sequence reaches the MAXVALUE, the sequence
    starts again from its MINVALUE. After a descending sequence
    reaches its MINVALUE, the sequence starts again at its MAXVALUE.
    The NOCYCLE clause specifies that the sequence should not
    continue generating values after reaching either its minimum
    or maximum value. An error is generated if an attempt is made to
    increment the sequence beyond its limits. The NOCYCLE clause is
    the default.

15.3.4  –  INCREMENT BY numeric-value

    Specifies the size of the increment and the direction (ascending
    or descending) of the sequence. This numeric value must be in the
    range -2147483648 through 2147483647, excluding 0. The absolute
    value must be less than the difference of MAXVALUE and MINVALUE.
    A negative value specifies a descending sequence; a positive
    value specifies an ascending sequence. By default, the numeric
    value is 1.

15.3.5  –  MAXVALUE

    Syntax options:

    MAXVALUE numeric-value | NOMAXVALUE

    The MAXVALUE clause specifies the maximum signed quadword
    (BIGINT) value that the sequence can generate. The numeric value
    must be between -9223372036854775808 and 9223372036854775808. The
    MAXVALUE must be equal to or greater than the value specified for
    the START WITH clause and greater than the value specified with
    the MINVALUE clause. The NOMAXVALUE clause specifies that the
    maximum value for an ascending sequence is 9223372036854775808
    (plus the cache size) and -1 for a descending sequence.

    The NOMAXVALUE clause is the default.

15.3.6  –  MAXVALUE integer

    Syntax options:

       MAXVALUE TINYINT
       MAXVALUE SMALLINT
       MAXVALUE INTEGER
       MAXVALUE BIGINT

    SQL allows the keyword TINYINT, SMALLINT, INTEGER and BIGINT
    to follow MAXVALUE instead of a numeric value. This allows easy
    range setting for sequences used with these data types. The value
    supplied will be the largest positive value that can be assigned
    to this data type.

15.3.7  –  MINVALUE

    Syntax options:

    MINVALUE numeric-value | NOMINVALUE

    The MINVALUE clause specifies the minimum signed quadword
    (BIGINT) value that the sequence can generate. The numeric
    value must be equal to or greater than -9223372036854775808. The
    MINVALUE must be less than or equal to the value specified with
    the START WITH clause and less than the value specified with the
    MAXVALUE clause. The NOMINVALUE clause specifies that the minimum
    value for an ascending sequence is 1, and -9223372036854775808
    (plus the cache size) for a descending sequence.

    The NOMINVALUE clause is the default.

15.3.8  –  MINVALUE integer-value

    Syntax options:

       MINVALUE TINYINT
       MINVALUE SMALLINT
       MINVALUE INTEGER
       MINVALUE BIGINT

    SQL allows the keyword TINYINT, SMALLINT, INTEGER and BIGINT
    to follow MINVALUE instead of a numeric value. This allows easy
    range setting for sequences used with these data types. The value
    supplied will be the smallest negative value that can be assigned
    to this data type.

15.3.9  –  ORDER

    Syntax options:

    ORDER | NOORDER

    The ORDER clause specifies that sequence numbers are guaranteed
    to be assigned in order for each requesting process, thus
    maintaining a strict history of requests. The NOORDER clause
    specifies that sequence numbers are not guaranteed to be
    generated in order of request.

    The NOORDER clause is the default.

15.3.10  –  RANDOMIZE

    Syntax options:

    RANDOMIZE | NORANDOMIZE

    The RANDOMIZE clause specifies that the sequence numbers are to
    be returned with a random value in the most significant bytes
    of the BIGINT value. This allows unique values to be generated
    that have a random distribution. When you specify the NORANDOMIZE
    clause, sequence numbers are close in value to others created at
    the same time.

    The advantage of the RANDOMIZE clause is that updates to columns
    of a sorted index to which these values are written occur in
    different locations in the index structure. This may improve
    concurrent access for large indexes as leaf nodes in different
    parts of the index can be updated independently. In contrast,
    the sequence numbers generated when you specify the NORANDOMIZE
    clause (which are likely to be close in numeric value to other
    sequences) result in index updates that occur in the same or
    nearby index nodes, which may lead to contention in one part of
    the sorted index.

    The full range of values in the BIGINT value returned for the
    sequence are used; therefore, the NOMAXVALUE and NOMINVALUE
    clauses must be specified (or defaulted to) for the sequence
    definition. The most significant bits of the BIGINT value
    are set to a randomly generated positive value. A generated
    distinct value is returned in the least significant 32 bits so
    that uniqueness is guaranteed. If you also specify the CYCLE
    clause, then only the least significant 32 bits are cycled. When
    a query is performed on the column RDB$NEXT_SEQUENCE_VALUE in
    the RDB$SEQUENCES table, only the generated value of the least
    significant bits is returned, because the most significant bits
    are not assigned until the NEXTVAL pseudocolumn is referenced.

    If you specify RANDOMIZE, you cannot also specify ORDER,
    MAXVALUE, or MINVALUE. The NORANDOMIZE clause is the default.

15.3.11  –  sequence-name

    The name of the sequence that you want to create. Use a name that
    is unique among all sequence, synonym, table, and view names in
    the database, or in the schema if you are using a multischema
    database. Use any valid SQL name.

15.3.12  –  START WITH numeric-value

    Specifies the initial numeric value to be used for the sequence.
    This value must be in the range specified by (or defaulted to)
    the other sequence attribute clauses. Valid values are in the
    range -9223373036854775808 to 9223372036854775807.

    If omitted, the START WITH value defaults to the value of
    MINVALUE for ascending sequences and MAXVALUE for descending
    sequences.

15.3.13  –  STORED NAME IS stored-name

    Specifies a name that Oracle Rdb uses to access a sequence
    created in a multischema database. The stored name allows you to
    access multischema definitions using interfaces, such as Oracle
    RMU, that do not recognize multiple schemas in one database. You
    cannot specify a stored name for a sequence in a database that
    does not allow multiple schemas.

15.3.14  –  WAIT

    Syntax options:

    WAIT | NOWAIT | DEFAULT WAIT

    Specifies what wait state is used when a reference to NEXTVAL
    is used. A reference to NEXTVAL for a sequence may require
    synchronization with other users of the sequence. When you
    specify DEFAULT WAIT, the wait state (WAIT or NOWAIT) of the
    current transaction is used. This may mean that no waiting is
    performed during a NOWAIT transaction.

    If you specify WAIT (the default) for the sequence, then
    regardless of the wait state set for the current transaction, all
    synchronization waits for the next value. This is the recommended
    setting if the application uses NOWAIT transactions. The current
    WAIT timeout interval defined for the transaction or database is
    used.

    If you specify NOWAIT for the sequence, then regardless of the
    current transaction setting, all synchronization does not wait
    for the next value.

15.4  –  Examples

    Example 1: Creating a Sequence

    SQL> -- This example creates a new sequence using the default
    SQL> -- values for NOMINVALUE, NOMAXVALUE, INCREMENT BY 1, NOCYCLE,
    SQL> -- and CACHE 20. The START WITH value is set to 147.
    SQL> -- Allyn Stuart will be assigned an EMPLOYEE_ID value of 147.
    SQL> -- Nick Jones will be assigned an EMPLOYEE_ID of 148.
    SQL> --
    SQL> CREATE SEQUENCE EMPID START WITH 00147;
    SQL> -- Use NEXTVAL to fetch a sequence number for the primary key column.
    SQL> INSERT INTO EMPLOYEES
    cont> (EMPLOYEE_ID, LAST_NAME, FIRST_NAME)
    cont> VALUES (EMPID.NEXTVAL, 'STUART', 'ALLYN')
    cont> RETURNING EMPLOYEE_ID;
     EMPLOYEE_ID
     147
    1 row inserted
    SQL> -- Use CURRVAL to reuse the EMPLOYEE_ID value for the foreign key columns
    SQL> -- in the associated tables.
    SQL> INSERT INTO SALARY_HISTORY
    cont> (EMPLOYEE_ID, SALARY_AMOUNT,SALARY_START, SALARY_END)
    cont> VALUES (EMPID.CURRVAL, 35000, '6-FEB-1998', NULL)
    cont> RETURNING EMPLOYEE_ID;
     EMPLOYEE_ID
     147
    1 row inserted
    SQL> INSERT INTO JOB_HISTORY
    cont> (EMPLOYEE_ID, DEPARTMENT_CODE, JOB_START, JOB_END)
    cont> VALUES (EMPID.CURRVAL, 'ENGR', '6-FEB-1998', NULL)
    cont> RETURNING EMPLOYEE_ID;
     EMPLOYEE_ID
     147
    1 row inserted
    SQL> INSERT INTO EMPLOYEES
    cont> (EMPLOYEE_ID, LAST_NAME, FIRST_NAME)
    cont> VALUES (EMPID.NEXTVAL, 'JONES ', 'NICK ')
    cont> RETURNING EMPLOYEE_ID;
     EMPLOYEE_ID
     148
    1 row inserted

16  –  STORAGE_AREA

                                   NOTE

       You cannot issue CREATE STORAGE AREA as an independent
       statement. It is a clause allowed only as part of a CREATE
       DATABASE or IMPORT statement.

       You can also create a storage area using the ADD STORAGE
       AREA clause of the ALTER DATABASE statement.

    Creates additional storage areas in a multifile database. Storage
    areas are data and snapshot files that are associated with
    particular tables in a multifile database.

    A CREATE STORAGE AREA clause specifies the names for the storage
    area files and determines their physical characteristics.
    Subsequent CREATE STORAGE MAP statements associate the storage
    area with particular tables in the database.

16.1  –  Environment

    You can use the CREATE STORAGE AREA clause only within a CREATE
    DATABASE or IMPORT statement.

16.2  –  Format

  CREATE STORAGE AREA -+-> <area-name> -+-+-------------------------++
                       +-> RDB$SYSTEM --+ +-> FILENAME <file-spec> -+|
       +-------------------------------------------------------------+
       ++------------------------------+-+->
        +-+-+-> storage-area-params-1 -+ |
          | +-> storage-area-params-2 -+ |
          +--------------- <-------------+

  storage-area-params-1 =

  --+-> ALLOCATION IS ---> <number-pages> --> PAGES -----+->
    +-> CACHE USING <row-cache-name> --------------------+
    +-> NO ROW CACHE ------------------------------------+
    +-> extent-params -----------------------------------+
    +-> INTERVAL IS --> <number-data-pages> -------------+
    +-> LOCKING IS --+-> ROW --+--> LEVEL ---------------+
    |                +-> PAGE -+                         |
    +-> PAGE FORMAT IS +-> UNIFORM -+--------------------+
    |                  +-> MIXED ---+                    |
    +-> PAGE SIZE IS ----> <page-blocks> --> BLOCKS -----+

  extent-params =

  --+-> EXTENT IS -+-> ENABLED -------------------++-->
    |              +-> DISABLED ------------------+|
    |              +-> <extent-pages> --> PAGES --+|
    |              +-> (extension-options) -------+|
    +---------------------<------------------------+

  extension-options =

  ---> MINIMUM OF <min-pages> PAGES, --+
  +------------------------------------+
  +--> MAXIMUM OF <max-pages> PAGES, --+
  +------------------------------------+
  +--> PERCENT GROWTH IS <growth> ------->

  storage-area-params-2 =

  --+-> CHECKSUM CALCULATION IS -----------+--+-> ENABLED --+-+->
    +-> SNAPSHOT CHECKSUM CALCULATION IS --+  +-> DISABLED -+ |
    +-> SNAPSHOT ALLOCATION IS --> <snp-pages> ----> PAGES ---+
    +-> SNAPSHOT EXTENT IS -+-> <extent-pages> ----> PAGES --++
    |                       +-> (extension-options) ---------+|
    +-> SNAPSHOT FILENAME --> <file-spec> --------------------+
    +-> THRESHOLDS ARE ( <val1> +-----------------------+> ) -+
    |                           +> ,<val2> -+----------++     |
    |                                       +> ,<val3> +      |
    +------------------------------<--------------------------+

16.3  –  Arguments

16.3.1  –  ALLOCATION_PAGES

    Syntax option:

    ALLOCATION IS number-pages PAGES

    The number of database pages initially allocated to the storage
    area. Rdb will automatically extend this allocation to account
    for internal structure pages, such as SPAM (spage management)
    pages. For example, an allocation of 25 will be increased to 27
    as shown in this example:

    SQL> alter database filename MF_PERSONNEL
    cont> add storage area DOC_EXAMPLE
    cont>   page format is uniform
    cont>   allocation 25;
    SQL> attach 'filename MF_PERSONNEL';
    SQL> show storage area DOC_EXAMPLE

         DOC_EXAMPLE
             Access is:      Read write
             Page Format:    Uniform
             Page Size:      2 blocks
             Area File:      USER_DISK:[DOC.DATABASES]DOC_EXAMPLE.RDA;1
             Area Allocation:          27 pages
             Extent:         Enabled
             Area Extent Minimum:      99 pages
             Area Extent Maximum:      9999 pages
             Area Extent Percent:      20 percent
             Snapshot File:  USER_DISK:[DOC.DATABASES]DOC_EXAMPLE.SNP;1
             Snapshot Allocation:      100 pages
             Snapshot Extent Minimum:  99 pages
             Snapshot Extent Maximum:  9999 pages
             Snapshot Extent Percent:  20 percent
             Locking is Row Level
             No Cache Associated with Storage Area
    No database objects use Storage Area DOC_EXAMPLE

16.3.2  –  CACHE USING row cache name

    Assigns the named row cache to the specified storage area. All
    rows stored in this area, whether they consist of table data,
    segmented string data, or special rows such as index nodes, are
    cached if those rows fit in the cache.

    If the row cache does not exist, you must create the row cache
    before terminating the CREATE DATABASE statement. For example:

    SQL> CREATE DATABASE FILENAME test_db
    cont> ROW CACHE IS ENABLED
    cont> CREATE STORAGE AREA area1
    cont>    CACHE USING test1
    cont> CREATE CACHE test1
    cont>    CACHE SIZE IS 100 ROWS
    cont>    ROW LENGTH IS 200 BYTES;

    Only one row cache is allowed for each storage area.

    NO ROW CACHE is the default for a storage area.

16.3.3  –  CHECKSUM_CALCULATION

    Syntax options:

    CHECKSUM CALCULATION | SNAPSHOT CHECKSUM CALCULATION

    This option allows you to enable or disable calculations of page
    checksums when pages are read from or written to the storage or
    snapshot area files.

    The default is ENABLED.

                                   NOTE

       Oracle Corporation recommends that you leave checksum
       calculations enabled; which is the default.

    With current technology, it is possible that errors may occur
    that the checksum calculation can detect but that may not
    be detected by either the hardware, firmware, or software.
    Unexpected application results and database corruption may occur
    if corrupt pages exist in memory or on disk but are not detected.

    Oracle Corporation recommends performing checksum calculations,
    except in the following specific circumstances:

    o  Your application is stable and has run without errors on the
       current hardware and software configuration for an extended
       period of time.

    o  You have reached maximum CPU utilization in your current
       configuration. Actual CPU utilization by the checksum
       calculation depends primarily on the size of the database
       pages in your database. The larger the database page, the
       more noticeable the CPU usage by the checksum calculation may
       become.

                                   NOTE

       Oracle Corporation recommends that you carefully evaluate
       the trade-off between reducing CPU usage by the checksum
       calculation and the potential for loss of database integrity
       if checksum calculations are disabled.

    Oracle Rdb allows you to disable and, subsequently, re-enable
    checksum calculation without error. However, once checksum
    calculations have been disabled, corrupt pages may not be
    detected even if checksum calculations are subsequently re-
    enabled.

16.3.4  –  EXTENT

    Syntax options:

    EXTENT ENABLED | EXTENT DISABLED

    Enables or disables extents. Extents are ENABLED by default.

    You may encounter performance problems when creating hashed
    indexes in storage areas with the mixed page format if the
    storage area was created specifying the incorrect size for
    the area and if extents are enabled. By disabling extents,
    this problem can be diagnosed early and corrected to improve
    performance.

16.3.5  –  EXTENT_IS

    Syntax options:

    EXTENT IS extent-pages PAGES | EXTENT IS (extension-options)

    Specifies the number of pages of each storage area file extent.
    See also the description under the SNAPSHOT EXTENT argument.

16.3.6  –  FILENAME file spec

    Provides an explicit file specification for storage area files.
    The CREATE STORAGE AREA clause creates two files: a storage area
    file with a file extension of .rda, and a snapshot file with a
    file extension of .snp. If you omit the FILENAME argument, the
    file specification takes the following defaults:

    o  Device: the current device for the process

    o  Directory: the current directory for the process

    o  File name: the name specified for the storage area

    Neither the file specification for the storage area nor the
    snapshot file may contain a node specification.

    The file specification is used for both the storage area and
    snapshot files that comprise the storage area (unless you use the
    SNAPSHOT FILENAME argument to specify a different file for the
    snapshot file). Because the CREATE STORAGE AREA clause can create
    two files with different file extensions, do not specify a file
    extension with the file specification.

    You may use a logical name for all or part of a file
    specification.

    One benefit of a multifile database is that its files can reside
    on more than one disk. If you want storage area files to reside
    on another disk, you must specify the FILENAME argument with a
    full file specification.

    However, you may choose to create a multifile database even
    if your main purpose in creating the storage area is not to
    distribute storage area files across more than one disk. For
    instance, a multifile database enables you to:

    o  Take advantage of hashed indexes. Hashed indexes require a
       storage area with mixed page format and cannot be stored in
       the RDB$SYSTEM storage area.

    o  Set attributes such as page size to better correspond with
       tables that will be stored in the storage area.

16.3.7  –  INTERVAL

    Syntax options:

    INTERVAL IS number-data-pages

    Specifies the number of data pages between SPAM pages in the
    storage area file, and thus the maximum number of data pages each
    SPAM page manages. The default, and also the minimum interval,
    is 216 data pages. The first page of each storage area is a SPAM
    page. The interval you specify determines where subsequent SPAM
    pages are to be inserted if there are enough data pages in the
    storage file to require more SPAM pages.

    You cannot specify the INTERVAL storage area parameter unless you
    also explicitly specify PAGE FORMAT IS MIXED.

    Oracle Rdb calculates the maximum INTERVAL size based on the
    number of blocks per page, and returns an error message if you
    exceed this value. For example, when the page size is 2 blocks,
    the maximum INTERVAL is 4008 pages. If you try to create a
    storage area with the INTERVAL set to 4009, Oracle Rdb returns
    the following error message:

    %RDB-E-BAD_DPB_CONTENT, invalid database parameters in the database parameter
    block (DPB)
    -RDMS-F-SPIMAX, spam interval of 4009 is more than the Rdb maximum of 4008
    -RDMS-F-AREA_NAME, area NEW

    For more information about setting space area management
    parameters, see the Oracle Rdb Guide to Database Maintenance.

16.3.8  –  LOCKING level

    Syntax options:

    LOCKING IS ROW LEVEL | LOCKING IS PAGE LEVEL

    Specifies if locking is at the page or row level for the storage
    area. This clause provides an alternative to requesting locks on
    records. Specifying a lock level when you create a storage area
    overrides the database default lock level. The default is ROW
    LEVEL.

    When many records are accessed in the same area and on the same
    page, the LOCKING IS PAGE LEVEL clause reduces the number of lock
    operations performed to process a transaction; however, this is
    at the expense of reduced concurrency because these pages' locks
    are held until COMMIT/ROLLBACK. Transactions that benefit most
    with page-level locking are of short duration and also access
    several database records on the same page. However, to guarantee
    consistency of the data in the absence of row locking these page
    level locks must be held until the transaction ends with COMMIT
    or ROLLBACK.

    Use the LOCKING IS ROW LEVEL if transactions are long in duration
    and lock many rows.

    The LOCKING IS PAGE LEVEL clause causes fewer blocking ASTs
    and provides better response time and utilization of system
    resources. However, there is a higher contention for pages and
    increased potential for deadlocks and long transactions may use
    excessive locks.

    Page-level locking is never applied to RDB$SYSTEM or the DEFAULT
    storage-area, either implicitly or explicitly, because the
    locking protocol can stall metadata users.

    You cannot specify page-level locking on single-file databases.

16.3.9  –  MAXIMUM_PAGES

    Syntax options:

    MAXIMUM OF max-pages PAGES

    Specifies the maximum number of pages of each extent. The default
    is 9,999 pages.

16.3.10  –  MINIMUM_PAGES

    Syntax options:

    MINIMUM OF min-pages PAGES

    Specifies the minimum number of pages of each extent. The default
    is 99 pages.

16.3.11  –  NO_ROW_CACHE

    Specifies that a row cache is not assigned to the specified
    storage area in the database. You cannot specify the NO ROW CACHE
    clause if you specify the CACHE USING clause.

    Alter the storage area and name a row cache with the CACHE USING
    clause to assign a row cache to the storage area or to override
    the database default. Only one row cache is allowed for each
    storage area.

16.3.12  –  PAGE_FORMAT

    Syntax options:

    PAGE FORMAT IS UNIFORM | PAGE FORMAT IS MIXED

    Specifies the on-disk structure for the storage area.

    o  The default is PAGE FORMAT IS UNIFORM. A storage area with
       uniform page format is a file that is divided into groups of n
       pages, called clumps, where n equals the buffer size divided
       by the page size. Both buffer size and page size are user
       specified values. By default, the buffer size is 6 blocks,
       and the page size is 1024 bytes or 2 blocks long, resulting
       in clumps of three pages. The PAGE FORMAT IS UNIFORM argument
       creates a storage area file that is divided into clumps. A set
       of clumps forms a logical area that can contain rows from a
       single table or index only.

       Uniform page format storage areas generally give the best
       performance if the tables in the storage area are likely to be
       subject to a wide range of queries.

    o  The PAGE FORMAT IS MIXED argument creates a storage area with
       a format that allows rows from more than one table to reside
       on or near a particular page of the storage area file. This
       is useful for storing related rows from different tables on
       the same page of the data file. For storage areas subject to
       repeated queries that retrieve those related rows, a mixed
       page format can greatly reduce input/output overhead if the
       mix of rows on the page is carefully controlled. However,
       mixed page format storage areas degrade performance if the mix
       of rows on the page is not suited for the queries made against
       the storage area.

    For more information on the relative advantages and disadvantages
    of uniform and mixed storage areas, see the Oracle Rdb Guide to
    Database Maintenance.

16.3.13  –  PAGE SIZE blocks

    Syntax options:

    PAGE SIZE IS page-blocks BLOCKS

    The size in blocks of each data page in the storage area. Page
    size is allocated in 512-byte blocks. The default is 2 blocks
    (1024 bytes). If your largest row is larger than approximately
    950 bytes, allocate more blocks per page to prevent fragmented
    rows. If you specify a page size larger than the buffer size, an
    error message is returned.

16.3.14  –  PERCENT_GROWTH

    Syntax options:

    PERCENT GROWTH IS growth

    Specifies the percent growth of each extent. The default is 20
    percent growth.

16.3.15  –  SNAPSHOT_ALLOCATION

    Syntax options:

    SNAPSHOT ALLOCATION IS snp-pages PAGES

    Specifies the number of pages allocated for the snapshot file.

    The default is 100 pages.

16.3.16  –  SNAPSHOT_EXTENT

    Syntax options:

    SNAPSHOT EXTENT IS extent-pages | SNAPSHOT EXTENT IS (extension-
    options)

    Specifies the number of pages of each snapshot or storage area
    file extent. The default extent for storage area files is 100
    pages.

    Specify a number of pages for simple control over the extension.
    For greater control, and particularly for multivolume databases,
    use the MIN, MAX, and PERCENT GROWTH extension options instead.

    If you use the MIN, MAX, and PERCENT GROWTH parameters, you must
    enclose them in parentheses.

16.3.17  –  SNAPSHOT_FILENAME

    Syntax options:

    SNAPSHOT FILENAME file-spec

    Provides a separate file specification for the snapshot file. The
    SNAPSHOT FILENAME argument can only be specified with multifile
    databases.

    This argument lets you specify a different file name, device,
    or directory for the snapshot file created by the CREATE STORAGE
    AREA clause. Do not specify a file extension other than .snp to
    the file specification. Oracle Rdb assigns the extension .snp
    to the file specification, even if you specify an alternate
    extension.

    If you omit the SNAPSHOT FILENAME argument, the snapshot file
    gets the same device, directory, and file name as the storage
    area file.

16.3.18  –  STORAGE_AREA

    Specifies the name of the storage area you want to create. The
    name cannot be the same as any other storage area definition in
    the database.

16.3.19  –  STORAGE_AREA_RDB$SYSTEM

    Specifies that you want the CREATE STORAGE AREA clause to
    override the default characteristics for the main storage area,
    RDB$SYSTEM, in a new database.

    The RDB$SYSTEM storage area contains database system tables and
    indices. If an alternate DEFAULT STORAGE AREA is not assigned
    then this area may also contain unmapped user tables and indices.

16.3.20  –  THRESHOLDS values

    Syntax options:

    THRESHOLDS ARE ( val1 [,val2 [,val3] ] )

    Specifies one, two, or three threshold values for mixed format
    pages. The threshold values represent a fullness percentage on a
    data page and establish three possible ranges of guaranteed free
    space on the data pages. When a data page reaches the percentage
    defined by a given threshold value, the space area management
    (SPAM) entry for the data page is updated to reflect the new
    fullness percentage and its remaining free space.

    The default threshold values for mixed areas, if not specified,
    are (70,85,95), which indicates that the nominal record size
    should be used for SPAM threshold calculations. Oracle Rdb never
    stores a record on a page at the third threshold. The value you
    set for the highest threshold can be used to reserve space on the
    page for future record growth.

    When only val1 is specified, this is equivalent to (val1, 100,
    100). When val1 and val2 are specified, this is equivalent to
    (val1, val2, 100). The trailing, unspecified thresholds default
    to 100 percent. For example, THRESHOLDS ARE (40) would appear as
    (40, 100, 100).

    You cannot specify the THRESHOLDS storage area parameter unless
    you also explicitly specify PAGE FORMAT IS MIXED.

    For more information about setting space area management
    parameters, see the Oracle Rdb Guide to Database Maintenance.

16.4  –  Examples

    Example 1: Defining a multifile database

    This example shows the definition of a database and storage areas
    for a multifile database.

    SQL> -- Note that there is no semicolon before
    SQL> -- the first CREATE STORAGE AREA clause.
    SQL> CREATE DATABASE ALIAS MULTIFILE_EXAMPLE
    cont>   FILENAME 'DB_DATA01:[DB.DATA]MULTIFILE_EXAMPLE'
    cont> CREATE STORAGE AREA EMPID_LOW
    cont>   FILENAME 'DB_DATA02:[DB.DATA]EMPID_LOW'
    cont>   ALLOCATION IS 10 PAGES
    cont>   -- Notice that the snapshot file resides on a
    cont>   -- different disk than the storage area file. This
    cont>   -- strategy reduces disk input/output bottlenecks:
    cont>   SNAPSHOT FILENAME 'DB_SNAP03:[DB.SNAP]EMPID_LOW'
    cont>   SNAPSHOT ALLOCATION IS 10 PAGES
    cont> --
    cont> CREATE STORAGE AREA EMPID_MID
    cont>   FILENAME 'DB_DATA04:EMPID_MID'
    cont>   ALLOCATION IS 10 PAGES
    cont>   SNAPSHOT FILENAME 'DB_SNAP05:[DB.SNAP]EMPID_MID'
    cont>   SNAPSHOT ALLOCATION IS 10 PAGES
    cont> --
    cont> CREATE STORAGE AREA EMPID_OVER
    cont>   FILENAME 'DB_DATA06:[DB.DATA]EMPID_OVER'
    cont>   ALLOCATION IS 10 PAGES
    cont>   SNAPSHOT FILENAME 'DB_SNAP07:[DB.SNAP]EMPID_OVER'
    cont>   SNAPSHOT ALLOCATION IS 10 PAGES
    cont> --
    cont> CREATE STORAGE AREA HISTORIES
    cont>   FILENAME 'DB_DATA02:[DB.DATA]HISTORIES'
    cont>   ALLOCATION IS 10 PAGES
    cont>   SNAPSHOT FILENAME 'DB_SNAP03:[DB.SNAP]HISTORIES'
    cont>   SNAPSHOT ALLOCATION IS 10 PAGES
    cont> --
    cont> CREATE STORAGE AREA CODES
    cont>   FILENAME 'DB_DATA04:[DB.DATA]CODES'
    cont>   ALLOCATION IS 10 PAGES
    cont>   SNAPSHOT FILENAME 'DB_SNAP05:[DB.SNAP]CODES'
    cont>   SNAPSHOT ALLOCATION IS 10 PAGES
    cont> --
    cont> CREATE STORAGE AREA EMP_INFO
    cont>   FILENAME 'DB_DATA08:[DB.DATA]EMP_INFO'
    cont>   ALLOCATION IS 10 PAGES
    cont>   SNAPSHOT FILENAME 'DB_SNAP09:[DB.SNAP]EMP_INFO'
    cont>   SNAPSHOT ALLOCATION IS 10 PAGES
    cont> --
    cont> -- End the CREATE DATABASE statement:
    cont> ;

    Example 2:

    This example shows how to set page-level and row-level locking on
    storage areas from both the database level and from the storage
    area level.

    SQL> CREATE DATABASE FILENAME sample
    cont>    LOCKING IS PAGE LEVEL
    cont> --
    cont> -- All storage areas will default to page-level locking unless
    cont> -- explicitly set to row-level locking.
    cont> --
    cont> CREATE STORAGE AREA RDB$SYSTEM
    cont>    FILENAME sample_system
    cont> --
    cont> -- You cannot specify page-level locking on RDB$SYSTEM.  RDB$SYSTEM
    cont> -- always defaults to row-level locking.
    cont> --
    cont> CREATE STORAGE AREA HASH_AREA
    cont>    FILENAME sample_hash
    cont>    PAGE FORMAT IS MIXED
    cont> --
    cont> -- HASH_AREA defaultS to page-level locking.
    cont> --
    cont> CREATE STORAGE AREA DATA_AREA
    cont>    FILENAME sample_data
    cont>    LOCKING IS ROW LEVEL
    cont> --
    cont> -- DATA_AREA is explicitly set to row-level locking.
    cont> --
    cont> ;
    SQL> SHOW STORAGE AREAS (ATTRIBUTES) *
    Storage Areas in database with filename sample

         RDB$SYSTEM
             List storage area.
             Access is:      Read write
             Page Format:    Uniform
             Page Size:      2 blocks
             .
             .
             .
             Extent :       Enabled
             Locking is Row Level

         HASH_AREA
             Access is:      Read write
             Page Format:    Mixed
             Page Size:      2 blocks
             .
             .
             .
             Extent :       Enabled
             Locking is Page Level

         DATA_AREA
             Access is:      Read write
             Page Format:    Uniform
             Page Size:      2 blocks
             .
             .
             .
             Extent :       Enabled
             Locking is Row Level

    See the SHOW statement for information on the SHOW STORAGE AREAS
    statement.

    Example 3: Creating and assigning a row cache to a storage area

    SQL> create database
    cont>     filename SAMPLE_DB
    cont>     reserve 2 cache slots
    cont>     row cache is enabled
    cont>     default storage area is AREA1
    cont>  create cache CACHE1
    cont>     cache size is 1000 rows
    cont>     row length is 1000 bytes
    cont>  create storage area AREA1
    cont>     cache using CACHE1
    cont> ;
    SQL> show cache CACHE1

         CACHE1
            Cache Size:            1000 rows
            Row Length:            1000 bytes
     Row Replacement:       Enabled
     Shared Memory:         Process
     Large Memory:          Disabled
     Window Count:          100
     Working Set Count:     10
     Reserved Rows:         20
     Allocation:            100 blocks
     Extent:                100 blocks
    SQL> show storage area AREA1

         AREA1
             Access is:      Read write
             Page Format:    Uniform
             Page Size:      2 blocks
             Area File:      USER_DISK:[DOC.DATABASES]AREA1.RDA;1
             Area Allocation:          702 pages
             Extent:   Enabled
             Area Extent Minimum:      99 pages
             Area Extent Maximum:      9999 pages
             Area Extent Percent:      20 percent
             Snapshot File:  USER_DISK:[DOC.DATABASES]AREA1.SNP;1
             Snapshot Allocation:      100 pages
             Snapshot Extent Minimum:  99 pages
             Snapshot Extent Maximum:  9999 pages
             Snapshot Extent Percent:  20 percent
      Locking is Row Level
             Using Cache CACHE1

    Database objects using Storage Area AREA1:
    Usage            Object Name                     Map / Partition
    ---------------- ------------------------------- -------------------------------
    Default Area

17  –  STORAGE_MAP

    Associates a table with one or more storage areas in a multifile
    database. The CREATE STORAGE MAP statement specifies a storage
    map that controls which lists or rows of a table are stored in
    which storage areas.

    In addition to creating storage maps, the CREATE STORAGE MAP
    statement has options that control:

    o  Which index the database system uses when inserting rows in
       the table

    o  Whether or not the rows of the table are stored in a
       compressed format

    o  Whether or not partitioning keys can be modified.

    o  Whether the table is partitioned vertically, horizontally, or
       both.

    o  Whether logging is enabled or disabled for the duration of
       this operation

17.1  –  Environment

    You can use the CREATE STORAGE MAP statement:

    o  In interactive SQL

    o  Embedded in host language programs to be precompiled

    o  As part of a procedure in an SQL module

    o  In dynamic SQL as a statement to be dynamically executed

17.2  –  Format

  CREATE STORAGE MAP <map-name> --+
   +------------------------------+
   ++-----------------------------------+-+
    +-> STORED NAME IS <stored-name> ---+ |
   +--------------------------------------+
   +> FOR <table-name> ++-------------------------------------++-+
   |                   |++> ENABLE -+> COMPRESSION -----------+| |
   |                   ||+> DISABLE +                         || |
   |                   |+-> PLACEMENT VIA INDEX <index-name> -+| |
   |                   |+-> partition-updatable-clause -------+| |
   |                   |+-> threshold-clause -----------------+| |
   |                   |+-> LOGGING ---------------------------+ |
   |                   |+-> NOLOGGING -------------------------+ |
   |                   |+-> COMMENT IS -+-> '<string>' ---+----+ |
   |                   |                +-------- / <-----+    | |
   |                   +-----------------<---------------------+ |
   |   +---------------------------------------------------------+
   |   +-+----------------------+-+------------------------------->
   |     +-> partition-clause --+ |
   +> store-lists-clause ---------+

  partition-updatable-clause =

  ---> PARTITIONING IS -+-> NOT UPDATABLE -+-->
                        +-> UPDATABLE -----+

  threshold-clause =

  --+-> THRESHOLD -+-> IS -+-> ( --> <val1> --> ) ---------+->
    |              +-> OF -+                               |
    |                                                      |
    +-> THRESHOLDS -+-> ARE -+-----------+                 |
                    +-> OF  -+           |                 |
      +----------------------------------+                 |
      +-> ( --> <val1> -+---------------------------+-> ) -+
                        +-> , <val2> -+-------------+
                                      +-> , <val3> -+

  partition-clause =

  -+> STORE -+------------------++--------------------+> store-clause -+>
   |         +> columns-clause -++> store-attributes -+                |
   +------------------------------- <----------------------------------+

  columns-clause =

  -> COLUMNS --> ( -+-> <column-name> -+-> ) -->
                    +-------- , <------+

  store-attributes =

  --+-+-+-> ENABLE --+-> COMPRESSION -+-+-->
    | | +-> DISABLE -+                | |
    | +-> thresholds-clause ----------+ |
    | +-> VERTICAL PARTITION <name> --+ |
    +--------------- <------------------+

  store-clause =

  ---+-> IN area-spec ------------------------+-->
     +-> across-clause -----------------------+
     +-> using-clause ------------------------+

  area-spec =

  --> <area-name> -+---------------------------------------------------+->
                   +-> ( -++-> threshold-clause ---------------++-> ) -+
                          |+-> LOGGING ------------------------+|
                          |+-> NOLOGGING ----------------------+|
                          |+-> PARTITION <name> ---------------+|
                          |+-> COMMENT IS -+--> 'string' ---+--+|
                          |                +------- / <-----+   |
                          +---------------- ,  -----------------+

  across-clause =

  ---> RANDOMLY ACROSS ---+
   +----------------------+
   +-> ( -+> area-spec --+--> ) -->
          +----- , <-----+

  using-clause =

  ---> USING ---> (  -+-> <column-name> -+-> ) ------------------+
                      +-------- , <------+                       |
  +--------------------------------------------------------------+
  ++-> IN area-spec -> WITH LIMIT OF --> ( +-> <literal> -+> ) +-+
   |                                       +------ , <----+    | |
   +--------------------------<--------------------------------+ |
   +--------------------------<----------------------------------+
   ++------------------------------------------------+------------->
    +> OTHERWISE IN area-spec -----------------------+

  store-lists-clause =

  --->  STORE LISTS ---+
    +------------------+
    +-+->  IN -+-> area-spec ---------------+---+----------->
      |        +-> ( +> area-spec -> ) ----++   |
      |              +------ , <-----------+    |
      | +---------------------------------------+
      | +-+------------------------>-----------------------+
      |   +-> FOR -> ( -+-> <table-name> ---------+-> ) -+ |
      |                 +-> <table-name.col-name> +      | |
      |                 +-------- , <-------------+      | |
      |           +--------------------------------------+ |
      |           +---+------------>----------+------------+
      |               +-> FILL RANDOMLY  -----+            |
      |               +-> FILL SEQUENTIALLY --+            |
      +----------------------------<-----------------------+

17.3  –  Arguments

17.3.1  –  across-clause

    Associates the table with two or more storage areas.

17.3.2  –  COMMENT IS 'string'

    Adds a comment about the storage map. SQL displays the text of
    the comment when it executes a SHOW STORAGE MAPS statement.
    Enclose the comment in single quotation marks (') and separate
    multiple lines in a comment with a slash mark (/).

17.3.3  –  COMPRESSION option

    Syntax options:

    ENABLE COMPRESSION | DISABLE COMPRESSION

    Specifies whether the rows for the partition are compressed or
    uncompressed when stored. You can enable or disable compression
    on each vertical partition. You enable compression to conserve
    disk space, but there is a small CPU overhead for inserting and
    retrieving compressed rows.

    If you omit this clause, the default compression is that which
    was specified for the storage map before the first STORE COLUMNS
    clause. The default is ENABLE COMPRESSION.

17.3.4  –  FILL

    Syntax options:

    FILL RANDOMLY | FILL SEQUENTIALLY

    Specifies whether to fill the area set randomly or sequentially.
    Specifying FILL RANDOMLY or FILL SEQUENTIALLY requires a FOR
    clause. When a storage area is filled, it is removed from the
    list of available areas. Oracle Rdb does not attempt to store
    any more lists in that area during the current database attach.
    Instead, Oracle Rdb starts filling the next specified area.

    When a set of areas is filled sequentially, Oracle Rdb stores
    lists in the first specified area until that area is filled.

    If the set of areas is filled randomly, lists are stored
    across multiple areas. This is the default. Random filling is
    intended for read/write media, which will benefit from the I/O
    distribution across the storage areas.

    The keywords FILL RANDOMLY and FILL SEQUENTIALLY can only be
    applied to areas contained within an area list.

17.3.5  –  FOR (table name)

    Specifies the table or tables to which this list storage map
    applies. The named table must already be defined. If you want to
    store lists of more than one table in the storage area, separate
    the names of the tables with commas. For each area, you can
    specify one FOR clause and list of table names.

17.3.6  –  FOR (table name.col name)

    Specifies the name of the table and column containing the list
    to which this storage map applies. Separate the table name and
    the column name with a period (.).  The named table and column
    must already be defined. If you want to store multiple lists
    in the storage area, separate the table name and column name
    combinations with commas. For each area, you can specify one FOR
    clause and a list of column names.

17.3.7  –  LOGGING

    Syntax options:

    LOGGING | NOLOGGING

    The LOGGING clause specifies that rows written to the table
    during the current transaction (the transaction in which this
    table was created) be logged when written to the database.
    Logging includes writing data and management records to the
    recovery-unit journal file (.ruj) and after-image journal files
    (.aij). When the NOLOGGING clause is specified then only a small
    number of management records are logged in the recovery-unit
    journal file (.ruj) and after-image journal files (.aij). See the
    Usage Notes below for more information.

    LOGGING and NOLOGGING can be specified per storage area
    (partition) or as a default for the CREATE STORAGE MAP statement.
    The LOGGING and NOLOGGING clauses are mutually exclusive; specify
    only one. The LOGGING clause is the default.

17.3.8  –  OTHERWISE_IN

    For partitioned storage maps only, specifies the storage area
    that is used as the overflow partition. An overflow partition is
    a storage area that holds any values that are higher than those
    specified in the WITH LIMIT OF clause. An overflow partition
    holds those values that exceed the highest specified limits.

17.3.9  –  partition-clause

    Defines vertical partitioning, horizontal partitioning, or both
    for the specified table.

    Horizontal partitioning means that you divide the rows of the
    table among storage areas according to data values in one or more
    columns. Vertical partitioning means that you divide the columns
    of the table among storage areas. A given storage area will then
    contain only some of the columns of a table. You can combine both
    horizontal and vertical partitions in a single map.

    Vertical partitioning reduces disk I/O operations by placing
    frequently used data in one area, so that you can read and update
    those portions of the table in a single disk I/O operation.

    See the Oracle Rdb Guide to Database Design and Definition for
    more information regarding partitioning.

17.3.10  –  PARTITION name

    Names the partition. The name can be a delimited identifier if
    the dialect or quoting rules are set to SQL92 or SQL99. Partition
    names must be unique within the storage map. If you do not
    specify this clause, Oracle Rdb generates a default name for
    the partition.

17.3.11  –  PARTITIONING_IS_NOT_UPDATABLE

    Specifies that the value of the partitioning key cannot be
    modified and that the row is always stored in the storage area
    based on the partitioning criteria in the STORE USING clause. The
    partitioning key is the column or list of columns specified in
    the STORE USING clause.

    Specifying the PARTITIONING IS NOT UPDATABLE clause allows Oracle
    Rdb to quickly retrieve data because the partitioning criteria
    can be used when optimizing the query.

    To update columns that are partitioning keys in a NOT UPDATABLE
    storage map, you must delete the rows and then reinsert the rows
    to ensure that they are placed in the correct location.

    If you specify the PARTITIONING clause, you must also specify the
    STORE USING clause when defining a storage map.

    If the PARTITIONING clause is not specified, UPDATABLE is the
    default.

    See the Oracle Rdb Guide to Database Design and Definition for
    more information regarding partitioning.

17.3.12  –  PARTITIONING_IS_UPDATABLE

    Specifies that the partitioning key can be modified. The
    partitioning key is the column or list of columns specified in
    the STORE USING clause.

    If you modify a row in an UPDATABLE storage map, the row is not
    moved to a different storage area even if the new value of the
    partitioning key is not within the limits of original storage
    area. As a result, Oracle Rdb must consider all storage areas
    specified in the STORE USING clause when retrieving a row.

    If you specify the PARTITIONING clause, you must also specify the
    STORE USING clause when defining a storage map.

    If the PARTITIONING clause is not specified, UPDATABLE is the
    default.

    See the Oracle Rdb Guide to Database Design and Definition for
    more information regarding partitioning.

17.3.13  –  PLACEMENT_VIA_INDEX

    Directs the database system to store a column in a way that
    optimizes access to that column by the indicated path. Oracle Rdb
    chooses a target page for any columns being stored by rules that
    take into account the type of index named (sorted or hashed),
    the type of storage areas involved (uniform or mixed), and how
    indexes and tables are assigned to storage areas.

    For a hashed index, Oracle Rdb calculates the page containing
    the hashed index node that points to the column. If that page is
    within the same storage area in which the column will be stored,
    it is used as the target page for storing the column. If that
    page is not within the same storage area in which the column
    is to be stored, Oracle Rdb chooses a target page in the same
    relative position within the appropriate storage area (if it is a
    mixed storage area) or a page in a clump reserved for that table
    (if it is a uniform storage area).

    For a sorted index, Oracle Rdb finds the database key of the next
    lowest row to the one being stored and uses the page number in
    the database key as the target page.

17.3.14  –  STORAGE_MAP

    Specifies the name of the storage map you want to create. The
    name cannot be the same as any other definition in the database.

17.3.15  –  store-clause

    The storage map definition. The store-clause in a CREATE STORAGE
    MAP statement lets you specify which storage area files are used
    to store rows from the table.

    o  All rows of a table can be associated with a single storage
       area.

    o  Rows of a table can be randomly distributed among several
       storage areas.

    o  Rows of a table can be systematically distributed, or
       partitioned, among several storage areas by specifying upper
       limits on the values for a column in a particular storage
       area. This is called horizontal partitioning.

    o  Columns of a table can be partitioned among storage areas.
       This is called vertical partitioning.

    If you omit the storage map definition, the default is to store
    all the rows for a table in the default storage area. See the
    CREATE and IMPORT DATABASE statements for information on the
    default storage area.

17.3.16  –  STORE_COLUMNS

    Syntax option:

    STORE COLUMNS (column-name)

    Lists the columns which will be stored in the subsequent map.

    Multiple STORE COLUMNS clauses may appear in a map to spread
    across multiple storage areas. A column name may only appear
    in one STORE COLUMNS clause. A final STORE clause can appear to
    provide a location for all remaining unspecified columns.

17.3.17  –  STORE IN area name

    Associates the table directly with a single storage area. All
    rows in the table are stored in the area you specify.

17.3.18  –  STORE_LISTS_IN

    Directs the database system to store the lists from tables in a
    specified storage area or in a set of areas. You can create only
    one storage map for lists within each database.

    You must specify the default storage area for lists in the STORE
    LISTS clause. The default list storage area contains lists from
    system tables as well as lists not directed elsewhere by the
    STORE LISTS clause. You can also use the LIST STORAGE AREA clause
    of the CREATE DATABASE statement to specify a default storage
    area for lists. If you do not use the STORE LISTS clause and do
    not specify a list storage area in the CREATE DATABASE statement,
    Oracle Rdb uses the default storage area as the default list
    storage area. The following example directs Oracle Rdb to place
    all lists in the LISTS storage area unless otherwise specified in
    a storage map:

    SQL> CREATE DATABASE FILENAME mf_personnel
    SQL> LIST STORAGE AREA IS LISTS
    SQL> CREATE STORAGE AREA LISTS;

    The accompanying storage map statement must also specify the
    LISTS storage area as the default storage area.

    SQL> CREATE STORAGE MAP LISTS_MAP
    cont> STORE LISTS IN LISTS1 FOR (EMPLOYEES.RESUME)
    cont>             IN LISTS;

    You can use an area set to specify that data is to be distributed
    across several areas. The following example shows how you can
    store data in three storage areas (LISTS1, LISTS2, and LISTS3)
    for two different columns in TABLE1. The default list storage
    area is LISTS1.

    CREATE STORAGE MAP LISTS_MAP
           STORE LISTS IN (LISTS1,LISTS2,LISTS3) FOR (TABLE1.COL1,TABLE1.COL2)
           IN LISTS1;

    You can store lists from different tables in the same area. The
    following example shows how you can store data from TABLE1,
    TABLE2, and TABLE3 in the LISTS storage area. The default list
    storage area is RDB$SYSTEM.

    SQL> CREATE STORAGE MAP LISTS_MAP  -- to direct the list data to area LISTS
    cont>  STORE LISTS IN LISTS FOR (TABLE1, TABLE2, TABLE3)
    cont>     IN RDB$SYSTEM;

    Alternatively, you can store lists from each table in unique
    areas. The following example shows list data from TABLE1 being
    stored in the LISTS1 storage area and list data from TABLE2 being
    stored in the LISTS2 storage area. The default list storage area
    is RDB$SYSTEM.

    CREATE STORAGE MAP LISTS_MAP
           STORE LISTS IN LIST1 FOR (TABLE1)
                       IN LIST2 FOR (TABLE2)
                       IN RDB$SYSTEM;

    You can also specify that different columns from the same table
    go into different areas. The following example shows data from
    different columns in TABLE1 being stored in either LISTS1 or
    LISTS2. The default list storage area is RDB$SYSTEM.

    CREATE STORAGE MAP LISTS_MAP
           STORE LISTS IN LISTS1 FOR (TABLE1.COL1)
                       IN LISTS2 FOR (TABLE1.COL2)
                       IN RDB$SYSTEM;

17.3.19  –  STORE_RANDOMLY_ACROSS

    Syntax option:

    STORE RANDOMLY ACROSS (area-name)

    As rows are inserted in the table, they are distributed randomly
    across the storage areas named in the list. You must name at
    least two storage areas in this clause.

17.3.20  –  STORE_USING

    Syntax option:

    STORE USING (column-name) IN area-name

    The database system compares values in the columns to the values
    in the WITH LIMIT OF clause to determine placement of rows
    inserted into the table. See the Oracle Rdb SQL Reference Manual
    for further information.

    Use RMU EXTRACT to have the store using expression expanded. See
    Example 9.

17.3.21  –  STORED_NAME

    Specifies a name that Oracle Rdb uses to access a storage map
    created in a multischema database. The stored name allows you
    to access multischema definitions using interfaces that do not
    recognize multiple schemas in one database. You cannot specify a
    stored name for a storage map in a database that does not allow
    multiple schemas. For more information on stored names, see the
    User_Supplied_Names HELP topic.

17.3.22  –  THRESHOLD clause

    Specifies one, two, or three default threshold values for logical
    areas in storage areas with uniform format pages. The threshold
    values (val1, val2, and val3) represent a fullness percentage on
    a data page and establish three possible ranges of guaranteed
    free space on the data pages. When a data page reaches the
    percentage defined by a given threshold value, the space area
    management (SPAM) entry for the data page is updated to reflect
    the new fullness percentage and its remaining free space.

    Oracle Rdb never stores a record at the third threshold. The
    value you set for the highest threshold can be used to reserve
    space on the page for future record growth.

    When only val1 is specified, this is equivalent to (val1, 100,
    100). When val1 and val2 are specified, this is equivalent to
    (val1, val2, 100). The trailing, unspecified thresholds default
    to 100 percent. For example, THRESHOLDS ARE (40) would appear as
    (40, 100, 100).

    If no thresholds are specified for the area, the default is
    (0,0,0). This causes the SPAM algorithm to set thresholds based
    on the nominal record length for the logical area; for example,
    the node size for the index or the uncompressed length of the row
    for a table.

    You cannot specify the thresholds for the storage map attribute
    for any area that is a mixed page format. If you have a mixed
    page format, set the thresholds for the storage area using the
    ADD STORAGE AREA or CREATE STORAGE AREA clause of the ALTER
    DATABASE, CREATE DATABASE, or IMPORT statements.

17.3.23  –  VERTICAL PARTITION name

    Names a vertical partition. The name can be a delimited
    identifier if the dialect or quoting rules are set to SQL92 or
    SQL99. Partition names must be unique within the storage map. If
    you do not specify this clause, Oracle Rdb generates a default
    name for the partition.

17.3.24  –  using-clause

    Specifies columns whose values are used as limits for
    partitioning the table horizontally across multiple storage
    areas.

17.3.25  –  WITH_LIMIT_OF

    Specifies the maximum values that the columns named in the USING
    clause can have when rows are initially stored in the specified
    storage area. Repeat this clause to partition the rows of a table
    among multiple storage areas.

    The number of literals listed must be the same as the number of
    columns in the USING clause. The data type of the literals must
    agree with the data type of the column. For character columns,
    enclose the literals in single quotation marks.

    The values in the WITH LIMIT OF clause only affect placement of
    rows when they are initially stored. If UPDATE statements change
    data in a row so that values in columns named in the USING clause
    exceed values specified in the WITH LIMIT OF clause, the row is
    not moved into a different storage area.

17.4  –  Examples

    Example 1: Defining storage maps for a multifile database

    This example shows the definition of storage maps for a multifile
    database. The tables named in the CREATE STORAGE MAP statements
    have the same definitions as those in the sample database.
    See the CREATE STORAGE_AREA clause for an example of a CREATE
    DATABASE statement with CREATE STORAGE AREA clauses that create
    the storage areas referred to in this example.

    SQL> -- Declare the database as the default:
    SQL> ATTACH 'FILENAME multifile_example';
    SQL> --
    SQL> CREATE STORAGE MAP EMPLOYEE_MAP FOR EMPLOYEES
    cont> STORE USING (EMPLOYEE_ID)
    cont>   IN EMPID_LOW WITH LIMIT OF ('00200')
    cont>   IN EMPID_MID WITH LIMIT OF ('00500')
    cont>   OTHERWISE IN EMPID_OVER;
    SQL> --
    SQL> CREATE STORAGE MAP RESUME_MAP
    cont> STORE LISTS IN EMP_INFO FOR (TABLE1, TABLE2, TABLE3)
    cont>       IN RDB$SYSTEM;
    SQL> --
    SQL> CREATE STORAGE MAP JOB_HISTORY_MAP FOR JOB_HISTORY
    cont> STORE IN HISTORIES;
    SQL> --
    SQL> CREATE STORAGE MAP SALARY_HISTORY_MAP FOR SALARY_HISTORY
    cont> STORE IN HISTORIES;
    SQL> --
    SQL> CREATE STORAGE MAP JOBS_MAP FOR JOBS
    cont> STORE IN CODES;
    SQL> --
    SQL> CREATE STORAGE MAP DEPARTMENTS_MAP FOR DEPARTMENTS
    cont> STORE IN CODES;
    SQL> --
    SQL> CREATE STORAGE MAP COLLEGES_MAP FOR COLLEGES
    cont> STORE IN CODES;
    SQL> --
    SQL> CREATE STORAGE MAP DEGREES_MAP FOR DEGREES
    cont> STORE IN EMP_INFO;
    SQL> --
    SQL> CREATE STORAGE MAP WORK_STATUS_MAP FOR WORK_STATUS
    cont> STORE IN HISTORIES;
    SQL> --
    SQL> --
    SQL> -COMMIT;
    SQL> --

    Example 2: Defining storage maps that place and override
    thresholds on uniform storage areas

    SQL> CREATE DATABASE FILENAME birdlist
    cont>     CREATE STORAGE AREA AREA1
    cont>     CREATE STORAGE AREA AREA2
    cont>     CREATE STORAGE AREA AREA3
    cont>     CREATE STORAGE AREA AREA4
    cont>     CREATE TABLE SPECIES
    cont>       ( GENUS          CHAR (30),
    cont>         SPECIES        CHAR (30),
    cont>         COMMON_NAME    CHAR (40),
    cont>         FAMILY_NUMBER  INT (3),
    cont>         SPECIES_NUMBER INT (3)
    cont>       )
    cont>     CREATE INDEX I1 ON SPECIES (FAMILY_NUMBER)
    cont>     CREATE TABLE SIGHTING
    cont>       ( SPECIES_NUMBER INT (3),
    cont>         COMMON_NAME    CHAR (40),
    cont>         CITY           CHAR (20),
    cont>         STATE          CHAR (20),
    cont>         SIGHTING_DATE  DATE ANSI,
    cont>         NOTES_NUMBER   INT (5))
    cont>     CREATE INDEX I2 ON SIGHTING (SPECIES_NUMBER)
    cont>     CREATE TABLE FIELD_NOTES
    cont>       ( WEATHER        CHAR (30),
    cont>         TIDE           CHAR (15),
    cont>         SPECIES_NUMBER INT (3),
    cont>         SIGHTING_TIME  TIMESTAMP(2),
    cont>         NOTES          CHAR (500),
    cont>         NOTES_NUMBER   INT (5))
    cont>     CREATE INDEX I3 ON FIELD_NOTES (NOTES_NUMBER)
    cont> ;
    SQL> --
    SQL> -- The following CREATE STORAGE MAP statements place and
    SQL> -- override thresholds on uniform storage area.
    SQL> --
    SQL> -- Note that the default threshold clause for the
    SQL> -- storage map is not enclosed in parentheses, but each
    SQL> -- threshold clause associated with a particular area is.
    SQL> --
    SQL> CREATE STORAGE MAP M1 FOR SPECIES
    cont>     THRESHOLDS ARE (30, 50, 80)
    cont>     ENABLE COMPRESSION
    cont>     PLACEMENT VIA INDEX I1
    cont>     STORE
    cont>         IN AREA1
    cont>             (THRESHOLD (10) );
    SQL> --
    SQL> CREATE STORAGE MAP M2 FOR SIGHTING
    cont>   THRESHOLD IS (40)
    cont>     STORE
    cont>   RANDOMLY ACROSS (
    cont>       AREA1 (THRESHOLD OF (10) ),
    cont>       AREA2 (THRESHOLDS ARE (30, 50, 98) ),
    cont>       AREA3
    cont>   );
    SQL> --
    SQL> CREATE STORAGE MAP M3 FOR FIELD_NOTES
    cont>   THRESHOLDS OF (50,70,90)
    cont>     STORE
    cont>       USING (SPECIES_NUMBER, NOTES_NUMBER)
    cont>           IN AREA1
    cont>               (THRESHOLDS OF (20, 80, 90) )
    cont>               WITH LIMIT OF (30, 88)
    cont>           IN AREA2
    cont>               WITH LIMIT OF (40, 89)
    cont>           IN AREA3
    cont>               WITH LIMIT OF (50, 90)
    cont>           OTHERWISE IN AREA4
    cont>               (THRESHOLDS ARE (20, 30, 40));
    SQL> --
    SQL> SHOW STORAGE MAP *;
    User Storage Maps in database with filename birdlist
         M1
     For Table:  SPECIES
     Placement Via Index: I1
     Partitioning is: UPDATABLE
     Store clause:  STORE
            IN AREA1
                (THRESHOLD (10) )

     Partition information for storage map:
     Compression is: ENABLED
      Partition: (1) SYS_P00062
       Storage Area: AREA1

         M2
     For Table:  SIGHTING
     Partitioning is: UPDATABLE
     Store clause:  STORE
      RANDOMLY ACROSS (
          AREA1 (THRESHOLD OF (10) ),
          AREA2 (THRESHOLDS ARE (30, 50, 98) ),
          AREA3
      )

     Partition information for storage map:
     Compression is: ENABLED
      Partition: (1) SYS_P00063
       Storage Area: AREA1
      Partition: (2) SYS_P00064
       Storage Area: AREA2
      Partition: (3) SYS_P00065
       Storage Area: AREA3

         M3
     For Table:  FIELD_NOTES
     Partitioning is: UPDATABLE
     Store clause:  STORE
          USING (SPECIES_NUMBER, NOTES_NUMBER)
              IN AREA1
                  (THRESHOLDS OF (20, 80, 90) )
                  WITH LIMIT OF (30, 88)
              IN AREA2
                  WITH LIMIT OF (40, 89)
              IN AREA3
                  WITH LIMIT OF (50, 90)
              OTHERWISE IN AREA4
                  (THRESHOLDS ARE (20, 30, 40))

     Partition information for storage map:
     Compression is: ENABLED
      Partition: (1) SYS_P00066
       Storage Area: AREA1
      Partition: (2) SYS_P00067
       Storage Area: AREA2
      Partition: (3) SYS_P00068
       Storage Area: AREA3
      Partition: (4) SYS_P00069
       Storage Area: AREA4

    SQL> --
    SQL> ROLLBACK;

    Example 3: Creating a storage map that stores lists

    This example creates a storage map that stores lists on specific
    storage areas.

    SQL> CREATE DATABASE FILENAME test
    cont> CREATE STORAGE AREA LISTS1 PAGE FORMAT IS MIXED
    cont> CREATE STORAGE AREA LISTS2 PAGE FORMAT IS MIXED
    cont>
    cont> CREATE TABLE EMPLOYEES
    cont>    (EMP_ID CHAR(5),
    cont>     RESUME LIST OF BYTE VARYING);
    SQL> --
    SQL>  CREATE STORAGE MAP LISTS_MAP
    cont>     STORE LISTS IN
    cont>     (LISTS1,LISTS2) FOR (EMPLOYEES.RESUME)
    cont>      FILL SEQUENTIALLY
    cont>      IN RDB$SYSTEM;

    Example 4: Creating an alternate map

    This example following storage map shows an alternate mapping for
    the EMPLOYEES table in the same MF_PERSONNEL database.

    SQL> create storage map EMPLOYEES_MAP
    cont>     for EMPLOYEES
    cont>     placement via index EMPLOYEES_HASH
    cont>     -- store the primary information horizontally partitioned
    cont>     -- across the areas EMPIDS_LOW, EMPIDS_MID and EMPIDS_OVER
    cont>     -- disable compress because these columns are accessed often
    cont>     store
    cont>         columns (EMPLOYEE_ID, LAST_NAME,
    cont>                   FIRST_NAME, MIDDLE_INITIAL)
    cont>         disable compression
    cont>         using (EMPLOYEE_ID)
    cont>             in EMPIDS_LOW
    cont>                 with limit of ('00200')
    cont>             in EMPIDS_MID
    cont>                 with limit of ('00400')
    cont>             otherwise in EMPIDS_OVER
    cont>
    cont>     -- place all the address information in EMP_INFO
    cont>     -- make sure these character columns are compressed
    cont>     -- to remove the trailing spaces
    cont>     store
    cont>         columns (ADDRESS_DATA_1, ADDRESS_DATA_2, CITY, STATE,
    cont>                  POSTAL_CODE)
    cont>         enable compression
    cont>         in EMP_INFO
    cont>
    cont>     -- the remaining columns get
    cont>     -- written randomly over these areas
    cont>     store
    cont>         enable compression
    cont>         randomly across (SALARY_HISTORY, JOBS);

    Example 5: Disabling logging and naming horizontal and vertical
    partitions

    SQL> CREATE DATABASE FILENAME birdlist
    cont>     CREATE STORAGE AREA AREA1
    cont>     CREATE STORAGE AREA AREA2
    cont>     CREATE STORAGE AREA AREA3
    cont>     CREATE STORAGE AREA AREA4
    cont>     CREATE STORAGE AREA AREA5
    cont>     CREATE STORAGE AREA AREA6
    cont>     CREATE STORAGE AREA AREA7
    cont>     CREATE STORAGE AREA AREA8
    cont>     CREATE TABLE SPECIES
    cont>   ( GENUS          CHAR (30),
    cont>     SPECIES        CHAR (30),
    cont>     COMMON_NAME    CHAR (40),
    cont>     FAMILY_NUMBER  INT (3),
    cont>     SPECIES_NUMBER INT (3)
    cont>   )
    cont>     CREATE INDEX I1 ON SPECIES (FAMILY_NUMBER)
    cont>     CREATE TABLE SIGHTING
    cont>   ( SPECIES_NUMBER INT (3),
    cont>     COMMON_NAME    CHAR (40),
    cont>     CITY  CHAR (20),
    cont>     STATE CHAR (20),
    cont>     SIGHTING_DATE  DATE ANSI,
    cont>     NOTES_NUMBER INT (5))
    cont>     CREATE INDEX I2 ON SIGHTING (SPECIES_NUMBER)
    cont>     CREATE TABLE FIELD_NOTES
    cont>   ( WEATHER CHAR (30),
    cont>     TIDE CHAR (15),
    cont>     SIGHTING_TIME TIMESTAMP(2),
    cont>     NOTES CHAR (500),
    cont>     NOTES_NUMBER INT (5),
    cont>     SPECIES_NUMBER INT (3))
    cont>     CREATE INDEX I3 ON FIELD_NOTES (NOTES_NUMBER);
    SQL> --
    SQL> -- Note that the default threshold clause for the
    SQL> -- storage map is not enclosed in parentheses, but each
    SQL> -- threshold clause associated with a particular area is enclosed
    SQL> -- in parentheses.
    SQL> --
    SQL> CREATE STORAGE MAP M1 FOR SPECIES
    cont>     THRESHOLDS ARE (30, 50, 80)
    cont>     ENABLE COMPRESSION
    cont>     PLACEMENT VIA INDEX I1
    cont>     NOLOGGING
    cont>     COMMENT IS 'Storage Map for Species'
    cont>     STORE
    cont>   IN AREA1
    cont>       (THRESHOLD (10),
    cont>        PARTITION AREA1,
    cont>        COMMENT IS 'Partition is AREA1');
    SQL> --
    SQL> CREATE STORAGE MAP M2 FOR SIGHTING
    cont>   THRESHOLD IS (40)
    cont>     STORE
    cont>   RANDOMLY ACROSS (
    cont>       AREA1 (THRESHOLD OF (10),
    cont>       PARTITION AREA1),
    cont>       AREA2 (THRESHOLDS ARE (30, 50, 98),
    cont>       PARTITION AREA2),
    cont>       AREA3 (PARTITION AREA3)
    cont>   );
    SQL> --
    SQL> CREATE STORAGE MAP M3 FOR FIELD_NOTES
    cont>   THRESHOLDS OF (50,70,90)
    cont>     STORE COLUMNS (WEATHER, TIDE, SIGHTING_TIME)
    cont>     VERTICAL PARTITION WEATHER_TIDE_SIGHTINGTIME
    cont>   USING (SPECIES_NUMBER, NOTES_NUMBER)
    cont>       IN AREA1
    cont>           (THRESHOLDS OF (20, 80, 90) )
    cont>           WITH LIMIT OF (30, 88)
    cont>       IN AREA2
    cont>           WITH LIMIT OF (40, 89)
    cont>       IN AREA3
    cont>           WITH LIMIT OF (50, 90)
    cont>       OTHERWISE IN AREA4
    cont>           (THRESHOLDS ARE (20, 30, 40))
    cont>   STORE COLUMNS (NOTES, NOTES_NUMBER, SPECIES_NUMBER)
    cont>    VERTICAL PARTITION NOTES_NOTESNUM_SPECIESNUM
    cont>    USING (SPECIES_NUMBER)
    cont>       IN AREA5
    cont>           (THRESHOLDS OF (20, 80, 90) )
    cont>           WITH LIMIT OF (30)
    cont>       IN AREA6
    cont>           WITH LIMIT OF (40)
    cont>       IN AREA7
    cont>           WITH LIMIT OF (50)
    cont>       OTHERWISE IN AREA8
    cont>           (THRESHOLDS ARE (20, 30, 40));

    Example 6: Creating a storage map for a table containing data

    SQL> -- Create table, insert data, and then create a storage map.
    SQL> --
    SQL> CREATE TABLE MAP_TEST2 (a INTEGER, b CHAR(10));
    SQL> INSERT INTO MAP_TEST2 (a, b) VALUES (2, 'Second');
    1 row inserted
    SQL> CREATE STORAGE MAP MAP_TEST2_MAP FOR MAP_TEST2
    cont>     STORE IN RDB$SYSTEM;
    SQL> INSERT INTO MAP_TEST2 (a, b) VALUES (22, 'Second2');
    1 row inserted
    SQL> COMMIT;
    SQL> SELECT *,DBKEY FROM MAP_TEST2;
               A   B                             DBKEY
               2   Second                     90:809:0
              22   Second2                    90:809:1
    2 rows selected
    SQL>
    SQL> -- Now alter the storage map and
    SQL> -- place it in a different storage area.
    SQL>
    SQL> ALTER STORAGE MAP MAP_TEST2_MAP
    cont>     STORE IN TEST_AREA2;
    SQL> COMMIT;
    SQL> SELECT *,DBKEY FROM MAP_TEST2;
               A   B                             DBKEY
               2   Second                      91:11:0
              22   Second2                     91:11:1
    2 rows selected
    SQL>

    Example 7: Invalid attempts to create a storage map

    SQL> -- Create table, insert data, and then
    SQL> -- create a storage map with invalid attributes.
    SQL>
    SQL> CREATE TABLE MAP_TEST3 (a INTEGER, b CHAR(10));
    SQL> CREATE INDEX MAP_TEST3_INDEX ON MAP_TEST3 (a);
    SQL> INSERT INTO MAP_TEST3 (a, b) VALUES (3, 'Third');
    1 row inserted
    SQL>
    SQL> CREATE STORAGE MAP MAP_TEST3_MAP FOR MAP_TEST3
    cont>     STORE IN TEST_AREA1;            -- Must be the default area.
    %RDB-E-NO_META_UPDATE, metadata update failed
    -RDMS-F-RELNOTEMPTY, table "MAP_TEST3" has data in it
    -RDMS-E-NOCMPLXMAP, can not use complex map for non-empty table
    SQL>
    SQL> CREATE STORAGE MAP MAP_TEST3_MAP for MAP_TEST3
    cont>     PLACEMENT VIA INDEX MAP_TEST3_INDEX   -- Can't use placement.
    cont>     STORE IN RDB$SYSTEM;
    %RDB-E-NO_META_UPDATE, metadata update failed
    -RDMS-F-RELNOTEMPTY, table "MAP_TEST3" has data in it
    -RDMS-E-NOCMPLXMAP, can not use complex map for non-empty table
    SQL>
    SQL> CREATE STORAGE MAP MAP_TEST3_MAP FOR MAP_TEST3
    cont>     DISABLE COMPRESSION               -- Can't change compression.
    cont>     STORE IN RDB$SYSTEM;
    %RDB-E-NO_META_UPDATE, metadata update failed
    -RDMS-F-RELNOTEMPTY, table "MAP_TEST3" has data in it
    -RDMS-E-NOCMPLXMAP, can not use complex map for non-empty table
    SQL>
    SQL> CREATE STORAGE MAP MAP_TEST3_MAP for MAP_TEST3
    cont>     THRESHOLDS ARE (50, 60, 70)        -- Can't change thresholds.
    cont>     STORE IN RDB$SYSTEM;
    %RDB-E-NO_META_UPDATE, metadata update failed
    -RDMS-F-RELNOTEMPTY, table "MAP_TEST3" has data in it
    -RDMS-E-NOCMPLXMAP, can not use complex map for non-empty table
    SQL>
    SQL> CREATE STORAGE MAP MAP_TEST3_MAP FOR MAP_TEST3
    cont>     STORE ACROSS (RDB$SYSTEM, TEST_AREA2);-- Can't use more than one area.
    %RDB-E-NO_META_UPDATE, metadata update failed
    -RDMS-F-RELNOTEMPTY, table "MAP_TEST3" has data in it
    -RDMS-E-NOCMPLXMAP, can not use complex map for non-empty table
    SQL>
    SQL> CREATE STORAGE MAP MAP_TEST3_MAP for MAP_TEST3
    cont>     STORE COLUMNS (a) in RDB$SYSTEM       -- Can't vertically partition.
    cont>     STORE COLUMNS (b) in TEST_AREA2;
    %RDB-E-NO_META_UPDATE, metadata update failed
    -RDMS-F-RELNOTEMPTY, table "MAP_TEST3" has data in it
    -RDMS-E-NOCMPLXMAP, can not use complex map for non-empty table

    Example 8: Using the RMU Extract command to display WITH LIMIT OF
    expressions

    The WITH LIMIT OF clauses of the STORE clause are converted
    to Boolean expressions that are used by Oracle Rdb to direct
    inserted data to the correct storage area. You can use the RMU
    Extract command to display these Boolean expressions. Use the
    Item=STORAGE_MAP and Option=FULL qualifiers as shown in the
    following example.

    $ RMU/EXTRACT-
    _$ /ITEM=STORAGE_MAP-
    _$ /OPTION=(MATCH:EMPLOYEES_MAP%,NOHEADER,FULL,FILENAME_ONLY) -
    _$ DB$:MF_PERSONNEL
    set verify;
    set language ENGLISH;
    set default date format 'SQL92';
    set quoting rules 'SQL92';
    set date format DATE 001, TIME 001;
    attach 'filename MF_PERSONNEL.RDB';
    create storage map EMPLOYEES_MAP
        for EMPLOYEES
        comment is
          ' employees partitioned by "00200" "00400"'
        placement via index EMPLOYEES_HASH
        store
            using (EMPLOYEE_ID)
            -- Partition:
            --        (EMPLOYEE_ID <= '00200')
                in EMPIDS_LOW
                    with limit of ('00200')
            -- Partition:
            --        (EMPLOYEE_ID <= '00400')
                in EMPIDS_MID
                    with limit of ('00400')
                otherwise in EMPIDS_OVER;

    commit work;

    Example 9: SQL Mapping Routine

    This example shows the SQL mapping routine created by the CREATE
    STORAGE MAP statement that matches the WITH LIMIT OF clause for
    the storage map.

    SQL> create table EMPLOYEES (
    cont>     EMPLOYEE_ID      CHAR (5),
    cont>     LAST_NAME        CHAR (14),
    cont>     FIRST_NAME       CHAR (10),
    cont>     MIDDLE_INITIAL   CHAR (1),
    cont>     ADDRESS_DATA_1   CHAR (25),
    cont>     ADDRESS_DATA_2   CHAR (25),
    cont>     CITY             CHAR (20),
    cont>     STATE            CHAR (2),
    cont>     POSTAL_CODE      CHAR (5),
    cont>     SEX              CHAR (1),
    cont>     BIRTHDAY         DATE VMS,
    cont>     STATUS_CODE      CHAR (1));
    SQL>
    SQL>     create storage map EMPLOYEES_MAP
    cont>         for EMPLOYEES
    cont>         comment is
    cont>           ' employees partitioned by "00200" "00400"'
    cont>         store
    cont>             using (EMPLOYEE_ID)
    cont>                 in EMPIDS_LOW
    cont>                     with limit of ('00200')
    cont>                 in EMPIDS_MID
    cont>                     with limit of ('00400')
    cont>                 otherwise in EMPIDS_OVER;
    SQL>
    SQL> commit work;
    SQL>
    SQL> show system modules;
    Modules in database with filename MF_PERSONNEL
         RDB$STORAGE_MAPS
    SQL>
    SQL> show system functions;
    Functions in database with filename MF_PERSONNEL
         EMPLOYEES_MAP
    SQL>
    SQL> show system function EMPLOYEES_MAP;
    Information for function EMPLOYEES_MAP

     Function ID is: -2
     Source:
    return
        case
            when (:EMPLOYEE_ID <= '00200') then 1
            when (:EMPLOYEE_ID <= '00400') then 2
            else 3
        end case;
     Comment:       Return value for select partition - range 1 .. 3
     Module name is: RDB$STORAGE_MAPS
     Module ID is: -1
     Number of parameters is: 1

    Parameter Name                  Data Type        Domain or Type
    --------------                  ---------        --------------
                                    INTEGER
            Function result datatype
            Return value is passed by value

    EMPLOYEE_ID                     CHAR(5)
            Parameter position is 1
            Parameter is IN (read)
            Parameter is passed by reference

    Example 10: Using Storage Area Attributes in a LIST Storage Map

    The following example shows the use of storage area attributes in
    a LIST storage map. The storage area attributes must immediately
    follow the storage area name (as in table storage maps).

    SQL> create database
    cont>     filename 'DB$:MULTIMEDIA'
    cont>
    cont>     create storage area PHOTO_AREA1
    cont>         filename 'DB$:PHOTO_AREA1'
    cont>         page format UNIFORM
    cont>
    cont>     create storage area PHOTO_AREA2
    cont>         filename 'DB$:PHOTO_AREA2'
    cont>         page format UNIFORM
    cont>
    cont>     create storage area TEXT_AREA
    cont>         filename 'DB$:TEXT_AREA'
    cont>         page format UNIFORM
    cont>
    cont>     create storage area AUDIO_AREA
    cont>         filename 'DB$:AUDIO_AREA'
    cont>         page format UNIFORM
    cont>
    cont>     create storage area DATA_AREA
    cont>         filename 'DB$:DATA_AREA'
    cont>         page format UNIFORM
    cont> ;
    SQL>
    SQL> create table EMPLOYEES
    cont>     (name       char(30),
    cont>      dob        date,
    cont>      ident      integer,
    cont>      photograph list of byte varying (4096) as binary,
    cont>      resume     list of byte varying (132) as text,
    cont>      review     list of byte varying (80) as text,
    cont>      voiceprint list of byte varying (4096) as binary
    cont>     );
    SQL>
    SQL> create storage map EMPLOYEES_MAP
    cont>     for EMPLOYEES
    cont>     enable compression
    cont>     store in DATA_AREA;
    SQL>
    SQL> create storage map LISTS_MAP
    cont>     store lists
    cont>         in AUDIO_AREA
    cont>                 (thresholds are (89, 99, 100)
    cont>                 ,comment is 'The voice clips'
    cont>                 ,partition AUDIO_STUFF)
    cont>             for (employees.voiceprint)
    cont>         in TEXT_AREA
    cont>                 (thresholds is (99)
    cont>                 ,partition TEXT_DOCUMENTS)
    cont>             for (employees.resume, employees.review)
    cont>         in (PHOTO_AREA1
    cont>                 (comment is 'Happy Smiling Faces?'
    cont>                 ,threshold is (99)
    cont>                 ,partition PHOTOGRAPHIC_IMAGES_1)
    cont>             ,PHOTO_AREA2
    cont>                 (comment is 'Happy Smiling Faces?'
    cont>                 ,threshold is (99)
    cont>                 ,partition PHOTOGRAPHIC_IMAGES_2)
    cont>             )
    cont>             for (employees.photograph)
    cont>             fill randomly
    cont>         in RDB$SYSTEM
    cont>                 (partition SYSTEM_LARGE_OBJECTS);
    SQL>
    SQL> show storage map LISTS_MAP;
         LISTS_MAP
     For Lists
     Store clause:          STORE lists
            in AUDIO_AREA
                    (thresholds are (89, 99, 100)
                    ,comment is 'The voice clips'
                    ,partition AUDIO_STUFF)
                for (employees.voiceprint)
            in TEXT_AREA
                    (thresholds is (99)
                    ,partition TEXT_DOCUMENTS)
                for (employees.resume, employees.review)
            in (PHOTO_AREA1
                    (comment is 'Happy Smiling Faces?'
                    ,threshold is (99)
                    ,partition PHOTOGRAPHIC_IMAGES_1)
                ,PHOTO_AREA2
                    (comment is 'Happy Smiling Faces?'
                    ,threshold is (99)
                    ,partition PHOTOGRAPHIC_IMAGES_2)
                )
                for (employees.photograph)
                fill randomly
            in RDB$SYSTEM
                    (partition SYSTEM_LARGE_OBJECTS)

     Partition information for lists map:
     Vertical Partition: VRP_P000
      Partition: (1) AUDIO_STUFF
        Fill Randomly
       Storage Area: AUDIO_AREA
             Thresholds are (89, 99, 100)
     Comment:       The voice clips
      Partition: (2) TEXT_DOCUMENTS
        Fill Randomly
       Storage Area: TEXT_AREA
             Thresholds are (99, 100, 100)
      Partition: (3) PHOTOGRAPHIC_IMAGES_1
        Fill Randomly
       Storage Area: PHOTO_AREA1
             Thresholds are (99, 100, 100)
     Comment:       Happy Smiling Faces?
      Partition: (3) PHOTOGRAPHIC_IMAGES_2
       Storage Area: PHOTO_AREA2
             Thresholds are (99, 100, 100)
     Comment:       Happy Smiling Faces?
      Partition: (4) SYSTEM_LARGE_OBJECTS
        Fill Randomly
       Storage Area: RDB$SYSTEM
    SQL>
    SQL> commit;

18  –  SYNONYM

    Creates an alternate name or synonym for an existing database
    object. The object may be a domain, function, module, procedure,
    sequence, another synonym, table, or view.

    Once defined, the synonym can be used in any query or data
    definition language statement in place of the referenced object.

    However, the SHOW commands do not accept synonyms. Use the SHOW
    SYNONYM statement to determine if the name is a synonym.

18.1  –  Environment

    You can use the CREATE SYNONYM statement:

    o  In interactive SQL

    o  Embedded in host language programs

    o  As part of a procedure in an SQL module or other compound
       statement

    o  In dynamic SQL as a statement to be dynamically executed

18.2  –  Format

  CREATE -+---------------+-+-----------+---+
          +-> OR REPLACE -+ +-> PUBLIC -+   |
   +------------------ <--------------------+
   +-> SYNONYM <synonym-name> FOR -+----------------+-+
                                   +-> object-type -+ |
   +---------------------- <--------------------------+
   +-> <object-name> -+-----------------------------------------+->
                      +-> COMMENT IS -+-> ' <quoted-string> ' -++
                                      +--------- / <-----------+

  object-type =

  -+-> DOMAIN ----+->
   +-> FUNCTION --+
   +-> MODULE ----+
   +-> PROCEDURE -+
   +-> SEQUENCE --+
   +-> SYNONYM ---+
   +-> TABLE -----+
   +-> VIEW ------+

18.3  –  Arguments

18.3.1  –  COMMENT IS 'quoted-string'

    This optional clause can be used to add several lines of comment
    to the synonym object. The comment is displayed by the SHOW
    SYNONYM statement.

18.3.2  –  FOR object-name

    The name of the database object for which the synonym is
    required. This name must exist for an object in the database. If
    the optional object type is omitted, then Oracle Rdb will search
    the database for an object with this name.

18.3.3  –  object-type

    Syntax options:

       DOMAIN
       FUNCTION
       MODULE
       PROCEDURE
       SEQUENCE
       SYNONYM
       TABLE
       VIEW

    These optional object types can be used when the referenced
    object name is not unique within the database. For instance,
    Oracle Rdb allows a domain and a table to both be called MONEY.
    Therefore, to create a synonym for the table MONEY, you must use
    the FOR TABLE clause so that it is uniquely identified.

18.3.4  –  OR_REPLACE

    Instructs SQL to replace any synonym of this name if it exists.
    If it does not exist, a new synonym is created. This shorthand
    allows replacement of an existing synonym while maintaining
    all the dependencies established by query and DDL usage of this
    synonym.

18.3.5  –  PUBLIC

    This optional clause is provided for compatibility with the
    Oracle database server. It is currently not used by Oracle
    Rdb. Its presence or absence may be used by future releases.
    Oracle Corporation recommends you use the PUBLIC keyword in
    applications.

18.3.6  –  synonym-name

    The name of the synonym you want to create. The synonym name
    must be unique within all domains, tables, views, functions,
    procedures, modules, sequences, and synonyms within the database.
    You may qualify it with an alias.

18.4  –  Examples

    Example 1: Using the Default Alias

    SQL> CREATE SYNONYM emps FOR employees;

    Example 2: Using an Explicit Alias for the Synonym

    SQL> CREATE SYNONYM db1.emps FOR employees;

    Example 3: Using an Explicit Alias for the Referenced Object

    SQL> CREATE SYNONYM emps FOR db1.employees;

    Example 4: Using the Alias Explicitly

    SQL> CREATE SYNONYM db1.emps FOR db1.employees;

    Example 5: Using the Table Type

    SQL> CREATE SYNONYM cash FOR table money
    cont>   COMMENT IS 'use a different name to avoid confusion with'
    cont>   /          'the domain MONEY';

    Example 6: Using Multiple Synonyms

    SQL> CREATE TABLE t_employees_0001 (...);
    SQL> CREATE SYNONYM employees FOR t_employees_0001;
    SQL> CREATE SYNONYM emps FOR employees;

19  –  TABLE

    Creates a temporary or persistent base table definition. A table
    definition consists of a list of definitions of columns that make
    up a row in the table.

    Persistent base tables are tables whose metadata and data are
    stored in the database beyond an SQL session. The data can be
    shared by all users attached to the database.

    Temporary tables are tables whose data is automatically deleted
    when an SQL session or module ends. The tables only materialize
    when you refer to them in an SQL session and the data is local
    to an SQL session. You can also specify whether the data is
    preserved or deleted at the end of a transaction within the
    session; the default is to delete the data. The data in temporary
    tables is private to the user. There are three types of temporary
    tables:

    o  Global temporary tables

    o  Local temporary tables

    o  Declared local temporary tables (see the DECLARE LOCAL_
       TEMPORARY_TABLE for additional information)

    The metadata for a global temporary table is stored in the
    database and persists beyond the SQL session. Different SQL
    sessions can share the same metadata. The data stored in the
    table cannot be shared between SQL sessions. However, the data
    can be shared between modules in a single SQL session. The data
    does not persist beyond an SQL session.

    The metadata for a local temporary table is stored in the
    database and persists beyond the SQL session. Different SQL
    sessions can share the same metadata. The data stored in the
    table cannot be shared between different modules in a single SQL
    session or between SQL sessions. The data does not persist beyond
    an SQL session or module.

    Because temporary tables are used only to hold the user's data,
    which is not shared among users, no locks are needed and the data
    can be modified in a read-only transaction.

    See the Oracle Rdb Guide to Database Design and Definition for
    more information on temporary tables.

    Information tables are special read-only tables that can be
    used to retrieve database attributes that are not stored in the
    existing relational tables. Information tables allow interesting
    database information, which is currently stored in an internal
    format, to be displayed as a relational table.

    When you define a table, you can also define table constraints. A
    constraint specifies a condition that restricts the values that
    can be stored in a table. Constraints can specify that columns
    contain:

    -  Only certain values

    -  Primary key values

    -  Unique values

    -  Values that cannot be null

    There are several ways to specify a table definition in the
    CREATE TABLE statement:

    o  Directly by naming the table, its columns and associated
       data types, default values (optional), constraint definitions
       (optional), and formatting clauses.

       You can define constraints on persistent base tables and
       global temporary tables only.

    o  Indirectly by providing a path name for a repository record
       definition that specifies the table name, columns, and data
       types.

    o  Indirectly by providing another table as a model in inheriting
       the columns, datatypes and NOT NULL constraints.

    SQL allows you to specify the default character data type or the
    national character data type when defining table columns.

19.1  –  Environment

    You can use the CREATE TABLE statement:

    o  In interactive SQL

    o  Embedded in host language programs to be precompiled

    o  As part of a procedure in an SQL module

    o  In dynamic SQL as a statement to be dynamically executed

19.2  –  Format

   CREATE -+---------------------------+-> TABLE --------+
           +-> INFORMATION ------------+                 |
           +-> GLOBAL -+-> TEMPORARY --+                 |
           +-> LOCAL --+                                 |
  +---------------------- <------------------------------+
  ++-> FROM <path-name> -+-------------------+-----------------------+
   |                     +-> ALIAS <alias> --+                       |
   +-> <table-name> -+-------------------------------+-> table-body -+
                     +-> STORED NAME IS stored-name -+               |
    +---------------------<------------------------------------------+
    +-+--------------------------------+->
      +-+--> create-table-attributes -++
        +---------------<-------------+

  create-table-attributes =

  ---+-> COMMENT IS --+-> 'quoted-string' -+------+->
     |                +-------- / ---------+      |
     +-> COMPRESSION IS -+-> ENABLED ---+---------+
     |                   +-> DISABLED --+         |
     +-> DISABLE --+-> cre-enable-disable --------+
     +-> ENABLE ---+                              |
     +-> LOGGING ---------------------------------+
     +-> NOLOGGING -------------------------------+
     +-> ON COMMIT -+-> DELETE ----+-> ROWS ------+
                    +-> PRESERVE --+

  table-body =

  -+-> (column-constraint-list) ---------------------------------+->
   |                                                             |
   +-> LIKE <other-table-name> --+------------------------------++
                                 +--> (column-constraint-list) -+

  cre-enable-disable =

  -+-> ALL CONSTRAINTS ---------------------+->
   +-> CONSTRAINT <constraint-name> --------+
   +-> PRIMARY KEY -------------------------+
   +-> UNIQUE ( -+- <column-name> +-> ) ----+
                 +------- , <-----+

  col-definition =

  --> <column-name> --+
      +---------------+
      +---> column-type ---+--------------------------+-+--+
      |                    +->DEFAULT   value-expr    | |  |
      |                    +->column-identity --------+ |  |
      +---> COMPUTED BY value-expr ---------------------+  |
      +-------------------------<--------------------------+
      +-+--------------------+----------------+
        +-> col-constraint --+                |
      +--------------------------<------------+
      ++------------------------+-----+-----------------------+->
       +-> comment-is-clause  --+     +-> sql-and-dtr-clause -+

  column-constraint-list =

  --+--+-> col-definition -------+-----+->
    |  +-> table-constraint -----+     |
    +---------------- , <--------------+

  column-identity =

  --> IDENTITY --+--------------------------------------------------+-->
                 +- ( <start-with> --+----------------------+-> ) --+
                                     +-> , <increment-by> --+

  column-type=

  --+-> data-type -----------------------------------+-->
    +-> <domain-name> -------------------------------+
    +-> references-clause ---------------------------+
    +-> AUTOMATIC --+-----------+--> AS value-expr --+
                    +-> INSERT -+
                    +-> UPDATE -+

  data-type =

   -+-> char-data-types -----------------------------------------+-->
    +-> TINYINT --------------+-----+------------+---------------+
    +-> SMALLINT -------------+     +-> ( <n> ) -+               |
    +-> INTEGER --------------+                                  |
    +-> BIGINT ---------------+                                  |
    +-> FLOAT ----------------+                                  |
    +-> NUMBER -+----------------------------------+-------------+
    |           +-> ( -+-> <p> -+-+----------+-> ) +             |
    |                  +-> * ---+ +-> , <d> -+                   |
    +-> LIST OF BYTE VARYING --+------------+--+--------------+--+
    |                          +-> ( <n> ) -+  +-> AS BINARY -+  |
    |                                          +-> AS TEXT ---+  |
    +-> DECIMAL -++------------------------------+---------------+
    +-> NUMERIC -++-> ( --> <n> +----------+-> ) +               |
    |                           +-> , <n> -+                     |
    +-> REAL ----------------------------------------------------+
    +-> DOUBLE PRECISION ----------------------------------------+
    +-> date-time-data-types ------------------------------------+

  char-data-types =

  -+-> CHAR -------------++------------++--------------------------------+-+->
   +-> CHARACTER --------++-> ( <n> ) -++-> CHARACTER SET char-set-name -+ |
   +-> CHAR VARYING -----+                                                 |
   +-> CHARACTER VARYING +                                                 |
   +-> VARCHAR --+> ( <n> ) ---+--------------------------------+----------+
   +-> VARCHAR2 -+             +-> CHARACTER SET char-set-name -+          |
   +-> LONG VARCHAR  ------------------------------------------------------+
   +-> NCHAR --------------+-+------------+--------------------------------+
   +-> NATIONAL CHAR ------+ +-> ( <n> ) -+                                |
   +-> NATIONAL CHARACTER -+                                               |
   +-> NCHAR VARYING --------------+-+------------+------------------------+
   +-> NATIONAL CHAR VARYING ------+ +-> ( <n> ) -+                        |
   +-> NATIONAL CHARACTER VARYING -+                                       |
   +-> RAW -> ( <n> ) -----------------------------------------------------+
   +-> LONG -+--------+----------------------------------------------------+
             +-> RAW -+

  date-time-data-types =

  --+-> DATE -+----------+-----------------+-->
    |         +-> ANSI  -+                 |
    |         +-> VMS ---+                 |
    +-> TIME ---> frac --------------------+
    +-> TIMESTAMP --> frac ----------------+
    +-> INTERVAL ---> interval-qualifier --+

  col-constraint=

   ---+---------------------------------++
      +-> CONSTRAINT <constraint-name> -+|
    +------------------------------------+
    +-> PRIMARY KEY -----------------+
    +-> UNIQUE ----------------------+
    +-> NOT NULL --------------------+
    +-> NULL ------------------------+
    +-> CHECK (predicate) -----------+
    +-> references-clause -----------+
    +------------>-------------------+
    +-------------<------------------+
    +----+----------------------------+-->
         +--> constraint-attributes --+

  references-clause =

  REFERENCES <referenced-table-name> -+
   +-----------------<----------------+
   +-+--------------------->-------------------+->
     +-> ( -+> <referenced-column-name> +-> ) -+
            +----------- , <------------+

  sql-and-dtr-clause =

  -+-> QUERY HEADER IS -+> <quoted-string> +-------------------+->
   |                    +------ / <--------+                   |
   +-> EDIT STRING IS <quoted-string> -------------------------+
   |                                                           |
   +-> QUERY NAME FOR -+-> DTR --------+-> IS <quoted-string> -+
   |                   +-> DATATRIEVE -+                       |
   +-> DEFAULT VALUE FOR -+-> DTR --------+-> IS literal   ----+
                          +-> DATATRIEVE -+

  literal =

  --+-> numeric-literal ----+--->
    +-> string-literal -----+
    +-> date-time-literal --+
    +-> interval-literal ---+
    +-> dbkey-literal ------+

  table-constraint =

  ---+---------------->------------------+----+
     +-> CONSTRAINT <constraint-name> ---+    |
   +------------------------------------------+
   +--> table-constraint-clause --------------+
   +------------------------------------------+
   +---+---------------------------+------------->
       +-> constraint-attributes --+

  table-constraint-clause =

  -+----------------------------------------------+-->
   +-> PRIMARY KEY -> ( -+-> <column-name> -+> ) -+
   |                     +------- , <-------+     |
   +-> UNIQUE -> ( -+> <column-name> +-> ) -------+
   |                +------- , <-----+            |
   +-> CHECK (predicate) -------------------------+
   +-> FOREIGN KEY -> ( -+> <column-name> +-> ) + |
                         +------- , <-----+     | |
     +-----------------------<------------------+ |
     +-> references-clause ------------->---------+

  constraint-attributes =

  -+-> DEFERRABLE -------------+------------------------------+-+->
   |                           +-> INITIALLY +-> IMMEDIATE --++ |
   |                                         +-> DEFERRED ---+  |
   +-> NOT DEFERRABLE ---------+-------------------------+------+
   |                           +-> INITIALLY IMMEDIATE --+      |
   +-> INITIALLY IMMEDIATE ----+-------------------+------------+
   |                           +-> DEFERRABLE -----+            |
   |                           +-> NOT DEFERRABLE -+            |
   +-> INITIALLY DEFERRED -----+-------------------+------------+
                               +-> DEFERRABLE -----+

19.3  –  Arguments

19.3.1  –  ALIAS alias

    Specifies a name for an attach to a particular database. SQL adds
    the table definition to the database referred to by the alias.

    If you do not specify an alias, SQL adds the table definition to
    the default database. See the User_Supplied_Names HELP topic for
    more information on default databases and aliases.

19.3.2  –  AUTOMATIC

 Syntax options:

       AUTOMATIC AS value-expr
       AUTOMATIC INSERT AS value-expr
       AUTOMATIC UPDATE AS value-expr

    These AUTOMATIC column clauses allow you to store special
    information when data is inserted into a row or a row is updated.
    For example, you can log application-specific information to
    audit activity or provide essential values, such as time stamps
    or unique identifiers for the data.

    The assignment of values to these types of columns is managed by
    Oracle Rdb. The AUTOMATIC INSERT clause can be used to provide
    a complex default for the column when the row is inserted; it
    cannot be changed by an UPDATE statement. The AUTOMATIC UPDATE
    clause can be used to provide an updated value during an UPDATE
    statement. The unqualified AUTOMATIC clause specifies that the
    value expression should be applied during both INSERT and UPDATE
    statements. The column type is derived from the AS value-expr;
    using CAST allows a specific data type to be specified. However,
    this is not required and is rarely necessary.

    You can define an AUTOMATIC INSERT column to automatically
    receive data during an insert operation. The data is stored like
    any other column, but the column is read-only. Because AUTOMATIC
    columns are treated as read-only columns, they cannot appear in
    the column list for an insert operation nor be modified by an
    update operation. AUTOMATIC UPDATE columns can have an associated
    default value that will be used when the row is inserted.

19.3.3  –  char-data-type

    A valid SQL character data type. See the Data_Types HELP topic
    for more information on character data types.

19.3.4  –  character-set-name

    A valid character set name.

19.3.5  –  CHECK predicate

    Specifies a predicate that column values inserted into the
    table must satisfy. See the Predicates HELP topic for details
    on specifying predicates.

    Predicates in CHECK column constraints can refer directly only to
    the column with which they are associated.

19.3.6  –  col-constraint

    A constraint that applies to values stored in the associated
    column.

    SQL allows column constraints and table constraints. The five
    types of column constraints are PRIMARY KEY, UNIQUE, NOT NULL,
    CHECK, and FOREIGN KEY constraints. The FOREIGN KEY constraints
    are created with the REFERENCES clause.

    You can define a column constraint on persistent base tables and
    global temporary tables only.

19.3.7  –  col-definition

    The definition for a column in the table. SQL gives you two ways
    to specify column definitions:

    o  By directly specifying a data type to associate with a column
       name

    o  By naming a domain that indirectly specifies a data type to
       associate with a column name

    Either way also allows options for specifying default values,
    column constraints, and formatting clauses.

19.3.8  –  column-name

    The name of a column you want to create in the table. You need to
    specify a column name whether you directly specify a data type in
    the column definition or indirectly specify a data type by naming
    a domain in the column definition.

19.3.9  –  COMPUTED_BY

    Specifies that the value of this column is calculated from values
    in other columns and constant expressions.

    If your column definition refers to a column name within a value
    expression, that named column must already be defined within the
    same CREATE TABLE statement. See the Value_Expressions HELP topic
    for information on value expressions.

    Any column that you refer to in the definition of a computed
    column cannot be deleted from that table unless you first delete
    the computed column.

    SQL does not allow the following for computed columns:

    o  UNIQUE constraints

    o  REFERENCES clauses

    o  PRIMARY KEY constraints

    o  DEFAULT clause

    o  IDENTITY clause

    o  Default value for DATATRIEVE

    For example, if the FICA_RATE for an employee is 6.10 percent of
    the employee's starting salary and the group insurance rate is
    0.7 percent, you can define FICA_RATE and GROUP_RATE columns like
    this:

    SQL> CREATE TABLE payroll_detail
    cont> (salary_code CHAR(1),
    cont>  starting_salary SMALLINT(2),
    cont>  fica_amt
    cont>    COMPUTED BY (starting_salary * 0.061),
    cont>  group_rate
    cont>    COMPUTED BY (starting_salary * 0.007));

    When you use this type of definition, you only have to store
    values in the salary_code and starting_salary columns. The FICA
    and group insurance deduction columns are computed automatically
    when the columns fica_amt or group_rate are selected.

19.3.10  –  COMPRESSION_IS

    Syntax options:

    COMPRESSION IS ENABLED | COMPRESSION IS DISABLED

    Specifies whether run-length compression is enabled or disabled
    for rows inserted into the base or temporary table.

    In some cases, the data inserted into a table may not compress
    and so incur only overhead in the row. This overhead is used
    by Rdb to describe the sequence of uncompressible data. Use
    COMPRESSION IS DISABLED to prevent Rdb from attempting the
    compression of such data.

    Any storage map which specifies the ENABLE COMPRESSION or DISABLE
    COMPRESSION clause will override this setting in the table.

    The COMPRESSION IS clause is not permitted for INFORMATION
    tables.

    The default is COMPRESSION IS ENABLED.

19.3.11  –  constraint-attributes

    Although the constraint attribute syntax provides 11 permutations
    as required by the SQL99 standard, they equate to the following
    three options:

    o  INITIALLY IMMEDIATE NOT DEFERRABLE

       Specifies that evaluation of the constraint must take place
       when the INSERT, DELETE, or UPDATE statement executes. If
       you are using the SQL99, SQL92, MIA, ORACLE LEVEL1, or ORACLE
       LEVEL2 dialect, this is the default.

    o  INITIALLY IMMEDIATE DEFERRABLE

       Specifies that evaluation of the constraint may be deferred
       (using the SET CONSTRAINT ALL statement or the SET TRANSACTION
       statement with the EVALUATING clause), but by default it
       is evaluated after the INSERT, DELETE, or UPDATE statement
       executes. See the SET_ALL_CONSTRAINTS statement for more
       information.

    o  INITIALLY DEFERRED DEFERRABLE

       Specifies that evaluation of the constraint can take place
       at any later time. Unless otherwise specified, evaluation of
       the constraint takes place as the COMMIT statement executes.
       You can use the SET ALL CONSTRAINTS statement to have all
       constraints evaluated earlier. See the description of the SET
       ALL CONSTRAINTS statement for more information.

       If you are using the default SQLV40 dialect, this is the
       default constraint attribute. When using this dialect, Oracle
       Rdb displays a deprecated feature message for all constraints
       defined without specification of one of the constraint
       attributes.

19.3.12  –  CONSTRAINT

    Specifies a name for a column or table constraint. The name is
    used for a variety of purposes:

    o  The RDB$INTEG_FAIL error message specifies the name when an
       INSERT, UPDATE, or DELETE statement violates the constraint.

    o  The ALTER TABLE table-name DROP CONSTRAINT constraint-name
       statement specifies the name to delete a table constraint.

    o  The SHOW TABLE statements display the names of column and
       table constraints.

    o  The EVALUATING clause of the SET TRANSACTION and DECLARE
       TRANSACTION statements specifies constraint names.

    o  The ENABLE and DISABLE clauses of the ALTER and CREATE TABLE
       statements specify constraint names.

    o  The ALTER CONSTRAINT statement specifies constraint names.

    o  The DROP CONSTRAINT statement

    The CONSTRAINT clause is optional. If you omit the constraint
    name, SQL creates a name. However, Oracle Rdb recommends that
    you always name column and table constraints. If you supply a
    constraint name with the CONSTRAINT clause, it must be unique
    in the database or in the schema if you are using a multischema
    database.

19.3.13  –  data-type

    A valid SQL data type. Specifying an explicit data type to
    associate with a column is an alternative to specifying a domain
    name. See the Data_Types HELP topic for more information on data
    types.

19.3.14  –  date-time-data-types

    A data type that specifies a date, time, or interval. See the
    Data_Types HELP topic for more information about date-time data
    types.

19.3.15  –  DEFAULT value-expr

    Provides a default value for a column if the row that is inserted
    does not include a value for that column.

    You can use any value expression including subqueries,
    conditional, character, date/time, and numeric expressions as
    default values. See Value Expressions for more information about
    value expressions.

    For more information about NULL, see the NULL_Keyword HELP topic.

    The value expressions described in Value Expressions include
    DBKEY and aggregate functions. However, the DEFAULT clause is
    not a valid location for referencing a DBKEY or an aggregate
    function. If you attempt to reference either, you receive a
    compile-time error.

    If you do not specify a default value, a column inherits the
    default value from the domain. If you do not specify a default
    value for either the column or domain, SQL assigns NULL as the
    default value.

19.3.16  –  domain-name

    The name of a domain created in a CREATE DOMAIN statement. SQL
    gives the column the data type specified in the domain. For more
    information on domains, see the CREATE DOMAIN statement.

    For most purposes, you should specify a domain instead of an
    explicit data type.

    o  Domains ensure that all columns in multiple tables that serve
       the same purpose have the same data type. For example, several
       tables in the sample personnel database refer to the domain
       ID_DOM.

    o  A domain lets you change the data type for all columns that
       refer to it in one operation by changing the domain itself
       with an ALTER DOMAIN statement.

       For example, if you want to change the data type for the
       column EMPLOYEE_ID from CHAR(5) to CHAR(6), you need only
       alter the data type for the domain ID_DOM. You do not have to
       alter the data type for the column EMPLOYEE_ID in the tables
       DEGREES, EMPLOYEES, JOB_HISTORY, or SALARY_HISTORY, nor do you
       have to alter the column MANAGER_ID in the DEPARTMENTS table.

    However, you might not want to use domains when you create tables
    if:

    o  Your application must be compatible with Oracle RDBMS.

    o  You are creating intermediate result tables that do not need
       the advantages of domains.

19.3.17  –  enable-disable-clause

    Allows you to enable or disable all constraints, specified
    constraints, a primary key, or a unique column name, as described
    in the following list. By default, table and column constraints
    added during a create table operation are enabled.

    o  DISABLE ALL CONSTRAINTS

       All table and column constraints for this table are disabled.
       No error is raised if no constraints are defined on the table.

    o  ENABLE ALL CONSTRAINTS

       All and column constraints for this table are enabled. No
       error is raised if no constraints are defined on the table.

    o  DISABLE CONSTRAINT constraint-name

       The named constraint is disabled. The named constraint must be
       a table or column constraint for the table.

    o  ENABLE CONSTRAINT constraint-name

       The named constraint is enabled. The named constraint must be
       a table or column constraint for the table.

    o  DISABLE PRIMARY KEY

       The primary key for the table is disabled.

    o  ENABLE PRIMARY KEY

       The primary key for the table is enabled.

    o  DISABLE UNIQUE (column-name)

       The matching UNIQUE constraint is disabled. The columns listed
       must be columns in the table.

    o  ENABLE UNIQUE (column-name)

       The matching UNIQUE constraint is enabled. The columns listed
       must be columns in the table.

19.3.18  –  FOREIGN_KEY

    The name of a column or columns that you want to declare as a
    foreign key in the table you are defining (referencing table).
    You cannot declare a computed column as a foreign key.

19.3.19  –  FROM pathname

    Specifies the repository path name of a repository record
    definition. SQL creates the table using the definition from this
    record and gives the table the name of the record definition.

    You can create a table using the FROM path-name clause only if
    the record definition in the repository was originally created
    using the repository Common Dictionary Operator (CDO) utility.
    For instance, you cannot create a table using the FROM path-name
    clause if the record definition was created in the repository as
    part of an SQL session.

    If the repository record contains a nested record definition, you
    cannot create a table based on it.

    Creating a table based on a repository record definition is
    useful when many applications share the same definition. Changes
    to the common definition can be automatically reflected in all
    applications that use it.

                                   NOTE

       Changes by other users or applications to the record
       definition in the repository affect the table definition
       once the database is integrated to match the repository
       with an INTEGRATE DATABASE . . . ALTER FILES statement. If
       those changes include deleting records or fields on which
       tables or table columns are based, any data in the dependent
       table or table column is lost after the next INTEGRATE
       DATABASE . . . ALTER FILES statement executes.

    You can use the FROM clause only if the database was attached
    specifying PATHNAME. You can specify either a full repository
    path name or a relative repository path name.

    You cannot define constraints or any other table definition
    clauses, such as DATATRIEVE formatting clauses, when you use
    the FROM path-name form of the CREATE TABLE statement. This
    restriction does not prevent you from using an ALTER TABLE
    statement to add them later.

    You cannot use the FROM path-name clause when embedding a CREATE
    TABLE statement within a CREATE DATABASE statement.

19.3.20  –  IDENTITY

    Specifies that the column is to be a special read-only identity
    column. INSERT will evaluate this column and store a unique value
    for each row inserted. Only one column of a table may have the
    IDENTITY attribute. Rdb creates a sequence with the same name as
    the current table.

    See ALTER SEQUENCE and CREATE SEQUENCE for more information.

19.3.21  –  increment-by

    An integer literal value that specifies the increment for the
    sequence created for the IDENTITY column. A negative value
    creates a descending sequence, and a positive value creates an
    ascending sequence. A value of zero is not permitted. If omitted
    the default is 1, that is an ascending sequence.

19.3.22  –  INFORMATION

    Specifies that the table definition is an information table.

    Information tables are reserved for use by Oracle Corporation.

19.3.23  –  LIKE other-table-name

    Allows a database administrator to copy the metadata for
    an existing table and create a new table with similar
    characteristics. An optional column list can be used to add extra
    columns and contraints to this table. The referenced table must
    exist in the same database as the table being created.

    Syntax options:

    LOGGING | NOLOGGING

    The LOGGING clause specifies that the CREATE TABLE statement
    should be logged in the recovery-unit journal file (.ruj) and
    after-image journal file (.aij).

    The NOLOGGING clause specifies that the CREATE TABLE statement
    should not be logged in the recovery-unit journal file (.ruj) and
    after-image journal file (.aij).

    The LOGGING clause is the default.

19.3.24  –  NOT_NULL

    Restricts values in the column to values that are not null.

19.3.25  –  ON_COMMIT

    Syntax options:

    ON COMMIT PRESERVE ROWS | ON COMMIT DELETE ROWS

    Specifies whether data is preserved or deleted after a COMMIT
    statement for global or local temporary tables only.

    The default, if not specified, is ON COMMIT DELETE ROWS.

19.3.26  –  PRIMARY_KEY

    A primary key constraint defines one or more columns whose values
    make a row in a table different from all others. SQL requires
    that values in a primary key column be unique and not null;
    therefore, you need not specify the UNIQUE and NOT NULL column
    constraints for primary key columns.

    You cannot specify the primary key constraint for a computed
    column.

    When used as a table constraint this clause must be followed by
    a list of column names. When used as a column constraint this
    clause applies to the named column of the table.

19.3.27  –  references-clause

    Specifies the name of the column or columns that are a unique
    key or primary key or in the referenced table. When the
    REFERENCES clause is used as a table constraint, the column names
    specified in the FOREIGN KEY clause become a foreign key for the
    referencing table.

    When used as the column type clause, specifies that the type
    of the column be inherited from the PRIMARY KEY or UNIQUE index
    referenced. Both the data type and domain are inherited.

19.3.28  –  REFERENCES referenced table name

    Specifies the name of the table that contains the unique key
    or primary key referenced by the referencing table. To declare
    a constraint that refers to a unique or primary key in another
    table, you must have the SQL REFERENCES or CREATE privileges to
    the referenced table.

19.3.29  –  referenced-column-name

    For a column constraint, the name of the column that is a
    unique key or primary key in the referenced table. You cannot
    use a computed column as a referenced column name. For a table
    constraint, the referenced column name is the name of the column
    or columns that are a unique key or primary key in the referenced
    table. If you omit the referenced-column-name clause, the primary
    key is selected by default. The number of columns and their data
    types must match.

19.3.30  –  sql-and-dtr-clause

    Optional SQL formatting clause.

    If you specify a formatting clause for a column that is based on
    a domain that also specifies a formatting clause, the formatting
    clause in the table definition overrides the one in the domain
    definition.

19.3.31  –  start-with

    An integer literal value that specifies the starting value for
    the sequence created for the IDENTITY column. If omitted the
    default is 1.

19.3.32  –  STORED_NAME_IS

    Specifies a name that Oracle Rdb uses to access a table created
    in a multischema database. The stored name allows you to access
    multischema definitions using interfaces, such as Oracle RMU,
    the Oracle Rdb management utility, that do not recognize multiple
    schemas in one database. You cannot specify a stored name for
    a table in a database that does not allow multiple schemas. For
    more details about stored names, see the User_Supplied_Names HELP
    topic.

19.3.33  –  table-constraint

    A constraint definition that applies to the whole table.

    SQL allows column constraints and table constraints. The four
    types of table constraints are PRIMARY KEY, UNIQUE, CHECK, and
    FOREIGN KEY constraints.

    A column must be defined in a table before you can specify the
    column in a table constraint definition.

    You can define a table constraint on persistent base tables and
    global temporary tables only.

19.3.34  –  table-name

    The name of the table definition you want to create. Use a name
    that is unique among all table, sequence, view and synonym names
    in the database, or in the schema if you are using a multischema
    database. Use any valid SQL name. (See the User_Supplied_Names
    HELP topic for more information on user-supplied names.)

19.3.35  –  temporary_tables

    Syntax options:

    CREATE GLOBAL TEMPORARY TABLE | CREATE LOCAL TEMPORARY TABLE

    Specifies that the table definition is either a global or local
    temporary table.

19.3.36  –  UNIQUE

    Specifies that values in the associated column must be unique.
    You can use either the UNIQUE or PRIMARY KEY keywords to define
    one or more columns as a unique key for a table.

    You cannot specify the UNIQUE constraint for a computed column or
    for a column defined with the LIST OF BYTE VARYING data type.

19.4  –  Examples

    Example 1: Creating new tables with primary and foreign keys

    In this example, the CREATE TABLE statement is used to create
    the EMPLOYEES_2, SALARY_HISTORY_2, and WORK_STATUS_2 tables in
    the personnel database. It specifies column definitions based on
    domain definitions for the entire database.

    The FOREIGN KEY constraint specified in the SALARY_HISTORY_2
    table must match the PRIMARY KEY constraint specified in the
    EMPLOYEES_2 table.

    Note also that the CHECK constraint specified is a table
    constraint because it is separated by commas from the column to
    which it refers. In this case, a column constraint on EMPLOYEE_ID
    would have the same effect because it refers only to the single
    column EMPLOYEE_ID.

    Because the dialect is SQL99, the default for constraint
    evaluation time is NOT DEFERRABLE.

    SQL> -- *** Set Dialect ***
    SQL> --
    SQL> SET DIALECT 'SQL99';
    SQL> --
    SQL> -- *** Create tables ***
    SQL> --
    SQL> CREATE TABLE WORK_STATUS_2
    cont>   (
    cont>   STATUS_CODE      STATUS_CODE_DOM
    cont>     CONSTRAINT WS2_STATUS_CODE_PRIMARY
    cont>     PRIMARY KEY,
    cont>   STATUS_NAME      STATUS_NAME_DOM,
    cont>   STATUS_TYPE      STATUS_DESC_DOM
    cont>   );
    SQL> --
    SQL> CREATE TABLE EMPLOYEES_2
    cont>   (
    cont>   EMPLOYEE_ID      ID_DOM
    cont>     CONSTRAINT E2_EMPLOYEE_ID_PRIMARY
    cont>     PRIMARY KEY,
    cont>   LAST_NAME        LAST_NAME_DOM,
    cont>   FIRST_NAME       FIRST_NAME_DOM,
    cont>   MIDDLE_INITIAL   MIDDLE_INITIAL_DOM,
    cont>   ADDRESS_DATA_1   ADDRESS_DATA_1_DOM,
    cont>   ADDRESS_DATA_2   ADDRESS_DATA_2_DOM,
    cont>   CITY             CITY_DOM,
    cont>   STATE            STATE_DOM,
    cont>   POSTAL_CODE      POSTAL_CODE_DOM,
    cont>   SEX              SEX_DOM
    cont>     CONSTRAINT     EMPLOYEE_SEX_VALUES
    cont>     CHECK          (
    cont>                    SEX IN ('M', 'F') OR SEX IS NULL
    cont>                    ),
    cont>   BIRTHDAY         DATE_DOM,
    cont>   STATUS_CODE      STATUS_CODE_DOM
    cont>     CONSTRAINT E2_STATUS_CODE_FOREIGN
    cont>     REFERENCES WORK_STATUS_2 (STATUS_CODE),
    cont>     CONSTRAINT     EMP_STATUS_CODE_VALUES_2
    cont>     CHECK          (
    cont>                    STATUS_CODE IN ('0', '1', '2')
    cont>                    OR STATUS_CODE IS NULL
    cont>                    )
    cont>     );
    SQL> --
    SQL> CREATE TABLE SALARY_HISTORY_2
    cont>   (
    cont>   EMPLOYEE_ID      ID_DOM
    cont>     CONSTRAINT SH2_EMPLOYEES_ID_FOREIGN
    cont>     REFERENCES EMPLOYEES_2 (EMPLOYEE_ID),
    cont>   SALARY_AMOUNT    SALARY_DOM,
    cont>   SALARY_START     DATE_DOM,
    cont>   SALARY_END       DATE_DOM
    cont>   );
    SQL>

    Example 2: Creating a table with many SQL data types

    The following example is an excerpt from the sample program sql_
    all_datatypes created during installation of Oracle Rdb in the
    Samples directory. For a variety of languages, sql_all_datatypes
    illustrates how you declare program variables to match a variety
    of data types, and how you can specify those variables in SQL
    statements when you store and retrieve column values or null
    values.

    This example shows the CREATE TABLE statement from the sql_all_
    datatypes program.

    EXEC SQL CREATE TABLE ALL_DATATYPES_TABLE
            (
            CHAR_COL                CHAR(10),
            SMALLINT_COL            SMALLINT,
            SMALLINT_SCALED_COL     SMALLINT (3),
            INTEGER_COL             INTEGER,
            INTEGER_SCALED_COL      INTEGER (2),
            QUADWORD_COL            QUADWORD,
            QUADWORD_SCALED_COL     QUADWORD (5),
            REAL_COL                REAL,
            DOUBLE_PREC_COL         DOUBLE PRECISION,
            DATE_COL                DATE,
            VARCHAR_COL             VARCHAR(40)
            );

    Example 3: Specifying default values for columns

    The following example illustrates the use of default values
    for columns. Each salesperson enters his or her own daily sales
    information into the DAILY_SALES table.

    SQL> --
    SQL> CREATE TABLE DAILY_SALES
    cont> --
    cont> -- The column SALESPERSON is based on LAST_NAME_DOM and
    cont> -- the default value is the user name of the person who
    cont> -- enters the information:
    cont> (SALESPERSON LAST_NAME_DOM DEFAULT USER,
    cont> --
    cont> -- Typical work day is 8 hours:
    cont>   HOURS_WORKED SMALLINT DEFAULT 8,
    cont>   HOURS_OVERTIME SMALLINT,
    cont>   GROSS_SALES INTEGER );
    SQL> --
    SQL> -- Insert daily sales information accepting the
    SQL> -- default values for SALESPERSON and HOURS_WORKED:
    SQL> --
    SQL> INSERT INTO DAILY_SALES
    cont> (HOURS_OVERTIME, GROSS_SALES )
    cont> VALUES
    cont> (1, 2499.00);
    1 row inserted
    SQL> SELECT * FROM DAILY_SALES;
     SALESPERSON      HOURS_WORKED   HOURS_OVERTIME   GROSS_SALES
     KILPATRICK                  8                1          2499
    1 row selected

    Example 4: Violating a constraint indirectly with the DELETE
    statement

    Constraints prevent INSERT statements from adding rows to a table
    that do not satisfy conditions specified in the constraint.
    Constraints also prevent DELETE or UPDATE statements from
    deleting or changing values in a table if the deletion or change
    violates the constraint on another table in the database. The
    following example illustrates that point:

    SQL> -- TEST has no constraints defined for it, but it is subject to
    SQL> -- restrictions nonetheless because of the constraint specified
    SQL> -- in TEST2:
    SQL> CREATE TABLE TEST
    cont> (COL1 REAL);
    SQL>
    SQL> CREATE TABLE TEST2
    cont> (COL1 REAL,
    cont> CHECK (COL1 IN
    cont>   (SELECT COL1 FROM TEST))
    cont> );
    SQL> COMMIT;
    SQL>
    SQL> INSERT INTO TEST VALUES (1);
    1 row inserted
    SQL> INSERT INTO TEST2 VALUES (1);
    1 row inserted
    SQL> COMMIT;
    SQL> -- This DELETE statement will fail because it will cause COL1 in
    SQL> -- TEST2 to contain a value without the same value in COL1 of TEST:
    SQL> DELETE FROM TEST WHERE COL1 = 1;
    1 row deleted
    SQL> COMMIT;
    %RDB-E-INTEG_FAIL, violation of constraint TEST2_CHECK1 caused operation to
    fail

    Example 5: Evaluating constraints at verb time

    Deferrable constraints are not evaluated until a transaction
    issues a COMMIT statement. You can specify that constraints be
    evaluated more frequently with the EVALUATING clause of the SET
    TRANSACTION statement.

    SQL> create table TEST
    cont>     (col1 integer,
    cont>      col2 integer
    cont>        constraint C2
    cont>           unique
    cont>           deferrable
    cont>     );
    SQL>
    SQL> insert into TEST (col1, col2) values (1, 2);
    1 row inserted
    SQL> commit;
    SQL>
    SQL> /*
    ***> This INSERT will violate the constraint as shown by
    ***> the error during COMMIT
    ***> */
    SQL> insert into TEST (col1, col2) values (1, 2);
    1 row inserted
    SQL> commit;
    %RDB-E-INTEG_FAIL, violation of constraint C2 caused operation to fail
    -RDB-F-ON_DB, on database USER_DISK:[DOC.DATABASES]MF_PERSONNEL.RDB;1
    SQL> /*
    ***> The COMMIT failed, so we will ROLLBACK
    ***> */
    SQL> rollback;
    SQL>
    SQL> /*
    ***> You can change the evalution time using the EVALUATING
    ***> clause of SET TRANSACTION
    ***> */
    SQL> set transaction read write evaluating C2 at verb time;
    SQL> insert into TEST (col1, col2) values (1, 2);
    %RDB-E-INTEG_FAIL, violation of constraint C2 caused operation to fail
    -RDB-F-ON_DB, on database USER_DISK:[DOC.DATABASES]MF_PERSONNEL.RDB;1
    SQL> rollback;

20  –  TRIGGER

    Creates triggers for a specified table. A trigger defines the
    actions to occur before or after the table is updated (by a write
    operation such as an INSERT, DELETE, or UPDATE statement). The
    trigger is associated with a single table, takes effect at a
    specific time for a particular type of update, and causes one or
    more triggered actions to be performed. If the trigger specifies
    multiple actions, each action is performed in the order in which
    it appears within the trigger definition.

    With triggers, you can define useful actions such as:

    o  Cascading deletes

       Deleting a row from one table causes additional rows to be
       deleted from other tables that are related to the first table
       by key values.

    o  Cascading updates

       Updating a row in one table causes additional rows to be
       updated in other tables that are related to the first table
       by key values. These updates are commonly limited to the key
       fields themselves.

    o  Summation updates

       Updating a row from one table causes a value in a row of
       another table to be updated by being increased or decreased.

    o  Hidden deletes

       Causing rows to be deleted from a table by moving them to a
       parallel table that is not otherwise used by the database.

                                   NOTE

       Combinations of table-specific constraints and appropriately
       defined triggers, by themselves, are not sufficient to
       guarantee that database integrity is preserved when the
       database is updated. If integrity is to be preserved,
       table-specific constraints and triggers must be used in
       conjunction with a common set of update procedures that
       ensure completely reproducible and consistent retrieval and
       update strategies.

    The CREATE TRIGGER statement adds the trigger definition to the
    physical database.

    A triggered action consists of an optional predicate and some
    triggered statements. If specified, the predicate must evaluate
    to true for the triggered statements in the action to execute.
    Each triggered statement is executed in the order in which it
    appears within the triggered action clause.

    The triggered statement can be:

    o  A DELETE statement

    o  An UPDATE statement

    o  An INSERT statement

    o  A CALL statement

    o  A SIGNAL statement

    o  A TRACE statement

    o  An ERROR statement

20.1  –  Environment

    You can use the CREATE TRIGGER statement:

    o  In interactive SQL

    o  Embedded in host language programs to be precompiled

    o  As part of a procedure in an SQL module

    o  In dynamic SQL as a statement to be dynamically executed

20.2  –  Format

  CREATE TRIGGER --> <trigger-name> ------+
  +---------------------------------------+
  +-+-----------------------------------+-+
    +-> STORED NAME IS <stored-name> ---+ |
  +------------------<--------------------+
  ++-> BEFORE -+-+-> INSERT --------------------------------+-+
   +-> AFTER --+ +-> DELETE --------------------------------+ |
                 +-> UPDATE --+--------------------------+--+ |
                              +--> OF -+> <column-name> ++    |
                                       +--- , <---------+     |
  +----------------------------<------------------------------+
  +-> ON <table-name> +-----------------------++-> triggered-action -+>
                      +-> referencing-clause -++----------<----------+

  referencing-clause =

  REFERENCING -++-> OLD AS --> <old-correlation-name> -++->
               |+-> NEW AS --> <new-correlation-name> -+|
               +------------------<---------------------+

  triggered-action =

  --+---------------------+-> ( -+> triggered-statement -+-> ) -+
    +-> WHEN (predicate) -+      +----------- , <--------+      |
                                 +----------- ; <--------+      |
     +---------------------------<------------------------------+
     +-+------------------------+------------------------------->
       +-> FOR EACH ROW --------+
       +-> FOR EACH STATEMENT --+

  triggered-statement =

  --+-> call-statement ---+-->
    +-> delete-statement -+
    +-> ERROR ------------+
    +-> insert-statement -+
    +-> signal-statement -+
    +-> trace-statement --+
    +-> update-statement -+

20.3  –  Arguments

20.3.1  –  call-statement

    Specifies the stored procedure to invoke. You can only call
    procedures with IN parameters. Operations on the triggering table
    are not permitted due to possible side effects and recursive
    calls.

20.3.2  –  column-name

    The name of a column within the specified table to be checked for
    deletion, modification, or insertion. Use this argument only with
    UPDATE triggers.

20.3.3  –  delete-statement

    Specifies the row of a table that you want to delete. If you
    specify CURRENT OF cursor-name with the WHERE clause of the
    DELETE statement, you receive an error message because the cursor
    is not visible to the CREATE TRIGGER statement.

20.3.4  –  ERROR

    Provides the following message:

    RDMS-E-TRIG_ERROR, Trigger 'trigger_name' forced an error.

    A triggered ERROR statement cancels the DELETE, UPDATE, or INSERT
    statement that invoked the trigger.

20.3.5  –  FOR_EACH

    Syntax options:

    FOR EACH ROW | FOR EACH STATEMENT

    Specifies whether the triggered action is evaluated once per
    triggering statement, or for each row of the subject table that
    is affected by the triggering statement.

    If you specify FOR EACH STATEMENT, then the triggered action
    is evaluated only once, and row values are not available to the
    triggered action.

    The FOR EACH STATEMENT clause is the default.

20.3.6  –  insert-statement

    Specifies the new row or rows you want to add to a table.

20.3.7  –  old-correlation-name

    A temporary name used to refer to the row values as they existed
    before an UPDATE operation occurred. If you do not specify the
    FOR EACH ROW clause, this correlation name cannot be referred to
    in the triggered statement.

20.3.8  –  new-correlation-name

    A temporary name used to refer to the new row values to be
    applied by the UPDATE operation. If you do not specify the FOR
    EACH ROW clause, this correlation name cannot be referred to in
    the triggered statement.

20.3.9  –  referencing-clause

    Lets you specify whether you want to refer to the row values as
    they existed before an UPDATE operation occurred or the new row
    values after they are applied by the UPDATE operation. Do not use
    this clause with INSERT or DELETE operations.

    You can specify each option (OLD AS old-correlation-name or NEW
    AS new-correlation-name) only once in the referencing clause.

20.3.10  –  signal-statement

    Specifies that the signaled SQLSTATE status parameter is to be
    passed back to the application or SQL interface and that the
    current routine and all calling routines are to be terminated.
    This provides a more complete error mechanism than is provided by
    the ERROR clause.

20.3.11  –  STORED_NAME_IS

    Specifies a name that Oracle Rdb uses to access a trigger created
    in a multischema database. The stored name allows you to access
    multischema definitions using interfaces, such as Oracle RMU,
    the Oracle Rdb management utility, that do not recognize multiple
    schemas in one database. You cannot specify a stored name for a
    trigger in a database that does not allow multiple schemas. For
    more information on stored names, see the User_Supplied_Names
    HELP topic.

20.3.12  –  table-name

    The name of the table for which this trigger is defined.

20.3.13  –  trace-statement

    Allows applications to add triggers to log information when trace
    logging is active.

20.3.14  –  triggered-action

    Consists of an optional predicate, some triggered statements, and
    an optional frequency clause. If specified, the predicate must
    evaluate to true for the triggered statements in the triggered
    action clause to execute. Each triggered statement is executed in
    the order in which it appears within the triggered action clause.

20.3.15  –  triggered-statement

    Updates the database or generates an error message.

20.3.16  –  update-statement

    Specifies the row of a table that you want to modify. If you
    specify CURRENT OF cursor-name with the WHERE clause of the
    UPDATE statement, you receive an error message because the cursor
    is not visible to the CREATE TRIGGER statement.

20.3.17  –  WHEN predicate

    Describes the optional condition that must be satisfied before
    the associated triggered statements are executed. This predicate
    cannot refer to any host language variable.

    To avoid ambiguity between columns and external function
    callouts, use parentheses around the predicate in the WHEN
    clause.

20.4  –  Examples

    Example 1: Defining a cascading delete trigger

    The following SQL procedure shows a trigger from the sample
    personnel database that deletes rows in several tables before
    deleting a row in the EMPLOYEES table. Each associated employee
    row (from the tables that have foreign keys referring to the
    primary key in the employee row) is deleted. The employee
    identification number being deleted (00164) belongs to an
    employee who is also a manager; therefore, the MANAGER_ID column
    in the DEPARTMENTS table is set to null, as specified by the
    trigger.

    SQL> SET TRANSACTION READ WRITE;
    SQL> --
    SQL> -- Display the EMPLOYEE_ID_CASCADE_DELETE trigger
    SQL> -- in the sample database:
    SQL> --
    SQL> SHOW TRIGGER EMPLOYEE_ID_CASCADE_DELETE
         EMPLOYEE_ID_CASCADE_DELETE
     Source:
     EMPLOYEE_ID_CASCADE_DELETE
           BEFORE DELETE ON EMPLOYEES
           (DELETE FROM DEGREES D WHERE D.EMPLOYEE_ID =
            EMPLOYEES.EMPLOYEE_ID)
              FOR EACH ROW
           (DELETE FROM JOB_HISTORY JH WHERE JH.EMPLOYEE_ID =
            EMPLOYEES.EMPLOYEE_ID)
              FOR EACH ROW
           (DELETE FROM SALARY_HISTORY SH WHERE SH.EMPLOYEE_ID =
            EMPLOYEES.EMPLOYEE_ID)
              FOR EACH ROW
         ! Also, if an employee is terminated and that employee
         ! is the manager of a department, set the manager_id
         ! null for that department.
           (UPDATE DEPARTMENTS D  SET D.MANAGER_ID = NULL
            WHERE D.MANAGER_ID = EMPLOYEES.EMPLOYEE_ID)
              FOR EACH ROW
    SQL> --
    SQL> -- The EMPLOYEES table has a value of '00164'
    SQL> -- in the EMPLOYEE_ID column:
    SQL> --
    SQL> SELECT * FROM EMPLOYEES E WHERE E.EMPLOYEE_ID = '00164';
     EMPLOYEE_ID   LAST_NAME        FIRST_NAME   MIDDLE_INITIAL
       ADDRESS_DATA_1              ADDRESS_DATA_2         CITY
          STATE   POSTAL_CODE   SEX    BIRTHDAY      STATUS_CODE
     00164         Toliver          Alvin        A
       146 Parnell Place                                  Chocorua
          NH      03817         M      28-Mar-1947   1

    1 row selected
    SQL> --
    SQL> --
    SQL> -- The DEGREES table has two values of '00164'
    SQL> -- in the EMPLOYEE_ID column:
    SQL> --
    SQL> SELECT * FROM DEGREES D WHERE D.EMPLOYEE_ID = '00164';
     EMPLOYEE_ID   COLLEGE_CODE   YEAR_GIVEN   DEGREE   DEGREE_FIELD
     00164         PRDU                 1973   MA       Applied Math
     00164         PRDU                 1982   PhD      Statistics
    2 rows selected
    SQL> --
    SQL> --
    SQL> -- The JOB_HISTORY table has the value of '00164' in
    SQL> -- several rows in the EMPLOYEE_ID column:
    SQL> --
    SQL> SELECT * FROM JOB_HISTORY JH WHERE JH.EMPLOYEE_ID = '00164';
     EMPLOYEE_ID   JOB_CODE   JOB_START     JOB_END       DEPARTMENT_CODE
       SUPERVISOR_ID
     00164         DMGR       21-Sep-1981   NULL          MBMN
       00228

     00164         SPGM        5-Jul-1980   20-Sep-1981   MCBM
       00164

    2 rows selected
    SQL> --
    SQL> --
    SQL> -- The SALARY_HISTORY table has a value of '00164'
    SQL> -- in several rows in the EMPLOYEE_ID column:
    SQL> --
    SQL> SELECT * FROM SALARY_HISTORY SH WHERE SH.EMPLOYEE_ID = '00164';
     EMPLOYEE_ID   SALARY_AMOUNT   SALARY_START   SALARY_END
     00164            $26,291.00    5-Jul-1980     2-Mar-1981
     00164            $51,712.00   14-Jan-1983    NULL
     00164            $26,291.00    2-Mar-1981    21-Sep-1981
     00164            $50,000.00   21-Sep-1981    14-Jan-1983
    4 rows selected
    SQL> --
    SQL> --
    SQL> -- The DEPARTMENTS table has a value of '00164'
    SQL> -- in the MANAGER_ID column:
    SQL> --
    SQL> SELECT * FROM DEPARTMENTS D WHERE D.MANAGER_ID = '00164';
     DEPARTMENT_CODE   DEPARTMENT_NAME                  MANAGER_ID
       BUDGET_PROJECTED   BUDGET_ACTUAL
     MBMN              Board Manufacturing North        00164
                   NULL            NULL

    1 row selected
    SQL> --
    SQL> --
    SQL> -- Test the trigger by deleting the row with a value of '00164'
    SQL> -- in the EMPLOYEE_ID column from the EMPLOYEES table:
    SQL> --
    SQL> DELETE FROM EMPLOYEES E WHERE E.EMPLOYEE_ID = '00164';
    1 row deleted
    SQL> --
    SQL> -- The row with a value of '00164' in the EMPLOYEE_ID column
    SQL> -- was deleted from the EMPLOYEES table:
    SQL> --
    SQL> SELECT * FROM EMPLOYEES E WHERE E.EMPLOYEE_ID = '00164';
    0 rows selected
    SQL> --
    SQL> -- The rows with a value of '00164' in the EMPLOYEE_ID column
    SQL> -- were deleted from the DEGREES table:
    SQL> --
    SQL> SELECT * FROM DEGREES D WHERE D.EMPLOYEE_ID = '00164';
    0 rows selected
    SQL> --
    SQL> -- The rows with a value of '00164' in the EMPLOYEE_ID
    SQL> -- column were deleted from the JOB_HISTORY table:
    SQL> --
    SQL> SELECT * FROM JOB_HISTORY JH WHERE JH.EMPLOYEE_ID = '00164';
    0 rows selected
    SQL> --
    SQL> -- The rows with a value of '00164' in the EMPLOYEE_ID
    SQL> -- column were deleted from the SALARY_HISTORY table:
    SQL> --
    SQL> SELECT * FROM SALARY_HISTORY SH WHERE SH.EMPLOYEE_ID = '00164';
    0 rows selected
    SQL> --
    SQL> -- The value of '00164' in the MANAGER_ID column was set to null
    SQL> -- in the DEPARTMENTS table:
    SQL> --
    SQL> SELECT * FROM DEPARTMENTS D WHERE D.DEPARTMENT_CODE = 'MBMN';
     DEPARTMENT_CODE   DEPARTMENT_NAME                  MANAGER_ID
       BUDGET_PROJECTED   BUDGET_ACTUAL
     MBMN              Board Manufacturing North        NULL
                   NULL            NULL

    1 row selected
    SQL> --
    SQL> ROLLBACK;

    Example 2: Defining a trigger that performs an update

    Before the STATUS_CODE column in WORK_STATUS table is updated,
    the STATUS_CODE_CASCADE_UPDATE trigger in the following SQL
    procedure updates the associated rows in the EMPLOYEES table. The
    REFERENCING clause specifies OLD_WORK_STATUS as the correlation
    name for the values in the WORK_STATUS table before the UPDATE
    statement executes, and NEW_WORK_STATUS as the correlation
    name for the values in the WORK_STATUS table after the UPDATE
    statement executes.

    SQL> -- Display the STATUS_CODE_CASCADE_UPDATE trigger in
    SQL> -- the sample database:
    SQL> --
    SQL> SHOW TRIGGER STATUS_CODE_CASCADE_UPDATE
         STATUS_CODE_CASCADE_UPDATE
     Source:
       STATUS_CODE_CASCADE_UPDATE
                           BEFORE UPDATE OF STATUS_CODE ON WORK_STATUS
                              REFERENCING OLD AS OLD_WORK_STATUS
                                          NEW AS NEW_WORK_STATUS
                           (UPDATE EMPLOYEES E
                            SET E.STATUS_CODE = NEW_WORK_STATUS.STATUS_CODE
                            WHERE E.STATUS_CODE = OLD_WORK_STATUS.STATUS_CODE)
                              FOR EACH ROW
    SQL> --
    SQL> -- Change the STATUS_CODE column with a value of 2 to a value of 3:
    SQL> --
    SQL> UPDATE WORK_STATUS WS SET STATUS_CODE="3" WHERE STATUS_CODE="2";
    1 row updated
    SQL> --
    SQL> -- The trigger changes any STATUS_CODE column in the EMPLOYEES table
    SQL> -- with a value of 2 to a value of 3. Therefore, no rows are
    SQL> -- selected for the first query that follows, but several are selected
    SQL> -- for the second query:
    SQL> --
    SQL> SELECT * FROM EMPLOYEES E WHERE E.STATUS_CODE = "2";
    0 rows selected
    SQL> --
    SQL> SELECT * FROM EMPLOYEES E WHERE E.STATUS_CODE = "3";
     EMPLOYEE_ID   LAST_NAME        FIRST_NAME   MIDDLE_INITIAL
       ADDRESS_DATA_1              ADDRESS_DATA_2         CITY
          STATE   POSTAL_CODE   SEX    BIRTHDAY      STATUS_CODE
     00165         Smith            Terry        D
       120 Tenby Dr.                                      Chocorua
          NH      03817         M      15-May-1954   3

     00178         Goldstone        Neal         NULL
       194 Lyons Av,                                      Colebrook
          NH      03576         M      25-Apr-1952   3

       .
       .
       .
     00358         Lapointe         Jo Ann       C
       70 Tenby Dr.                                       Chocorua
          NH      03817         F      24-Feb-1931   3

    12 rows selected
    SQL> --
    SQL> ROLLBACK;

    Example 3: Defining a trigger that updates a sales summary

    The following example defines a trigger that updates a monthly
    sales total after each daily sale is made.

    SQL> --
    SQL> -- Create the table to keep track of monthly sales:
    SQL> CREATE TABLE MONTHLY_SALES
    cont> ( SALES_AMOUNT INTEGER);
    SQL> --
    SQL> -- Create the table to keep track of sales made today:
    SQL> CREATE TABLE DAILY_SALES
    cont> ( SALES_AMOUNT INTEGER);
    SQL> --
    SQL> -- Assume that $250.00 of sales have been made during the current month:
    SQL> INSERT INTO MONTHLY_SALES
    cont> (SALES_AMOUNT) VALUES (250);
    1 row inserted
    SQL> --
    SQL> -- After adding a new value to the SALES_AMOUNT column in
    SQL> -- DAILY_SALES table, SQL updates the SALES column in
    SQL> -- the MONTHLY_SALES table with the amount of the new sale:
    SQL> CREATE TRIGGER UPDATE_SALES_TOTAL_ON_NEW_SALE
    cont> AFTER INSERT ON DAILY_SALES
    cont>   (UPDATE MONTHLY_SALES M
    cont>       SET M.SALES_AMOUNT = M.SALES_AMOUNT + DAILY_SALES.SALES_AMOUNT)
    cont> FOR EACH ROW;
    SQL> --
    SQL> -- The following statement records a new $5.00 sale for today:
    SQL> INSERT INTO DAILY_SALES
    cont> (SALES_AMOUNT) VALUES (5);
    1 row inserted
    SQL> --
    SQL> -- The value for the SALES_AMOUNT column of the DAILY_SALES table
    SQL> -- is $5.00 and the value of the SALES_AMOUNT column of the
    SQL> -- MONTHLY_SALES table is $255.00:
    SQL> SELECT * FROM DAILY_SALES;
     SALES_AMOUNT
                5
    1 row selected
    SQL> --
    SQL> SELECT * FROM MONTHLY_SALES;
     SALES_AMOUNT
              255
    1 row selected
    SQL> --
    SQL> -- When a new $9.00 sale is made, the values in the two rows of the
    SQL> -- SALES_AMOUNT column of the DAILY_SALES table are $5.00 and $9.00
    SQL> -- and the value of the SALES_AMOUNT column of the MONTHLY_SALES
    SQL> -- table is $264.00:
    SQL> INSERT INTO DAILY_SALES
    cont> (SALES_AMOUNT) VALUES (9);
    1 row inserted
    SQL> --
    SQL> SELECT * FROM DAILY_SALES;
     SALES_AMOUNT
                5
                9
    2 rows selected
    SQL> --
    SQL> SELECT * FROM MONTHLY_SALES;
     SALES_AMOUNT
              264
    1 row selected
    SQL> --
    SQL> ROLLBACK;
    SQL> --

    Example 4: Defining a trigger that sets column values to null

    Before the STATUS_CODE column in the WORK_STATUS table is
    deleted, this trigger causes the associated WORK_STATUS columns
    in the EMPLOYEES table to be set to null.

    SQL> CREATE TRIGGER STATUS_CODE_ON_DELETE_SET_NULL
    cont>  BEFORE DELETE ON WORK_STATUS
    cont>   (UPDATE EMPLOYEES E  SET E.STATUS_CODE = NULL
    cont>    WHERE E.STATUS_CODE = WORK_STATUS.STATUS_CODE)
    cont>  FOR EACH ROW;
    SQL> --
    SQL> -- Delete any row in the WORK_STATUS table where the STATUS_CODE
    SQL> -- column has a value of 1:
    SQL> DELETE FROM WORK_STATUS WS WHERE WS.STATUS_CODE = "1";
    1 row deleted
    SQL> --
    SQL> -- This trigger sets the STATUS_CODE column value to null in many
    SQL> -- rows in the EMPLOYEES table:
    SQL> SELECT * FROM EMPLOYEES E WHERE E.STATUS_CODE IS NULL;
     EMPLOYEE_ID   LAST_NAME        FIRST_NAME   MIDDLE_INITIAL
       ADDRESS_DATA_1              ADDRESS_DATA_2         CITY
          STATE   POSTAL_CODE   SEX    BIRTHDAY      STATUS_CODE
     00416         Ames             Louie        A
       61 Broad st.                NULL                   Alton
          NH      03809         M      13-Apr-1941   NULL

     00374         Andriola         Leslie       Q
       111 Boston Post Rd.         NULL                   Salisbury
          NH      03268         M      19-Mar-1955   NULL
       .
       .
       .

     00200         Ziemke           Al           F
        121 Putnam Hill Rd.         NULL                   Winnisquam
              NH      03289         M      27-Oct-1928   NULL

    88 rows selected
    SQL> ROLLBACK;

    Example 5: Defining a trigger that prevents deletion of a row
    that exists in two tables

    Suppose that a user wants to delete only those rows in the JOB_
    HISTORY table that do not also exist in the JOBS table. This is
    difficult to do with constraints because a row can exist in one
    table with a key number that does not exist in the other table.
    The following statement creates a trigger that causes an error
    when the user tries to delete a row that exists in table JOB_
    HISTORY.

    SQL> CREATE TRIGGER DELETE_GUARD
    cont> BEFORE DELETE ON JOB_HISTORY
    cont> WHEN EXISTS (SELECT JOBS.JOB_CODE FROM JOBS
    cont> WHERE JOBS.JOB_CODE=JOB_HISTORY.JOB_CODE)
    cont> (ERROR) FOR EACH ROW;
    SQL> --
    SQL> -- Now attempt a deletion that violates the trigger.
    SQL> --
    SQL> DELETE FROM JOB_HISTORY WHERE JOB_CODE = 'DMGR';
    %RDB-E-TRIG_INV_UPD, invalid update; encountered error condition
    defined for trigger
    -RDMS-E-TRIG_ERROR, trigger DELETE_GUARD forced an error
    -RDB-F-ON_DB, on database DISK1:[DEPT3.SQL]MF_PERSONNEL.RDB;1

    Example 6: Defining a trigger that saves audit information

    SQL> -- Create new table to record changes made to
    SQL> -- EMPLOYEES table
    SQL> CREATE TABLE AUDIT_TRAIL
    cont> (LOG DATE VMS,
    cont>  PERSON CHAR(31),
    cont> TBL_NAME CHAR(10),
    cont> OPER CHAR(1));
    SQL> COMMIT;

    SQL> -- Create a trigger so that each time
    SQL> -- an INSERT operation is performed,
    SQL> -- a record is stored in the AUDIT_TRAIL table.
    SQL> CREATE TRIGGER EMPS_TRIGGER
    cont> AFTER INSERT
    cont> ON EMPLOYEES
    cont> (INSERT INTO AUDIT_TRAIL
    cont> VALUES (CURRENT_TIMESTAMP,
    cont>         CURRENT_USER, 'EMPLOYEES', 'I'))
    cont> FOR EACH STATEMENT;
    SQL> -- The AUDIT_TRAIL table currently has no records.
    SQL> SELECT * FROM AUDIT_TRAIL;
    0 rows selected
    SQL> -- Insert a record into EMPLOYEES
    SQL> INSERT INTO EMPLOYEES
    cont> (EMPLOYEE_ID, LAST_NAME)
    cont> VALUES ('00964', 'FRENCH');
    1 row inserted
    SQL> -- See if trigger updated the AUDIT_TRAIL table.
    SQL> SELECT * FROM AUDIT_TRAIL;
     LOG                       PERSON                            TBL_NAME     OPER
     17-JUN-2003 15:04:31.43   STEWART                           EMPLOYEES    I
    1 row selected

    Example 7: Using TRACE as a trigger action

    SQL> set flags 'TRACE';
    SQL> create table M_TABLE (a integer, b integer);
    SQL>
    SQL> create trigger T_A
    cont>     after insert on M_TABLE
    cont>     (trace 'in a trigger: ' || cast(M_TABLE.a as varchar(10)))
    cont>     for each row;
    SQL>
    SQL> insert into M_TABLE (a, b) values (1, 10);
    ~Xt: in a trigger: 1
    1 row inserted
    SQL>

    Example 8: Using SIGNAL as a trigger action

    SQL> create table M_TABLE (a integer, b integer);
    SQL>
    SQL> create trigger T_A
    cont>     after insert on M_TABLE2
    cont>     when (M_TABLE2.a is not null)
    cont>         (signal '12345' ('in a trigger: '
    cont>                          || cast(M_TABLE2.a as varchar(10))))
    cont>     for each row;
    SQL>
    SQL> insert into M_TABLE2 (a, b) values (1, 10);
    %RDB-E-SIGNAL_SQLSTATE, routine "T_A" signaled SQLSTATE "12345"
    -RDB-I-TEXT, in a trigger: 1
    SQL>

    Example 9: Using CALL as a trigger action

    SQL> create module M_MODULE
    cont>   language SQL
    cont>
    cont>   procedure M_K (in :a int);
    cont>     trace 'called from a trigger: ' || cast(:a as varchar(10));
    cont>
    cont> end module;
    SQL>
    SQL> create table M_TABLE (a integer, b integer);
    SQL>
    SQL> create trigger T_A
    cont>     after insert on M_TABLE
    cont>     (call M_K (M_TABLE.a))
    cont>     for each row;
    SQL>
    SQL> insert into M_TABLE (a, b) values (1, 10);
    ~Xt: called from a trigger: 1
    1 row inserted
    SQL>

21  –  USER

    Creates a special security profile entry to identify a database
    user. That user can be granted roles, which in turn provide
    access to database objects.

21.1  –  Environment

    You can use the CREATE USER statement:

    o  In interactive SQL

    o  Embedded in host language programs

    o  As part of a procedure in an SQL module or other compound
       statement

    o  In dynamic SQL as a statement to be dynamically executed

21.2  –  Format

  CREATE USER --+---> <username> ----> IDENTIFIED EXTERNALLY --+-----+
                +---> PUBLIC ----------------------------------+     |
  +------------------------------------------------------------------+
  +-------------+-------------------------------+-------------------->
                +---> create-user-opts ---------+

  create-user-opts =

  -+-> ACCOUNT --+->LOCK ---+---------------------+-->
   |             +->UNLOCK -+                     |
   +-> COMMENT IS -+-> '<string>' --+-------------+
   |               +------- / <-----+             |
   +-> NO PROFILE  -------------------------------+
   +-> PROFILE <profile_name> --------------------+

21.3  –  Arguments

21.3.1  –  ACCOUNT lock-option

    Syntax options:

    ACCOUNT LOCK | ACCOUNT UNLOCK

    The ACCOUNT LOCK clause disables access to the database by the
    user for whom the CREATE USER statement is being applied. The
    ACCOUNT UNLOCK clause allows that user access to the database.

    The ACCOUNT UNLOCK clause is the default.

21.3.2  –  COMMENT IS 'string'

    Adds a comment about the user. SQL displays the text of the
    comment when it executes a SHOW USERS statement. Enclose the
    comment in single quotation marks (') and separate multiple lines
    in a comment with a slash mark (/).

21.3.3  –  IDENTIFIED_EXTERNALLY

    Indicates that the user will be authenticated through the
    operating system.

21.3.4  –  PROFILE

    Syntax options:

    PROFILE | NOPROFILE

    Identifies a new profile for assignment to the user. The
    specified profile name must be the name of an existing profile.

    NOPROFILE is the default behavior and indicates that no special
    restrictions are applied to this user.

21.3.5  –  PUBLIC

    Explicitly creates a PUBLIC security profile entry in the
    database.

21.3.6  –  username

    The name of the user to add to the database. This must match the
    name of an existing OpenVMS username.

21.4  –  Examples

    Example 1: Creating a New User and Locking Her Account

    SQL> CREATE USER munroy IDENTIFIED EXTERNALLY
    cont> ACCOUNT LOCK
    cont> COMMENT IS 'User munroy starts job on'/
    cont> 'May 1, 2003.  Unlock when she starts';

    Example 2: Adding a profile to a user

    This example creates a new profile that defines the DEFAULT
    transaction and then assigns a profile while creating a new user.
    The next time the user attaches to the database the START DEFAULT
    TRANSACTION statement will use the defined profile instead of the
    standard READ ONLY default.

    SQL> create profile READ_COMMITTED
    cont> default transaction read write isolation level read committed wait 30;
    SQL> show profile READ_COMMITTED
          READ_COMMITTED
          Default transaction read write wait 30
            Isolation level read committed
    SQL> create user JAIN identified externally profile READ_COMMITTED;
    SQL> show user JAIN;
          JAIN
          Identified externally
          Account is unlocked
          Profile: READ_COMMITTED
          No roles have been granted to this user

22  –  VIEW

    Creates a view definition. A view is a logical structure that
    refers to rows stored in other tables. Data in a view is not
    physically stored in the database. You can include in a view
    definition combinations of rows and columns from other tables and
    view definitions in the schema. You define a view by specifying a
    select expression, that:

    o  Names the criteria for selecting the tables, rows, and columns
       for the view

    o  Specifies a set of columns from those tables

    When the CREATE VIEW statement executes, SQL adds the view
    definition to the physical database. If you declared the schema
    with the PATHNAME argument, the definition is also stored in the
    repository.

22.1  –  Environment

    You can use the CREATE VIEW statement:

    o  In interactive SQL

    o  Embedded in host language programs to be precompiled

    o  As part of a procedure in an SQL module

    o  In dynamic SQL as a statement to be dynamically executed

22.2  –  Format

  CREATE VIEW --> <view-name> -------------------------+
    +--------------------------------------------------+
    ++-----------------------------------+-------------+
     +-> STORED NAME IS <stored-name> ---+             |
  +----------------------------------------------------+
  ++------------------------>------------------------+-+
   +-> ( -+-> <column-name> -+--------------+-+-> ) -+ |
          | +----------------+              | |        |
          | ++-+------------------------+-+-+ |        |
          |  | +-> sql-and-dtr-clause --+ |   |        |
          |  +-------------<--------------+   |        |
          +----------------- , <--------------+        |
  +----------------------------------------------------+
  +-> AS select-expr ---+------------------------+-->
                        +-> check-option-clause -+

  select-expr =

  -+-+->  select-clause  ------------+-+------+
   | +-> ( select-expr )  -----------+ |      |
   | +->   TABLE table-ref ----------+ |      |
   +------ select-merge-clause <-------+      |
     +------------------- <-------------------+
     +-+--------------------+--+------------------+--+--------------------+->
       +-> order-by-clause -+  +-> offset-clause -+  +-> limit-to-clause -+

  sql-and-dtr-clause =

  -+-> QUERY HEADER IS -+> <quoted-string> +-------------------+->
   |                    +------ / <--------+                   |
   +-> EDIT STRING IS <quoted-string> -------------------------+
   |                                                           |
   +-> QUERY NAME FOR -+-> DTR --------+-> IS <quoted-string> -+
   |                   +-> DATATRIEVE -+                       |
   +-> DEFAULT VALUE FOR -+-> DTR --------+-> IS literal   ----+
                          +-> DATATRIEVE -+

  check-option-clause =

  WITH CHECK OPTION --+----------------------------------+-->
                      +-> CONSTRAINT <check-option-name> +

22.3  –  Arguments

22.3.1  –  check-option-clause

    A constraint that places restrictions on update operations made
    to a view. The check option clause ensures that any rows that are
    inserted or updated in a view conform to the definition of the
    view. Do not specify the WITH CHECK OPTION clause with views that
    are read-only.

22.3.2  –  column-name

    A list of names for the columns of the view. If you omit column
    names, SQL assigns the names from the columns in the source
    tables in the select expression.

    However, you must specify names for all the columns of the view
    in the following cases:

    o  The select expression generates columns with duplicate names.

    o  The select expression uses statistical functions or arithmetic
       expressions to create new columns that are not in the source
       tables.

22.3.3  –  CONSTRAINT

    Specify a name for the WITH CHECK OPTION constraint. If you omit
    the name, SQL creates a name. However, Oracle Rdb recommends that
    you always name constraints. If you supply a name for the WITH
    CHECK OPTION constraint, the name must be unique in the schema.

    The name for the WITH CHECK OPTION constraint is used by the
    INTEG_FAIL error message when an INSERT or UPDATE statement
    violates the constraint.

22.3.4  –  select-expr

    A select expression that defines which columns and rows of the
    specified tables SQL includes in the view. The select expression
    for a nonmultischema database can name only tables in the same
    schema as the view. A select expression for a multischema
    database can name a table in any schema in the database; the
    schema need not be in the same catalog as the view being created.
    See the Select_Expressions HELP topic for more information on
    select expressions.

22.3.5  –  sql-and-dtr-clause

    Optional SQL and DATATRIEVE formatting clauses. See the
    DATATRIEVE HELP topic for more information on formatting clauses.

22.3.6  –  STORED_NAME_IS

    Specifies a name that Oracle Rdb uses to access a view created
    in a multischema database. The stored name allows you to access
    multischema definitions using interfaces, such as Oracle RMU,
    the Oracle Rdb management utility, that do not recognize multiple
    schemas in one database. You cannot specify a stored name for
    a view in a database that does not allow multiple schemas. For
    more details about stored names, see the User_Supplied_Names HELP
    topic.

22.3.7  –  view-name

    Name of the view definition you want to create. When choosing a
    name, follow these rules:

    o  Use a name that is unique among all view and table names in
       the schema.

    o  Use any valid SQL name (see the User_Supplied_Names HELP topic
       for more information).

22.4  –  Examples

    Example 1: Defining a view based on a single table

    This example shows a view definition that uses three columns from
    a single table, EMPLOYEES.

    SQL> CREATE VIEW EMP_NAME
    cont>   AS SELECT
    cont>           FIRST_NAME,
    cont>           MIDDLE_INITIAL,
    cont>           LAST_NAME
    cont>      FROM EMPLOYEES;
    SQL> --
    SQL> -- Now display the rows from the view just created.
    SQL> SELECT * FROM EMP_NAME;
     FIRST_NAME   MIDDLE_INITIAL   LAST_NAME
     Alvin        A                Toliver
     Terry        D                Smith
                   .
                   .
                   .

    Example 2: Defining a view that does not allow you to insert or
    update rows that do not conform to the view's definition

    This example shows a view definition using the WITH CHECK OPTION
    clause.

    SQL>  CREATE VIEW ADMN_VIEW
    cont>        AS SELECT * FROM JOB_HISTORY
    cont>        WHERE DEPARTMENT_CODE = 'ADMN'
    cont>        WITH CHECK OPTION CONSTRAINT ADMN_VIEW_CONST;
    SQL> -- You cannot insert a row that does not
    SQL> -- conform to the view definition.
    SQL> --
    SQL>  INSERT INTO ADMN_VIEW (DEPARTMENT_CODE) VALUES ('MBMN');
    %RDB-E-INTEG-FAIL, violation of constraint ADMN_VIEW_CONST-
    caused operation to fail

    Example 3: Defining a view based on multiple tables

    You can also define a view using more than one table.

    SQL> CREATE VIEW CURRENT_SALARY
    cont>  AS SELECT
    cont>        E.LAST_NAME,
    cont>        E.FIRST_NAME,
    cont>        E.EMPLOYEE_ID,
    cont>        SH.SALARY_START,
    cont>        SH.SALARY_AMOUNT
    cont>      FROM
    cont>        SALARY_HISTORY SH, EMPLOYEES E
    cont>      WHERE
    cont>        SH.EMPLOYEE_ID = E.EMPLOYEE_ID
    cont>      AND
    cont>        SH.SALARY_END IS NULL           ;

    This example defines a view from the EMPLOYEES and SALARY_HISTORY
    tables. It uses the select expression to:

    o  Choose the columns derived from each table. Because no column
       names are specified before the select expression, the columns
       inherit the names from the source tables.

    o  Join the tables and limit the view to current salaries.

    Example 4: Defining a view with local column names

    SQL> CREATE VIEW EMP_JOB
    cont>      ( CURRENT_ID,
    cont>        CURRENT_NAME,
    cont>        CURRENT_JOB,
    cont>        SUPERVISOR   )
    cont>  AS SELECT
    cont>        E.EMPLOYEE_ID,
    cont>        E.LAST_NAME,
    cont>        J.JOB_TITLE,
    cont>        JH.SUPERVISOR_ID
    cont>     FROM
    cont>        EMPLOYEES E,
    cont>        JOB_HISTORY JH,
    cont>        JOBS J
    cont>     WHERE
    cont>        E.EMPLOYEE_ID = JH.EMPLOYEE_ID
    cont>     AND
    cont>        JH.JOB_CODE = J.JOB_CODE
    cont>     AND
    cont>        JH.JOB_END IS NULL      ;

    This view definition:

    o  Specifies local names for the columns in the view.

    o  Joins the EMPLOYEES and JOB_HISTORY tables. This join links
       rows in the EMPLOYEES table to rows in the JOB_HISTORY table.

    o  Joins the JOB_HISTORY and JOBS tables. This join lets the view
       contain job titles instead of job codes.

    o  Uses the JH.JOB_END IS NULL expression. This clause specifies
       that only the current JOB_HISTORY rows, where the JOB_END
       column is null, should be included in the view.

    The following query uses the view defined in the previous
    example:

    EXEC SQL
            DECLARE X CURSOR FOR
            SELECT  CURRENT_ID, CURRENT_NAME, CURRENT_JOB, SUPERVISOR
            FROM    EMP_JOB
    END-EXEC

    EXEC SQL
            OPEN X
    END-EXEC

    PERFORM WHILE SQLCODE NOT = 0

            EXEC SQL
                    FETCH X
                    INTO :ID, :NAME, :JOB, :SUPER
            END-EXEC

    END PERFORM

    EXEC SQL
            CLOSE X
    END-EXEC

    Example 5: Defining a view with a calculated column

    This example shows a view definition that derives a column
    through a calculation based on a column in an base table.

    SQL> CREATE VIEW SS_DEDUCTION
    cont>        ( IDENT,
    cont>          SALARY,
    cont>          SS_AMOUNT )
    cont>  AS SELECT
    cont>        E.EMPLOYEE_ID,
    cont>        SH.SALARY_AMOUNT,
    cont>        SH.SALARY_AMOUNT * 0.065
    cont>      FROM
    cont>        SALARY_HISTORY SH, EMPLOYEES E
    cont>      WHERE
    cont>        SH.EMPLOYEE_ID = E.EMPLOYEE_ID
    cont>      AND
    cont>        SH.SALARY_END IS NULL   ;

    Each time the view column SS_AMOUNT is selected, it computes a
    new value from the SALARY_AMOUNT column of the SALARY_HISTORY
    table.

    Example 6: Defining a view dependent on another view

    This example creates a view, DEPENDENT_VIEW, that refers to
    the CURRENT_JOB view in its definition to include current job
    information for employees in the engineering department.

    SQL> CREATE VIEW DEPENDENT_VIEW
    cont>   AS SELECT * FROM CURRENT_JOB
    cont>           WHERE DEPARTMENT_CODE = 'ENG';
Close Help