VMS Help  —  RDML72  Statements

1  –  ANY

    Tests for the presence of any record in a record stream.

    An ANY conditional expression is true if the record stream
    specified by the record selection expression includes at least
    one record. If you precede the ANY expression with the optional
    NOT qualifier, the condition is true if there are no records in
    the record stream.

1.1  –  Examples

    The following programs demonstrate the use of the ANY conditional
    expression. These programs create a record stream containing
    all the records from the SALARY_HISTORY relation that hold a
    value greater than fifty thousand in the field SALARY_AMOUNT.
    These programs then print an informational message if one or more
    records are found that meet the above condition. Note that the
    host language print statements do not have access to the context
    created in the if statement.

1.1.1  –  C Example

    #include <stdio.h>

    DATABASE PERS = FILENAME "PERSONNEL";

    int who;

    main()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    GET
     who = ANY SH IN SALARY_HISTORY WITH SH.SALARY_AMOUNT > 50000.00;
    END_GET;

    COMMIT;

    if (who)
        printf ("Someone is not underpaid \n");

    FINISH;
    }

1.1.2  –  Pascal Example

    program anycond (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    who : boolean;

    begin
    READY PERS;
    START_TRANSACTION READ_WRITE;

    GET
     who = ANY SH IN SALARY_HISTORY WITH SH.SALARY_AMOUNT > 50000.00
    END_GET;

    COMMIT;

    if (who) then
       writeln ('Someone is not underpaid.');

    FINISH;
    end.

1.2  –  Format

  (B)0any-clause =

  qqqwqqq>qqqqqqqqwqq> ANY qqqwqq>qqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqqk
     mqqq> NOT qqqj           mqq> handle-options qj                 x
                                                                     x
     lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
     x
     mqqqqqqqqqqqqqqqqqqqqqq> rse qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq>

  (B)0handle-options =

  q> ( qwqqqqqq>  REQUEST_HANDLE  qqqqq>  var qqqqqqqqwq> ) q>
        tqqqqqq> TRANSACTION_HANDLE qqq>  var qqqqqqqqu
        mqqqqqq> REQUEST_HANDLE q> var q> , qqqqqqqk  x
          lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj  x
          mqqqq> TRANSACTION_HANDLE q> var qqqqqqqqqqqj

1.2.1  –  Format arguments

    rse                    A record selection expression. A phrase
                           that defines specific conditions that
                           individual records must meet before
                           Oracle Rdb includes them in a record stream.

    handle-options         A request handle, a transaction handle, or
                           both.

    REQUEST_HANDLE var     The REQUEST_HANDLE keyword followed by a
                           host language variable. A request handle
                           identifies a compiled Oracle Rdb request.
                           If you do not supply a request handle
                           explicitly, RDML associates a unique
                           request handle for the compiled request.

    TRANSACTION_HANDLE     The TRANSACTION_HANDLE keyword followed by
    var                    a host language variable. A transaction
                           handle identifies a transaction. If
                           you do not supply a transaction handle
                           explicitly, RDML uses the default
                           transaction handle.

2  –  Arithmetic Expr

    Use an arithmetic expression to combine value expressions and
    arithmetic operators. When you use an arithmetic expression in
    a statement, Oracle Rdb calculates the value associated with the
    expression and uses that value when executing the statement.
    Therefore, an arithmetic expression must result in a value. If
    either operand of an arithmetic expression is a missing value,
    the resultant value also is a missing value.

2.1  –  Examples

    The following programs demonstrate the use of the multiplication
    (*) arithmetic operator and the MODIFY statement. These programs
    select the record of an employee in the SALARY_HISTORY relation
    with a specified employee ID and that has no value for SALARY_
    END. The purpose of specifying no value for SALARY_END is to
    ensure that the only salary amount affected is the employee's
    present salary. Next, the programs multiply the employee's
    salary by 1.1 to produce an increase of ten percent in his or
    her salary. The MODIFY statement replaces the old value in this
    employee's SALARY_AMOUNT field with the new value.

2.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    READY PERS;
    START_TRANSACTION READ_WRITE;

    FOR SH IN SALARY_HISTORY
       WITH SH.EMPLOYEE_ID = "00164"
       AND SH.SALARY_END MISSING
          MODIFY SH USING
             SH.SALARY_AMOUNT = SH.SALARY_AMOUNT * 1.1;
          END_MODIFY;
    END_FOR;

    ROLLBACK;
    FINISH;
    }

2.1.2  –  Pascal Example

    program multiply (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_WRITE;

    FOR SH IN SALARY_HISTORY
       WITH SH.EMPLOYEE_ID = '00164'
       AND SH.SALARY_END MISSING
          MODIFY SH USING
             SH.SALARY_AMOUNT := SH.SALARY_AMOUNT * 1.1;
          END_MODIFY;
    END_FOR;

    ROLLBACK;
    FINISH;
    end.

2.2  –  Format

  (B)0arith-expr =

  qwq> numeric-value    qwqqwqq> + qqwqqwq> numeric-value    qwqqq>
   tq> numeric-host-var qu  tqq> - qqu  tq> numeric-host-var qu
   mq> numeric-db-field qj  tqq> * qqu  mq> numeric-db-field qj
                            mqq> / qqj

2.2.1  –  Format arguments

    numeric-value          A numeric literal.

    numeric-host-var       A host language variable that holds a
                           numeric value.

    numeric-db-field       A database field (qualified with a context
                           variable) that holds a numeric value.

    + - * /                Arithmetic operators. The following table
                           lists the arithmetic operators and their
                           functions.

     Operator     Function
    --------------------------
     +            Add

     -            Subtract

     *            Multiply

     /            Divide
    --------------------------

3  –  AVERAGE

    Determines the arithmetic mean of values for all records
    specified by a record selection expression.

3.1  –  Examples

    The following programs demonstrate the use of the AVERAGE
    function in a display statement. These programs:

    o  Use a record selection expression to form a record stream from
       the view CURRENT_INFO, consisting of the records for which the
       value in the SALARY field is greater than 50000.00

    o  Calculate the average salary for these selected records

    o  Print this average

3.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    double mean;
    main()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    GET
     mean = AVERAGE CI.SALARY OF CI IN CURRENT_INFO
            WITH CI.SALARY > 50000.00;
    END_GET;

    COMMIT;

    printf ("Average is: %f\n",mean);

    FINISH;
    }

3.1.2  –  Pascal Example

    program average_function (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    var
    mean : double;
    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    GET
      mean = AVERAGE SH.SALARY_AMOUNT OF SH IN SALARY_HISTORY
             WITH SH.SALARY_AMOUNT > 50000.00;
    END_GET;

    COMMIT;

    writeln ('Average is: ', mean:10:2);

    FINISH;
    end.

3.2  –  Format

  (B)0
  qq> AVERAGE qqqqwqqqqqqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqqqqqqqqqqqk
                  mqq> handle-options qqj                          x
                                                                   x
   lqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
   x
   mqqqqqqqqqqqq value-expr qqqqqqq> OF qqqqqqqqq> rse qqqqqqqqqqq>

  (B)0handle-options =

  q> ( qwqqqqqq>  REQUEST_HANDLE  qqqqq>  var qqqqqqqqwq> ) q>
        tqqqqqq> TRANSACTION_HANDLE qqq>  var qqqqqqqqu
        mqqqqqq> REQUEST_HANDLE q> var q> , qqqqqqqk  x
          lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj  x
          mqqqq> TRANSACTION_HANDLE q> var qqqqqqqqqqqj

3.2.1  –  Format arguments

    value-expr             A value expression. A symbol or a string
                           of symbols used to calculate a value. When
                           you use a value expression in a statement,
                           Oracle Rdb calculates the value associated
                           with the expression and uses that value
                           when executing the statement.

    rse                    A record selection expression. A phrase
                           that defines specific conditions that
                           individual records must meet before
                           Oracle Rdb includes them in a record stream.

    handle-options         A request handle, a transaction handle, or
                           both.

    REQUEST_HANDLE var     The REQUEST_HANDLE keyword followed by a
                           host language variable. A request handle
                           identifies a compiled Oracle Rdb request.
                           If you do not supply a request handle
                           explicitly, RDML associates a unique
                           request handle for the compiled request.

    TRANSACTION_HANDLE     The TRANSACTION_HANDLE keyword followed by
    var                    a host language variable. A transaction
                           handle identifies a transaction. If
                           you do not supply a transaction handle
                           explicitly, RDML uses the default
                           transaction handle.

4  –  BASED_ON

    The BASED ON clause lets you extract from the database the
    data type and size of a field and then use it to declare host
    language types. These are Pascal TYPE(s), and C typedef(s). When
    you preprocess your program, the RDML preprocessor assigns the
    data type and size attributes associated with the field to the
    variable or function you declare using the the BASED ON clause.

    See the DECLARE_VARIABLE statement for information on declaring
    host language variables.

4.1  –  Examples

    The following programs demonstrate the use of the BASED ON clause
    to declare types. Both the C and Pascal programs use the BASED
    ON clause to declare the function, job_name. These programs pass
    the value of the field JOB_CODE to the function. The function
    determines the job title associated with the job code and passes
    the job title back to the calling program. Note that in the C
    program a program variable, temp_job_name, is required so that
    the function can return the job title to the calling program.
    In Pascal, function values are returned to the calling program
    automatically.

4.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    typedef  BASED ON JOBS.JOB_CODE job_code_type;
    typedef  BASED ON JOBS.JOB_TITLE job_title_type;
    DECLARE_VARIABLE temp_job_name SAME AS JOBS.JOB_TITLE;

    job_title_type job_name(job)
    job_code_type job;
    { /* begin  function */
        READY PERS;
        START_TRANSACTION READ_ONLY;

        FOR FIRST 1 J IN JOBS
        WITH J.JOB_CODE = job
           strcpy (temp_job_name, J.JOB_TITLE);
        END_FOR;

        COMMIT;
        FINISH;
        return temp_job_name;
    } /* end of function */

    main ()
    {
    printf ("%s\n",job_name("APGM"));
    }

4.1.2  –  Pascal Example

    program based_on_clause (INPUT,OUTPUT);
    DATABASE PERS = FILENAME 'PERSONNEL';

    type
        job_code_type  = BASED ON JOBS.JOB_CODE;
        job_title_type = BASED ON JOBS.JOB_TITLE;

    function job_name (job : JOB_CODE_TYPE ) : JOB_TITLE_TYPE;

    begin {* function *}
        READY PERS;
        START_TRANSACTION READ_ONLY;

        FOR FIRST 1 J IN JOBS
        WITH J.JOB_CODE = job
              job_name := J.JOB_TITLE;
        END_FOR;

        COMMIT;
        FINISH;
    end; {* function *}

    begin {* main *}
    writeln (job_name ('APGM'));
    end.

4.2  –  Format

  (B)0BASED ON qqqqqwqq>qqqqqqqqqqqqqqqqqqqqwqqqqqqqqk
                mqq> db-handle qq> . qqqj        x
                                                 x
  lqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqj
  x
  mqqqqq> relation-name qqqq>  .  qqqq> field-name

4.2.1  –  Format arguments

    db-handle              Database handle. A host variable used
                           to refer to a specific database you have
                           invoked. For more information see the
                           entry on the Database Handle clause.

    relation-name          The name of a relation in the database.

    field-name             The name of a field in a relation. For
                           example, once you have defined E as
                           the context variable for the EMPLOYEES
                           relation, E.LAST_NAME is a value
                           expression that refers to a value from
                           the LAST_NAME field of EMPLOYEES.

5  –  BETWEEN

    Creates a record stream containing records with values that fall
    within a range you specify.

    The BETWEEN conditional expression is true (records are included
    in the stream) if the first value expression is between the
    second and third value expression, or equal to one of them.
    If you precede the BETWEEN expression with the optional NOT
    qualifier, the condition is true if there are no records within
    the range you specify with the second and third value expression.

    The BETWEEN conditional expression sorts records in ascending
    order by default. For information on sorting records see the
    entry on the SORT statement.

5.1  –  Examples

    The following programs demonstrate the use of the BETWEEN
    conditional expression with a numeric field. These programs form
    a record stream consisting of all the records in the relation
    CURRENT_SALARY where the field SALARY_AMOUNT contains a value
    greater than or equal to 10,000, and less than or equal to
    20,000. These programs print the last name and salary from of
    each record in the record stream.

5.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    READY PERS;
    START_TRANSACTION READ_WRITE;

    FOR CS IN CURRENT_SALARY
       WITH CS.SALARY_AMOUNT
       BETWEEN 10000.00 AND 20000.00
          printf ("%s %f\n", CS.LAST_NAME, CS.SALARY_AMOUNT);
    END_FOR;

    COMMIT;
    FINISH;
    }

5.1.2  –  Pascal Example

    program between_numeric (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR CS IN CURRENT_SALARY
       WITH CS.SALARY_AMOUNT
       BETWEEN 10000.00 AND 20000.00
          writeln (CS.LAST_NAME, CS.SALARY_AMOUNT :10:2);
    END_FOR;

    COMMIT;
    FINISH;
    end.

5.2  –  Format

  (B)0between-clause =

  qqqq> value-expr qqqqqwqq>qqqqqqqwqqq> BETWEEN qqqqk
                        mqq> NOT qqj                 x
       lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqj
       mqqq> value-expr qqq> AND qqq> value-expr qqqqqqq>

5.2.1  –  Format arguments

    value-expr             A value expression. A symbol or a string
                           of symbols used to calculate a value. When
                           you use a value expression in a statement,
                           Oracle Rdb calculates the value associated
                           with the expression and uses that value
                           when executing the statement.

6  –  COMMIT

    Ends a transaction and makes permanent all changes you made
    during that transaction.

6.1  –  Examples

    The following programs demonstrate the use of the commit
    statement to make permanent changes to a field value in a
    database. These programs:

    o  Use a record selection expression to find an employee in the
       EMPLOYEES relation with the ID number "00193"

    o  Use a MODIFY statement to change the field value of
       E.LAST_NAME for this employee

    Although this change is written to the database at the time of
    the MODIFY, the change is not permanent until the programs issue
    a COMMIT statement. After the programs issue the COMMIT statement
    the old value for E.LAST_NAME is not available.

    The C example uses the function pad_string to pad the name
    "Smith-Fields" with blanks. Blanks are appended to the name so
    that the length of the name matches the spaces reserved for it in
    the database definition for LAST_NAME.

6.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    extern void pad_string();

    main()
    {
    READY PERS;
    START_TRANSACTION READ_WRITE;

    FOR E IN EMPLOYEES WITH E.EMPLOYEE_ID = '00193'
       MODIFY E USING
         pad_string ("Smith-Fields", E.LAST_NAME, sizeof(E.LAST_NAME));
       END_MODIFY;
    END_FOR;

    COMMIT;
    FINISH;
    }

6.1.2  –  Pascal Example

    program commit_changes (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_WRITE;

    FOR E IN EMPLOYEES WITH E.EMPLOYEE_ID = '00193'
       MODIFY E USING
          E.LAST_NAME := 'Smith-Fields';
       END_MODIFY;
    END_FOR;

    COMMIT;
    FINISH;
    end.

6.2  –  Format

  (B)0COMMIT  qqwqq>qqqqqqqqqqqqqqqqqq>qqqqqqqqqqqqqqqqqqqqqwk
            mqq> ( qq> TRANSACTION_HANDLE qq> var qq>) qjx
                                                         x
            lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
            x
            mqqqqqqqqqqqwqq>qqqqqqqqqqqqqqqwqqqqqqqqqqqqqq>
                        mqq>  on-error  qqqj

6.2.1  –  Format arguments

    TRANSACTION_HANDLE     The TRANSACTION_HANDLE keyword followed by
    var                    a host language variable. A transaction
                           handle identifies a transaction. If
                           you do not supply a transaction handle
                           explicitly, RDML uses the default
                           transaction handle.

    on-error               The ON ERROR clause. Specifies host
                           language statement(s) to be performed
                           if an error occurs during the COMMIT
                           operation. For more information see the
                           entry on ON ERROR.

7  –  Cond Expr

    Represents the relationship between two value expressions.
    Sometimes called a Boolean expression, conditional expressions
    are used in the WITH clause of the record selection expression.

    The value of a conditional expression is true, false, or missing.

    The two types of conditional expressions are:

    o  Those that express a relationship between two value
       expressions, using a relational operator

       For example, the expression SH.SALARY_AMOUNT > 50000 is true
       if the value in the SALARY_AMOUNT field of the SALARY_HISTORY
       record is greater than 50000. When Oracle Rdb evaluates this
       expression, it examines the relationship between the two value
       expressions, SH.SALARY_AMOUNT and 50000.

    o  Those that express a characteristic of a single value
       expression

       For example, E.EMPLOYEE_ID MISSING is true if there is no
       value in the EMPLOYEE_ID field of an EMPLOYEES record.

    The RDML conditional expressions are:

    -  ANY

    -  BETWEEN

    -  CONTAINING

    -  MATCHING

    -  MISSING

    -  Relational Operators

    -  STARTING WITH

    -  UNIQUE

    For more information and the syntax diagram of each of these
    expressions, see the individual HELP entries.

7.1  –  Format

  (B)0qqqwq> conditional-expr qqqqqqqqqqqqqqqqq>qqqqqqqqqqqqqqwqqqqqq>
     tqqqqqqqqqqqqqqqqqqqqq> NOT qq> conditional-expr qqqqu
     tq> conditional-expr q> AND qq> conditional-expr qqqqu
     mq> conditional-expr q> OR  qq> conditional-expr qqqqj

  (B)0conditional-expr =

   qwqqq> value-expr qq> rel-operator qq> value-expr qqwqq>
    tqqq> any-clause qqqqqqqqqqqqqqqq>qqqqqqqqqqqqqqqqqu
    tqqq> between-clause qqqqqqqqqqqq>qqqqqqqqqqqqqqqqqu
    tqqq> containing-clause qqqqqqqqq>qqqqqqqqqqqqqqqqqu
    tqqq> matching-clause qqqqqqqqqqq>qqqqqqqqqqqqqqqqqu
    tqqq> missing-clause qqqqqqqqqqqq>qqqqqqqqqqqqqqqqqu
    tqqq> starting-with-clause qqqqqq>qqqqqqqqqqqqqqqqqu
    mqqq> unique-clause qqqqqqqqqqqqq>qqqqqqqqqqqqqqqqqj

  (B)0rel-operator =

  qqqqwqq>  EQ  qqqwqqqqq>
      tqq>  =   qqqu
      tqq>  NE  qqqu
      tqq>  <>  qqqu
      tqq>  GT  qqqu
      tqq>  >   qqqu
      tqq>  GE  qqqu
      tqq>  >=  qqqu
      tqq>  LT  qqqu
      tqq>  <   qqqu
      tqq>  LE  qqqu
      mqq>  <=  qqqj

8  –  CONTAINING

    Tests for the presence of a specified string anywhere inside
    a string expression. A conditional expression that includes a
    CONTAINING clause is true if the string specified by the second
    (pattern) string expression is found within the string specified
    by the first (target) string expression. If either of the string
    expressions in a CONTAINING conditional expression is missing,
    the result is missing.

    If you precede the CONTAINING clause with the optional NOT
    qualifier, the condition is true if there are no records
    containing the specified string. CONTAINING is not case
    sensitive; it considers uppercase and lowercase forms of the
    same character to be a match.

8.1  –  Examples

    The following programs demonstrate the use of the CONTAINING
    conditional expression. These programs create a record stream
    containing all the records in the EMPLOYEES relation in which
    the LAST_NAME field contains the string "IACO" (in upper or lower
    case letters). These programs print the employee ID and last name
    from all the records contained in the record stream.

8.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR E IN EMPLOYEES
       WITH E.LAST_NAME CONTAINING "IACO"
          printf ("%s  %s\n", E.EMPLOYEE_ID,
                              E.LAST_NAME);
    END_FOR;

    COMMIT;
    FINISH;
    }

8.1.2  –  Pascal Example

    program containing (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR E IN EMPLOYEES
       WITH E.LAST_NAME CONTAINING 'IACO'
          writeln (E.EMPLOYEE_ID, ' ', E.LAST_NAME);
    END_FOR;

    COMMIT;
    FINISH;
    end.

8.2  –  Format

  (B)0containing-clause =

    qqq> value-expr qqqwqq>qqqqqqqwqq> CONTAINING qqq> value-expr qqq>
                       mqq> NOT qqj

8.2.1  –  Format arguments

    value-expr             A value expression. A symbol or a string
                           of symbols used to calculate a value. When
                           you use a value expression in a statement,
                           Oracle Rdb calculates the value associated
                           with the expression and uses that value
                           when executing the statement.

9  –  Context Variable

    A temporary name that identifies a relation in a record stream
    to Oracle Rdb. Once you have associated a context variable with a
    relation, you use the context variable to refer to fields from
    that relation. In this way, Oracle Rdb always knows which field from
    which relation you are referring to.

    You must use a context variable in every data manipulation
    statement and in every data definition statement that uses a
    record selection expression.

    If you are accessing several record streams at once, the context
    variable lets you distinguish between fields from different
    record streams, even if different fields have the same name.

    If you are accessing several record streams at once that consist
    of the same relation and fields within that relation, context
    variables let you distinguish between the two record streams.

9.1  –  Examples

    The following programs demonstrate the use of the context
    variable "CS" for the CURRENT_SALARY view. These programs:

    o  Use "CS" to qualify field names in the record selection
       expression, printf, and WRITELN statement

    o  Print the employee ID of all the employees who earn more than
       forty thousand dollars

9.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR CS IN CURRENT_SALARY WITH CS.SALARY_AMOUNT > 40000.00
       printf ("%s\n",CS.EMPLOYEE_ID);
    END_FOR;

    COMMIT;
    FINISH;
    }

9.1.2  –  Pascal Example

    program context_var (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR CS IN CURRENT_SALARY WITH CS.SALARY_AMOUNT > 40000.00
       writeln (CS.EMPLOYEE_ID);
    END_FOR;

    COMMIT;
    FINISH;
    end.

9.2  –  Format

  (B)0context-variable =

  qqqqqqq> identifier qqqq>

9.2.1  –  Format arguments

    identifier             A valid alphanumeric host language
                           identifier.

10  –  COUNT

    Returns the number of records in a record stream specified by
    a record selection expression. The COUNT function differs from
    other statistical functions because it operates on the record
    stream defined by the record selection expression rather than on
    the values in that record stream.

10.1  –  Examples

    The following programs demonstrate the use of the COUNT function
    in a display statement. These programs:

    o  Use the COUNT function to compute the number of records stored
       in the EMPLOYEES relation

    o  Print an informational message and this computed number

10.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    int num;
    main()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    GET
       num = COUNT OF E IN EMPLOYEES;
    END_GET;

    printf ("The number of employees is %d", num);

    COMMIT;
    FINISH;
    }

10.1.2  –  Pascal Example

    program display_count (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    var
    num : integer;

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    GET
      num = COUNT OF E IN EMPLOYEES;
    END_GET;

    writeln ('The number of employees is', num);

    COMMIT;
    FINISH;
    end.

10.2  –  Format

  (B)0
  qqq> COUNT qqqqqqqqq>qqqqqqqwqq>qqqqqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqk
                              mqq>  handle-options qqqj                x
                                                                       x
   lqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
   mqqq>  OF  qqqqqqq>  rse  qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq>

  (B)0handle-options =

  q> ( qwqqqqqq>  REQUEST_HANDLE  qqqqq>  var qqqqqqqqwq> ) q>
        tqqqqqq> TRANSACTION_HANDLE qqq>  var qqqqqqqqu
        mqqqqqq> REQUEST_HANDLE q> var q> , qqqqqqqk  x
          lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj  x
          mqqqq> TRANSACTION_HANDLE q> var qqqqqqqqqqqj

10.2.1  –  Format arguments

    rse                    A record selection expression. A phrase
                           that defines specific conditions that
                           individual records must meet before
                           Oracle Rdb includes them in a record stream.

    handle-options         A request handle, a transaction handle, or
                           both.

    REQUEST_HANDLE var     The REQUEST_HANDLE keyword followed by a
                           host language variable. A request handle
                           identifies a compiled Oracle Rdb request.
                           If you do not supply a request handle
                           explicitly, RDML associates a unique
                           request handle for the compiled request.

    TRANSACTION_HANDLE     The TRANSACTION_HANDLE keyword followed by
    var                    a host language variable. A transaction
                           handle identifies a transaction. If
                           you do not supply a transaction handle
                           explicitly, RDML uses the default
                           transaction handle.

11  –  CROSS

    Lets you combine records from two or more record streams. You can
    base such record combinations on the relationship between field
    values in separate record streams.

11.1  –  Examples

    The following programs demonstrate the use of the CROSS clause to
    join records from two relations (a non-equijoin). These programs
    join the relations CURRENT_JOB and JOBS over their common field
    JOB_CODE. This allows these programs to print a report that
    contains fields from both relations. Specifically, these fields
    are: LAST_NAME from the CURRENT_JOBS relation, JOB_CODE from the
    JOBS relation, and JOB_TITLE from the JOBS relation.

11.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR C IN CURRENT_JOB
       CROSS J IN JOBS OVER JOB_CODE
          printf ("%s",C.LAST_NAME);
          printf ("  %s",J.JOB_CODE);
          printf ("  %s\n", J.JOB_TITLE);
    END_FOR;

    COMMIT;
    FINISH;
    }

11.1.2  –  Pascal Example

    program person_job (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR C IN CURRENT_JOB
       CROSS J IN JOBS OVER JOB_CODE
          writeln (C.LAST_NAME, ' ',J.JOB_CODE, ' ',J.JOB_TITLE);
    END_FOR;

    COMMIT;
    FINISH;
    end.

11.2  –  Format

  (B)0cross-clause =

  qqwqq> CROSS qqq> relation-clause qqwqq>qqqqqqqqqqqqqqqqqqqqqqqqqqqwqq>
    x                                 mqq> OVER qwq> field-name qqwqwj
    x                                            mqqqqq , <qqqqqqqj x
    x                                                               x
    mqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj

11.2.1  –  Format arguments

    relation-clause        A clause that specifies a context
                           variable for a stream or a loop. For
                           more information see the entry on Context
                           Variables.

    field-name             The name of a field in a relation. For
                           example, once you have defined E as
                           the context variable for the EMPLOYEES
                           relation, E.LAST_NAME is a value
                           expression that refers to a value from
                           the LAST_NAME field of EMPLOYEES.

12  –  DATABASE

    Names the database to be accessed in a program or program module
    and specifies to RDML which database to use and where to declare
    variables. However, RDML does not attach to the database when it
    encounters the DATABASE statement. The READY statement causes an
    attach to the database.

    The only required parameter for the DATABASE statement is the
    database name. The name must be the file name that represents the
    database file or a logical name that resolves to a file name.

    You can also specify the following:

    o  A database handle

    o  The scope of the database handle

    o  Different sources of the database definition for compilation
       and execution

    o  DBKEY scope

       You can specify whether the scope of each record's database
       key (dbkey) is valid through a COMMIT statement in each of
       your transactions, or through a FINISH statement. See the
       explanations for DBKEY SCOPE FINISH and DBKEY SCOPE COMMIT in
       the Arguments section fro details.

12.1  –  Examples

    The following programs demonstrate how to specify a COMPILETIME
    and RUNTIME database as the same database. Because a RUNTIME
    database is not explicitly declared, the programs use the
    COMPILETIME database at runtime also.

12.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main ()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    /* perform some action on the database */

    COMMIT;
    FINISH;
    }

12.1.2  –  Pascal Example

    program db (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    (* perform some actions on the database *)

    COMMIT;
    FINISH;
    end.

12.2  –  Format

  (B)0INVOKE DATABASE qqqqqqqqwqqqqqqqqqqqqq>qqqqqqqqqqqwqqqqqqqqqqqqqqqqk
                          mqq> db-handle-options qqqj                x
                                                                     x
          lqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
          mqwqqqqqqqqqq>qqqqqqqqqwqqwqq> PATHNAME qqq> path-name qqwqqk
            mqq>  COMPILETIME qqqj  mqq> FILENAME qqq> file-spec qqj  x
          lqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
          mqwqqqqqqqqqqqqqqqqqqqqqqqqqq>qqqqqqqqqqqqqqqqqqqqqqqqqqqwqqk
            mqq>  RUNTIME FILENAME qqqqwqqqq> file-spec qqqqqqqqwqqj  x
                                       mqqqq> host-variable qqqqj     x
          lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
          mqqqqwqqqqqqqqqqqqqqqqqq>qqqqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqk
               mq> DBKEY SCOPE IS qqwq> COMMIT qqqqqqqu               x
                                    mq> FINISH qqqqqqqj               x
          lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
          mqwqqqqqqqqqqqqqqqqqqqqqq>qqqqqqqqqqqqqqqqqqqqqqwqqq>
            mq> REQUEST_HANDLE SCOPE IS qwq> DEFAULT qqwqqj
                                         mq> FINISH qqqj

  (B)0db-handle-options =

     qqqqqqqwqqqq> db-handle    q> = qwqqqqqqqqqqqqqqqqqqwwq>
            x                         mq> handle-scope qqjx
            x                                             x
            mqqwq>qqqqqqqqqqqqqqqqwqq> db-handle qq> = qqqj
               x                  x
               mq> handle-scope qqj

  (B)0handle-scope =

  qqwqqqqqwqqwqqq> GLOBAL qqqqqqqqwqqwqqqqqwq>
    m> [ qj  x                    x  m> ] qj
             tqqq> EXTERNAL qqqqqqu
             x                    x
             mqqq> LOCAL qqqqqqqqqj

12.2.1  –  Format arguments

    db-handle-options      Database handle options. Allows you to
                           specify a database handle and its scope.

    db-handle              Database handle. A host variable used
                           to refer to a specific database you have
                           invoked. For more information see the
                           entry on the Database Handle clause.

    handle-scope           Specifies the scope of the database
                           handle. Note that you can enclose the
                           scope of a database handle in brackets,
                           for example: [GLOBAL].

    GLOBAL                 Specifies that the database is global
                           to all modules in an image. This allows
                           you to have a single transaction across
                           multiple modules.

    EXTERNAL               Specifies that the database is actually
                           accessed through another module.

    LOCAL                  Specifies that the database is local to
                           the module in which it is declared.

    COMPILETIME            The source of the database definitions
                           when the program is compiled. For Oracle
                           Rdb this can be either a CDD path name or
                           a file specification. If you specify only
                           the compiletime identifier and omit the
                           run-time identifier, Oracle Rdb uses the
                           compile-time identifier for both compiling
                           and running the program.  For example, RDML
                           will mistakenly use 'CDD$TOP.PERSONNEL' as
                           the run-time database file name in the
                           following example:

                           DATABASE COMPILETIME PATHNAME 'CDD$TOP.PERSONNEL';

                           However, RDML will correctly interpret the
                           following:

                           DATABASE COMPILETIME PATHNAME 'CDD$TOP.PERSONNEL'
                                    RUNTIME FILENAME 'PERSONNEL';

    path-name              A full or relative CDD path name, enclosed
                           in quotation marks, specifying the source
                           of the database definition. Use single
                           quotes (' ') when the host language is
                           Pascal. Use double quotes (" ") when the
                           host language is C.

    file-spec              File specification. A full or partial file
                           specification, or logical name enclosed in
                           quotation marks, specifying the source of
                           the database. Use single quotes (' ') when
                           the host language is Pascal. Use double
                           quotes (")  when the host language is C.

    RUNTIME FILENAME       The source of the database definitions
                           when the program is run. This can be
                           either a file specification or a host
                           variable. If you do not specify this
                           parameter, Oracle Rdb uses the compile-
                           time identifier for both compiling and
                           running the program.

    host-variable          A valid host language variable that
                           equates to a database file specification.

    DBKEY SCOPE COMMIT     The DBKEY SCOPE clause controls when the
                           database key (dbkey) of an erased record
                           may be reused by Oracle Rdb. When the DBKEY
                           SCOPE is COMMIT, (the default), Oracle Rdb
                           cannot reuse the DBKEY of an erased
                           record (to store another record) until
                           the transaction that erased the original
                           record completes (by entering COMMIT). If
                           the user who erased the original record
                           enters a ROLLBACK statement, then the
                           dbkey cannot be reused by Oracle Rdb.

    DBKEY SCOPE FINISH     Controls when the dbkey of an erased
                           record may be reused by Oracle Rdb. When
                           DBKEY SCOPE IS FINISH, Oracle Rdb cannot
                           reuse the dbkey (to store another record)
                           until the user who erased the original
                           record unbinds from the database (usually,
                           by issuing a FINISH statement). With DBKEY
                           SCOPE FINISH, an RDML program can complete
                           one or several transactions and, while
                           still attached to the database, use the
                           dbkey obtained during a STORE operation to
                           directly access those records.

    REQUEST HANDLE SCOPE   RDML automatically initializes any request
    DEFAULT                handles it generates that are in the same
                           compilation unit as the FINISH statement.
                           RDML does not reinitialize any user-
                           specified request handles nor does it
                           reinitialize any request handles that are
                           outside of the compilation unit where the
                           request is initiated. With this option,
                           the value of the request handle is not set
                           to zero after the RDML FINISH statement
                           executes. REQUEST_HANDLE SCOPE DEFAULT is
                           the default.

    REQUEST HANDLE SCOPE   The value of the request handle is set
    FINISH                 to zero after the RDML FINISH statement
                           executes.

                           The SQL FINISH statement initializes
                           all request handles in all compilation
                           units in a program. The RDBPRE and RDML
                           preprocessors allow programs to define
                           and manipulate request handles. If you
                           do not want your request handles to be
                           reinitialized, then you must use RDML or
                           RDBPRE (not SQL) to do the attach, and you
                           must use REQUEST_HANDLE SCOPE IS DEFAULT.

13  –  DB Field

    Use the database field value expression to reference database
    fields in record selection expressions and in other value
    expressions.

13.1  –  Examples

    The following programs demonstrate the use of the database field
    value expression. These programs use the database field value
    expression, FOR J IN JOBS, to declare the context variable J.
    This allows the programs to use the clause, J.JOB_CODE, to mean
    JOBS.JOB_CODE. The programs search the field JOB_CODE for the
    string "APGM". Any record that contains the specified string
    becomes part of the record stream. These programs then use J to
    qualify the fields in the host language print statements. The job
    title, minimum salary and the maximum salary for each record in
    the record stream are printed.

13.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR J IN JOBS WITH J.JOB_CODE = "APGM"
       printf ("%s", J.JOB_TITLE);
       printf ("  $%f", J.MINIMUM_SALARY);
       printf ("  $%f\n", J.MAXIMUM_SALARY);
    END_FOR;

    COMMIT;
    FINISH;
    }

13.1.2  –  Pascal Example

    program fld_value (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR J IN JOBS WITH J.JOB_CODE = 'APGM'
       writeln (J.JOB_TITLE,
                ' $', J.MINIMUM_SALARY: 10 : 2,
                '  $', J.MAXIMUM_SALARY: 10 : 2);
    END_FOR;

    COMMIT;
    FINISH;
    end.

13.2  –  Format

  (B)0db-field-expr

    qqq> context-var qqq> . qqq> field-name qqq>

13.2.1  –  Format arguments

    context-var            A context variable. A temporary name that
                           you associate with a relation. You define
                           a context variable in a relation clause.
                           For more information see the entry on
                           Context Variables.

    field-name             The name of a field in a relation. For
                           example, once you have defined E as
                           the context variable for the EMPLOYEES
                           relation, E.LAST_NAME is a value
                           expression that refers to a value from
                           the LAST_NAME field of EMPLOYEES.

14  –  DB Handle

    Oracle Rdb uses the database handle to identify the particular
    database that is referenced by a database request. Note that the
    database handle should not be thought of as a program variable.
    The database handle provides context to any statement that uses
    the database handle. When your program accesses a single database
    you do not have to include database handles or scopes in the
    DATABASE statement. Unlike transaction handles and request
    handles, database handles do not have to be declared in your
    programs. The RDML preprocessor automatically generates the data
    declaration for the database handle.

    The database handle is used in several RDML statements and
    clauses to identify a database:

    o  DATABASE

    o  FINISH

    o  READY

    o  relation-clause of the record selection expression

    o  DEFINE_TYPE or DECLARE_VARIABLE (synonyms)

    o  BASED ON clause

    Oracle Rdb lets you have more than one database active at a given
    time. You can use the database handle to distinguish among these
    different databases in RDML statements.

    Both the default and named database handle are declared as GLOBAL by
    default.

14.1  –  More

    The example program shown here illustrates a problem with RDML. It is
    written in VAX C, and although the precompilation is clean, the C
    compiler gives errors at the READY statement. This problem occurs only
    when the READY statement contains a database handle that is incorrectly
    specified as a variable rather than specified in a DATABASE statement.

    This program works if a database handle specified in one of the database
    statements is used in the READY statement, whether the READY statement
    is used in a function or in a main module.

    #include stdio
    DATABASE first_db = FILENAME 'the_first';
    DATABASE second_db = FILENAME 'the_second';
    main()
    {
    one_ready(first_db);
    one_ready(second_db);
    printf("%d\n",first_db);
    printf("%d\n",second_db);
    START_TRANSACTION READ_WRITE;
    COMMIT;
    }
    one_ready(the_handle)
    unsigned long the_handle;
    {
    READY the_handle ON ERROR printf("an error\n"); END_ERROR;
    return(the_handle);
    }

    The READY statement, as documented in the V3.0, V3.1, and V4.0 Oracle
    Rdb RDML Reference Manual, states that the database handle (or multiple
    database handles) used in the READY statement must be specified in a
    DATABASE statement.  Oracle does not support user-specified database
    handles in RDML; database handles are automatically declared and used
    in RDML as a result of their specification in a DATABASE statement
    (which is really a declaration). This program attempts to use a
    database handle that is declared explicitly (as opposed to being
    specified in a DATABASE statement), and RDML therefore does not
    recognize it as a database handle. Because a READY statement by itself
    is valid, RDML simply recognizes that the READY statement syntax has
    terminated at that point, and so it fails to detect the ON ERROR clause
    later in the same line.  (It assumes that the rest of the line was host
    language syntax.)

    To enable RDML to recognize your database handle, associate a unique
    number with each database handle, and use it to identify which database
    handle to use. The example shown here is a possible approach:

    #include <stdio.h>

    DATABASE first_db = FILENAME 'PERSONNEL';
    DATABASE second_db = FILENAME 'PERSONNEL';

    main()
    {
    one_ready(1);
    one_ready(2);
    printf("%d\n", first_db);
    printf("%d\n", second_db);
    START_TRANSACTION READ_WRITE;
    COMMIT;
    }

    one_ready(int which_handle)
    {
    switch (which_handle)
       {
        case 1:
           READY first_db ON ERROR printf("an error\n"); END_ERROR;
           break;
        case 2:
           READY second_db ON ERROR printf("an error\n"); END_ERROR;
           break;
       }
    }

14.2  –  Examples

    The following program segments demonstrate how to use a database
    handle in a READY statement. These segments declare a COMPILETIME
    database and ready it. Because a RUNTIME database is not
    explicitly declared, the programs use the COMPILETIME database
    at runtime also.

14.2.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main ()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    /* perform some database actions */

    COMMIT;
    FINISH PERS;
    }

14.2.2  –  Pascal Example

    program dbhandle (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    {* perform some actions on the database *}

    COMMIT;
    FINISH PERS;
    end.

14.3  –  Format

  (B)0db-handle =

  qqqqq> host-variable qqqqq>

14.3.1  –  Format arguments

    host-variable          A valid alphanumeric host language
                           variable.

15  –  DEFINE_TYPE

    The DECLARE_VARIABLE and DEFINE_TYPE clauses have exactly the
    same function. Oracle Rdb decided to rename the clause to clarify
    that its function is to declare host language variables, not to
    define host language types. Note that the DEFINE_TYPE clause
    may still be used; however, Rdb recommends that all new
    applications use the DECLARE_VARIABLE clause in place of the
    DEFINE_TYPE clause. See the help file entry on DECLARE_VARIABLE
    for more information.

16  –  DECLARE_STREAM

    Declares the context of a record stream and thereby is
    able to associate a stream name with a RSE. This provides
    Oracle Rdb with the context needed to place the elements of the
    START_STREAM...FETCH...END_STREAM in a single programming module
    in any order.

16.1  –  Examples

    The following programs demonstrate the use of the DECLARE_STREAM
    statement to specify a record selection expression that limits
    the records in the stream to those with a value of less than ten
    thousand in the SALARY_AMOUNT field.

16.1.1  –  C Example

    #include <stdio.h>
    #define TRUE 1
    #define FALSE 0

    DATABASE PERS = FILENAME "PERSONNEL";

    DECLARE_STREAM sal USING SH IN SALARY_HISTORY
         WITH SH.SALARY_AMOUNT LT 10000;

    int end_of_stream;

    main()
    {
    READY PERS;
    START_TRANSACTION READ_WRITE;

        START_STREAM sal;

        FETCH sal
         AT END
           end_of_stream = TRUE;
        END_FETCH;

        while (! end_of_stream)
           {
           MODIFY SH USING
             SH.SALARY_AMOUNT = SH.SALARY_AMOUNT * (1.5);
           END_MODIFY;

           FETCH sal
             AT END
               end_of_stream = TRUE;
           END_FETCH;
           }

        END_STREAM sal;

        COMMIT;
        FINISH;
    }

16.1.2  –  Pascal Example

    program anycond (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    var
    end_of_stream : boolean;

    DECLARE_STREAM sal USING SH IN SALARY_HISTORY
         WITH SH.SALARY_AMOUNT LT 10000;

    begin
        READY PERS;
        START_TRANSACTION READ_WRITE;

        START_STREAM sal;

        FETCH sal
         AT END
           end_of_stream := TRUE;
        END_FETCH;

        while not end_of_stream do
         begin
           MODIFY SH USING
             SH.SALARY_AMOUNT := SH.SALARY_AMOUNT * (1.5);
           END_MODIFY;

           FETCH sal
             AT END
               end_of_stream := TRUE;
           END_FETCH;

         end;

        END_STREAM sal;
        COMMIT;
        FINISH;
    end.

16.2  –  Format

  (B)0
  DECLARE_STREAM  qqqqqwqq>qqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqqqqqqqk
                       mqq> handle-options qj                      x
                                                                   x
  lqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
  x
  mqqqqqqqqqqqqqqqq>  declared-stream-name qqqqq> USING qqqq> rse qq>

  (B)0handle-options =

  q> ( qwqqqqqq>  REQUEST_HANDLE  qqqqq>  var qqqqqqqqwq> ) q>
        tqqqqqq> TRANSACTION_HANDLE qqq>  var qqqqqqqqu
        mqqqqqq> REQUEST_HANDLE q> var q> , qqqqqqqk  x
          lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj  x
          mqqqq> TRANSACTION_HANDLE q> var qqqqqqqqqqqj

16.2.1  –  Format arguments

    declared-stream-name   A name you give the stream you declare.
                           The stream name must be a valid operating
                           system name.

    rse                    A record selection expression. A phrase
                           that defines the specific conditions
                           that individual records must meet before
                           Oracle Rdb includes them in a record stream.

    handle-options         A request handle, a transaction handle, or
                           both.

    REQUEST_HANDLE var     The REQUEST_HANDLE keyword followed by a
                           host language variable. A request handle
                           identifies a compiled Oracle Rdb request.
                           If you do not supply a request handle
                           explicitly, RDML associates a unique
                           request handle for the compiled request.

    TRANSACTION_HANDLE     The TRANSACTION_HANDLE keyword followed by
    var                    a host language variable. A transaction
                           handle identifies a transaction. If
                           you do not supply a transaction handle
                           explicitly, RDML uses the default
                           transaction handle.

17  –  Declared END STREAM

    Ends a declared stream. You can issue several declared END_STREAM
    statements in a module, and as long as you use the same declared
    stream name in each END_STREAM statement, they will all refer to
    the same stream.

17.1  –  Examples

    The following programs demonstrate the use of the declared
    END_STREAM statement.

17.1.1  –  C Example

    #include <stdio.h>
    #define TRUE 1
    #define FALSE 0

    DATABASE PERS = FILENAME "PERSONNEL";

    DECLARE_STREAM sal USING SH IN SALARY_HISTORY
         WITH SH.SALARY_AMOUNT LT 10000;

    int end_of_stream;

    main()
    {
    READY PERS;
    START_TRANSACTION READ_WRITE;

        START_STREAM sal;

        FETCH sal
         AT END
           end_of_stream = TRUE;
        END_FETCH;

        while (! end_of_stream)
           {
           MODIFY SH USING
             SH.SALARY_AMOUNT = SH.SALARY_AMOUNT * (1.5);
           END_MODIFY;

           FETCH sal
             AT END
               end_of_stream = TRUE;
           END_FETCH;
           }

        END_STREAM sal;

        COMMIT;
        FINISH;
    }

17.1.2  –  Pascal Example

    program anycond (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    var
    end_of_stream : boolean;

    DECLARE_STREAM sal USING SH IN SALARY_HISTORY
         WITH SH.SALARY_AMOUNT LT 10000;

    begin
        READY PERS;
        START_TRANSACTION READ_WRITE;

        START_STREAM sal;

        FETCH sal
         AT END
           end_of_stream := TRUE;
        END_FETCH;

        while not end_of_stream do
         begin
           MODIFY SH USING
             SH.SALARY_AMOUNT := SH.SALARY_AMOUNT * (1.5);
           END_MODIFY;

           FETCH sal
             AT END
               end_of_stream := TRUE;
           END_FETCH;

         end;

        END_STREAM sal;
        COMMIT;
        FINISH;
    end.

17.2  –  Format

  (B)0
  END_STREAM  qqqqqq> stream-name  qqqqqqqqqk
                  lqqqqqqqqq<qqqqqqqqqqqqqqqj
                  mqwqqqqqqqqqqqqqqwqqqqqqqqqq>
                    mq> on-error qqj

17.2.1  –  Format arguments

    stream-name            The name you gave to the stream when you
                           issued the DECLARE_STREAM statement.

    on-error               The ON ERROR clause. Specifies host
                           language statements or Oracle Rdb statements,
                           or both, to be performed if an error
                           occurs during the END_STREAM operation.

18  –  Declared START STREAM

    Starts a stream that has been declared earlier in the module with
    a DECLARE_STREAM statement. A declared START_STREAM statement
    allows you to place the elements of the START_STREAM statement in
    any order within the program as long as they are executed in the
    order: START_STREAM, FETCH, END_STREAM.

18.1  –  Examples

    The following programs demonstrate the use of the declared
    START_STREAM statement to open a stream declared with the
    DECLARE_STREAM statement.

18.1.1  –  C Example

    #include <stdio.h>
    #define TRUE 1
    #define FALSE 0

    DATABASE PERS = FILENAME "PERSONNEL";

    DECLARE_STREAM sal USING SH IN SALARY_HISTORY
         WITH SH.SALARY_AMOUNT LT 10000;

    int end_of_stream;

    main()
    {
    READY PERS;
    START_TRANSACTION READ_WRITE;

        START_STREAM sal;

        FETCH sal
         AT END
           end_of_stream = TRUE;
        END_FETCH;

        while (! end_of_stream)
           {
           MODIFY SH USING
             SH.SALARY_AMOUNT = SH.SALARY_AMOUNT * (1.5);
           END_MODIFY;

           FETCH sal
             AT END
               end_of_stream = TRUE;
           END_FETCH;
           }

        END_STREAM sal;

        COMMIT;
        FINISH;
    }

18.1.2  –  Pascal Example

    program anycond (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    var
    end_of_stream : boolean;

    DECLARE_STREAM sal USING SH IN SALARY_HISTORY
         WITH SH.SALARY_AMOUNT LT 10000;

    begin
        READY PERS;
        START_TRANSACTION READ_WRITE;

        START_STREAM sal;

        FETCH sal
         AT END
           end_of_stream := TRUE;
        END_FETCH;

        while not end_of_stream do
         begin
           MODIFY SH USING
             SH.SALARY_AMOUNT := SH.SALARY_AMOUNT * (1.5);
           END_MODIFY;

           FETCH sal
             AT END
               end_of_stream := TRUE;
           END_FETCH;

         end;

        END_STREAM sal;
        COMMIT;
        FINISH;
    end.

18.2  –  Format

  (B)0
  START_STREAM qqqqqqqq> declared-stream-name qqqqqqk
               lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
               mqqqqqqwqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqq>
                      mq> on-error qqj

18.2.1  –  Format arguments

    declared-stream-name   The name you gave to the stream when you
                           issued the DECLARE_STREAM statement.

    on-error               The ON ERROR clause. Specifies host
                           language statements or Oracle Rdb statements,
                           or both, to be performed if an error
                           occurs during the START_STREAM operation.

19  –  DECLARE_VARIABLE

    The DECLARE_VARIABLE clause lets you declare a host language
    variable by referring to a field associated with a database
    relation. The variable inherits the data type and size
    attributes associated with the field. See the BASED ON clause
    for information on declaring program functions: Pascal TYPE(s),
    and C typedef(s).

    The DECLARE_VARIABLE and DEFINE_TYPE clauses have exactly the
    same function. Oracle Rdb decided to rename the clause to clarify
    that its function is to declare host language variables, not to
    define host language types. Note that the DEFINE_TYPE clause
    may still be used; however, Rdb recommends that all new
    applications use the DECLARE_VARIABLE clause in place of the
    DEFINE_TYPE clause.

19.1  –  Examples

    The following programs demonstrate the use of the
    DECLARE_VARIABLE clause to declare a program variable. These
    programs:

    o  Declare the variable, badge, to have the same data type and
       size attributes as EMPLOYEE_ID in the EMPLOYEES relation.

    o  Use this variable for interactive processing. Note that the
       interactive portion of the programs appear before the READY
       statement. This keeps locks on the database to a minimum.

    o  Select the record from the EMPLOYEES relation that has the
       same value for EMPLOYEE_ID as is stored in badge.

    o  Modify the STATUS_CODE field of this record

    Note that the C program uses the read_string function to prompt
    for and receive a value for badge. For more information on this
    function see Appendix B of the "RDML Reference Manual".

19.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    extern void read_string();
    static DECLARE_VARIABLE badge SAME AS EMPLOYEES.EMPLOYEE_ID;

    main()
    {
    read_string ("Employee ID: ", badge, sizeof(badge));

    READY PERS;
    START_TRANSACTION READ_WRITE;

    FOR E IN EMPLOYEES WITH E.EMPLOYEE_ID = badge
       MODIFY E USING
          strcpy(E.STATUS_CODE,"1");
       END_MODIFY;
    END_FOR;

    ROLLBACK;
    FINISH;
    }

19.1.2  –  Pascal Example

    program modify_with_host (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    var
       DECLARE_VARIABLE badge SAME AS EMPLOYEES.EMPLOYEE_ID;

    begin
    write  ('Employee ID: ');
    readln (badge);

    READY PERS;
    START_TRANSACTION READ_WRITE;

    FOR E IN EMPLOYEES WITH E.EMPLOYEE_ID = badge
       MODIFY E USING
          E.STATUS_CODE := '1';
       END_MODIFY;
    END_FOR;

    ROLLBACK;
    FINISH;
    end.

19.2  –  Format

  (B)0DECLARE_VARIABLE   qqqqqqqqqqqqqqqqqq>  host-variable  qqqk
                                                            x
  lqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
  mqqwqq>qqqqqqqwqq> AS qqwqq>qqqqqqqqqqqqqqqqqqqwqqk
     mqq> SAME qj         mqq> db-handle qq> . qqj  x
                                                    x
   lqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqj
   mqqqqqqqqqqqq>  relation-name  qqq>  .  qqq> field-name qqq>

19.2.1  –  Format arguments

    host-variable          A valid host language variable.

    db-handle              Database handle. A host variable used
                           to refer to a specific database you have
                           invoked. For more information see the
                           entry on the Database Handle clause.

    relation-name          The name of a relation in the database.

    field-name             The name of a field in a relation. For
                           example, once you have defined E as
                           the context variable for the EMPLOYEES
                           relation, E.LAST_NAME is a value
                           expression that refers to a value from
                           the LAST_NAME field of EMPLOYEES.

20  –  ERASE

    Deletes a record from a relation or open stream.

20.1  –  Examples

    The following programs demonstrate the use of the ERASE statement
    to delete records from a relation. These programs:

    o  Start a READ_WRITE transaction

    o  Find the records in COLLEGES with the college code "PURD"

    o  Delete those records from the COLLEGES relation

20.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    READY PERS;
    START_TRANSACTION READ_WRITE;

    FOR C IN COLLEGES WITH C.COLLEGE_CODE = "PURD"
       ERASE C;
    END_FOR;

    ROLLBACK;
    FINISH;
    }

20.1.2  –  Pascal Example

    program erase_record (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_WRITE;

    FOR C IN COLLEGES WITH C.COLLEGE_CODE = 'PURD'
       ERASE C;
    END_FOR;

    ROLLBACK;
    FINISH;
    end.

20.2  –  Format

  (B)0ERASE qqqq> context-var qqqwqq>qqqqqqqqqqqqqwqq>
                             mqq> on-error qqqj

20.2.1  –  Format arguments

    context-var            A context variable. A temporary name that
                           you associate with a relation. You define
                           a context variable in a relation clause.
                           For more information see the entry on
                           Context Variables.

    on-error               The ON ERROR clause. Specifies host
                           language statement(s) to be performed
                           if an error occurs during the ERASE
                           operation. For more information see the
                           entry on ON ERROR.

21  –  FETCH

    Retrieves the next record from a record stream. The FETCH
    statement is used:

    o  After a START_STREAM statement

    o  Before any other RDML statements that affect the context
       established by the START_STREAM statement

    The FETCH statement advances the pointer for a record stream to
    the next record of a relation. Unlike the FOR statement, which
    advances to the next record automatically, the FETCH statement
    allows you explicit control of the record stream. For instance,
    you might use the FETCH statement to print a report where the
    first six rows have five columns, and the seventh row only three.

21.1  –  Examples

    The following programs demonstrate the use of the FETCH statement
    to advance a pointer in an open stream. These programs

    o  Fetch a record from a stream specified by the DECLARE_STREAM
       statement

    o  If at least one record is found, enter a "while" loop

    o  Modify the record

    o  Fetch and modify all the records in the stream

    o  End the stream

21.1.1  –  C Example

    #include <stdio.h>
    #define TRUE 1
    #define FALSE 0

    DATABASE PERS = FILENAME "PERSONNEL";

    DECLARE_STREAM sal USING SH IN SALARY_HISTORY
         WITH SH.SALARY_AMOUNT LT 10000;

    int end_of_stream;

    main()
    {
    READY PERS;
    START_TRANSACTION READ_WRITE;

        START_STREAM sal;

        FETCH sal
         AT END
           end_of_stream = TRUE;
        END_FETCH;

        while (! end_of_stream)
           {
           MODIFY SH USING
             SH.SALARY_AMOUNT = SH.SALARY_AMOUNT * (1.5);
           END_MODIFY;

           FETCH sal
             AT END
               end_of_stream = TRUE;
           END_FETCH;
           }

        END_STREAM sal;

        COMMIT;
        FINISH;
    }

21.1.2  –  Pascal Example

    program anycond (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    var
    end_of_stream : boolean;

    DECLARE_STREAM sal USING SH IN SALARY_HISTORY
         WITH SH.SALARY_AMOUNT LT 10000;

    begin
        READY PERS;
        START_TRANSACTION READ_WRITE;

        START_STREAM sal;

        FETCH sal
         AT END
           end_of_stream := TRUE;
        END_FETCH;

        while not end_of_stream do
         begin
           MODIFY SH USING
             SH.SALARY_AMOUNT := SH.SALARY_AMOUNT * (1.5);
           END_MODIFY;

           FETCH sal
             AT END
               end_of_stream := TRUE;
           END_FETCH;

         end;

        END_STREAM sal;
        COMMIT;
        FINISH;
    end.

21.2  –  Format

  (B)0FETCH qq> stream-name qqqqqqqwqq>qqqqqqqqqqqqqwqqqqqk
                               mqq> on-error qqqj     x
  lqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
  mqwqq>qqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqwqqq>
    tqq> AT END qqwqq> statement qqwq> END_FETCH  qqu
    x             mqqqqqqq<qqqqqqqqj                x
    mqq> END_FETCH qqqqqqqqqqqqqqqqqq>qqqqqqqqqqqqqqj

21.2.1  –  Format arguments

    stream-name            The stream from which you want to FETCH
                           the next record.

    on-error               The ON ERROR clause. Specifies host
                           language statement(s) to be performed
                           if an error occurs during the FETCH
                           operation. For more information see the
                           entry on ON ERROR.

    statement              Any valid RDML or host language statement
                           to be executed when your program reaches
                           the end of a record stream. Use a
                           semicolon (;) at the end of each RDML,
                           Pascal, or C statement.

22  –  FINISH

    Explicitly declares a database closed. By default, the FINISH
    statement with no parameters also commits all transactions that
    have not been committed or rolled back. When used in conjunction
    with the /NODEFAULT_TRANSACTIONS qualifier on the RDML command
    line, issuing the FINISH statement before you explicitly end a
    transaction (with the COMMIT or ROLLBACK statement) will result
    in an error.

22.1  –  Examples

    The following program fragments:

    o  Declare a database

    o  Enter an RDML FOR loop, implicitly opening the database

    o  Print the last name of each employee in EMPLOYEES

    o  Commit the transaction

    o  Close the database

22.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    FOR E IN EMPLOYEES
       printf ("%s\n", E.LAST_NAME);
    END_FOR;

    COMMIT;
    FINISH;
    }

22.1.2  –  Pascal Example

    program empupdate (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    FOR E IN EMPLOYEES
       writeln (E.LAST_NAME);
    END_FOR;

    COMMIT;
    FINISH;
    end.

22.2  –  Format

  (B)0FINISH qqqwqqq>qqqqqqqqqqqqqqqwqwqq>qqqqqqqqqqqqqwqq>
            mqwq> db-handle qwqqj mqq> on-error qqqj
              mqqqqq , <qqqqqj

22.2.1  –  Format arguments

    db-handle              Database handle. A host variable used
                           to refer to a specific database you have
                           invoked. For more information see the
                           entry on the Database Handle clause.

    on-error               The ON ERROR clause. Specifies host
                           language statement(s) to be performed
                           if an error occurs during the FINISH
                           operation. For more information see the
                           entry on ON ERROR.

23  –  FIRST Clause

    The FIRST clause specifies the maximum number of records in a
    record stream formed by a record selection expression.

23.1  –  Examples

    The following programs demonstrate the use of the FIRST clause
    and the SORT clause. These programs sort the employees relation
    in ascending order based on EMPLOYEE_ID. The FIRST 50 statement
    creates a record stream that contains the first 50 records from
    the sorted employees relation. These programs print the employee
    ID and last name of these fifty employee records.

23.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main ( )
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR FIRST 50 E IN EMPLOYEES
       SORTED BY E.EMPLOYEE_ID
          printf ("%s  ",E.EMPLOYEE_ID);
          printf ("%s\n",E.LAST_NAME);
    END_FOR;

    COMMIT;
    FINISH;
    }

23.1.2  –  Pascal Example

    program first_clause (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR FIRST 50 E IN EMPLOYEES
       SORTED BY E.EMPLOYEE_ID
          writeln (E.EMPLOYEE_ID, ' ', E.LAST_NAME);
    END_FOR;

    COMMIT;
    FINISH;
    end.

23.2  –  Format

  (B)0first-clause =

    qqqqqq> FIRST qqqq> value-expr qqqq>

23.2.1  –  Format arguments

    value-expr             A value expression. A symbol or a string
                           of symbols used to calculate a value. When
                           you use a value expression in a statement,
                           Oracle Rdb calculates the value associated
                           with the expression and uses that value
                           when executing the statement.

24  –  FIRST_FROM

    The FIRST FROM expression forms a record stream as specified
    by the record selection expression. If at least one record in
    the stream matches the record selection expression, Oracle Rdb
    uses the values stored in the first record of the record stream
    to evaluate the value expression. If there are no matches, you
    receive a runtime error.

    The FIRST FROM value expression can perform the equivalent of a
    table lookup when you are sure that the value you want to find is
    unique in a relation.

24.1  –  Examples

    The following programs demonstrate the use of the FIRST FROM
    clause. The programs find the first record in the JOBS relation
    with the value "Company President" in the field JOB_TITLE. Using
    this record's value for JOB_CODE, these programs create a record
    stream containing the records in the CURRENT_JOB relation that
    have this same job code. The programs print the value that the
    first record from this record stream holds in the LAST_NAME
    field.

24.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    DECLARE_VARIABLE name SAME AS PERS.CURRENT_JOB.LAST_NAME;
    main()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    GET
     name =  FIRST C.LAST_NAME FROM C IN CURRENT_JOB
             WITH C.JOB_CODE = FIRST J.JOB_CODE FROM J IN JOBS
             WITH J.JOB_TITLE = "Company President"
             SORTED BY C.JOB_CODE;
    END_GET;

    printf ("Last name is %s", name);

    COMMIT;
    FINISH;
    }

24.1.2  –  Pascal Example

    program first_val (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    DECLARE_VARIABLE name SAME AS PERS.CURRENT_JOB.LAST_NAME;

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    GET
      name =  FIRST C.LAST_NAME FROM C IN CURRENT_JOB
              WITH C.JOB_CODE = FIRST J.JOB_CODE FROM J IN JOBS
              WITH J.JOB_TITLE = 'Company President'
              SORTED C.JOB_CODE;
    END_GET;

    writeln ('Last name is: ', name);

    COMMIT;
    FINISH;
    end.

24.2  –  Format

  (B)0first-from-expr =

    qqq> FIRST qwqqqqqqqqq>qqqqqqqqqqwq>  value-expr qqq> FROM qqqk
                mq> handle-options qqj                            x
                                                                  x
                lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
                x
                mqqqqqq>     rse  qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq>

  (B)0handle-options =

  q> ( qwqqqqqq>  REQUEST_HANDLE  qqqqq>  var qqqqqqqqwq> ) q>
        tqqqqqq> TRANSACTION_HANDLE qqq>  var qqqqqqqqu
        mqqqqqq> REQUEST_HANDLE q> var q> , qqqqqqqk  x
          lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj  x
          mqqqq> TRANSACTION_HANDLE q> var qqqqqqqqqqqj

24.2.1  –  Format arguments

    value-expr             A value expression. A symbol or a string
                           of symbols used to calculate a value. When
                           you use a value expression in a statement,
                           Oracle Rdb calculates the value associated
                           with the expression and uses that value
                           when executing the statement.

    rse                    A record selection expression. A phrase
                           that defines specific conditions that
                           individual records must meet before
                           Oracle Rdb includes them in a record stream.

    handle-options         A request handle, a transaction handle, or
                           both.

    REQUEST_HANDLE var     The REQUEST_HANDLE keyword followed by a
                           host language variable. A request handle
                           identifies a compiled Oracle Rdb request.
                           If you do not supply a request handle
                           explicitly, RDML associates a unique
                           request handle for the compiled request.

    TRANSACTION_HANDLE     The TRANSACTION_HANDLE keyword followed by
    var                    a host language variable. A transaction
                           handle identifies a transaction. If
                           you do not supply a transaction handle
                           explicitly, RDML uses the default
                           transaction handle.

25  –  FOR Statement

    The FOR statement executes a statement or group of statements
    once for each record in a record stream formed by a record
    selection expression. You can nest FOR statements within other
    FOR statements to establish relationships for outer joins.

    Your program can use either FOR statements or START_STREAM
    statements to establish record streams. You can use both methods
    in one program. However, you cannot use the FETCH statement
    to advance the pointer in a record stream established by a FOR
    statement. The FOR statement automatically advances to the next
    record.

25.1  –  Examples

    The following programs demonstrate the use of the FOR statement
    to create a record stream. These programs:

    o  Declare a variable dept_code

    o  Prompt for a value for dept_code

    o  Start a READ_ONLY transaction

    o  Create a record stream defined by a record selection
       expression that uses the value of dept_code

    o  Display the department name for each record in that stream

    The C program uses the read_string function to prompt for and
    receive a value for dept_code. For more information on this
    function, see Appendix B of the "RDML Reference Manual".

25.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    extern void read_string ();
    DECLARE_VARIABLE dept_code SAME AS DEPARTMENTS.DEPARTMENT_CODE;

    main ()
    {
    read_string ("Department Code: ",dept_code, sizeof(dept_code));

    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR D IN DEPARTMENTS
       WITH D.DEPARTMENT_CODE = dept_code
          printf ("Department name =  %s\n ", D.DEPARTMENT_NAME);
    END_FOR;

    COMMIT;
    FINISH;
    }

25.1.2  –  Pascal Example

    program for_in_rse (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    var
       DECLARE_VARIABLE dept_code SAME AS DEPARTMENTS.DEPARTMENT_CODE;

    begin
    write  ('Department Code: ');
    readln (dept_code);

    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR D IN DEPARTMENTS
       WITH D.DEPARTMENT_CODE = dept_code
          writeln ('Department name =  ', D.DEPARTMENT_NAME);
    END_FOR;

    COMMIT;
    FINISH;
    end.

25.2  –  Format

  (B)0FOR qqqqqqqqqwqq>qqqqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
               mqq> handle-options qqqj                             x
                                                                    x
  lqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
  x
  mqqq>  rse  qqwq>qqqqqqqqqqqwqqqwqq>  statement  qqwqq> END_FOR
                mq>on-error qqj   mqq<qqqqqqqqqqqqqqqj

  (B)0handle-options =

  q> ( qwqqqqqq>  REQUEST_HANDLE  qqqqq>  var qqqqqqqqwq> ) q>
        tqqqqqq> TRANSACTION_HANDLE qqq>  var qqqqqqqqu
        mqqqqqq> REQUEST_HANDLE q> var q> , qqqqqqqk  x
          lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj  x
          mqqqq> TRANSACTION_HANDLE q> var qqqqqqqqqqqj

25.2.1  –  Format arguments

    rse                    A record selection expression. A phrase
                           that defines specific conditions that
                           individual records must meet before
                           Oracle Rdb includes them in a record stream.

    on-error               The ON ERROR clause. Specifies host
                           language statement(s) to be performed
                           if an error occurs during the FOR loop.
                           For more information see the entry on ON
                           ERROR.

    statement              Any valid RDML or host language statement
                           to be executed within the FOR loop. Use
                           a semicolon (;) at the end of each RDML,
                           Pascal, or C statement.

    handle-options         A request handle, a transaction handle, or
                           both.

    REQUEST_HANDLE var     The REQUEST_HANDLE keyword followed by a
                           host language variable. A request handle
                           identifies a compiled Oracle Rdb request.
                           If you do not supply a request handle
                           explicitly, RDML associates a unique
                           request handle for the compiled request.

    TRANSACTION_HANDLE     The TRANSACTION_HANDLE keyword followed by
    var                    a host language variable. A transaction
                           handle identifies a transaction. If
                           you do not supply a transaction handle
                           explicitly, RDML uses the default
                           transaction handle.

26  –  FOR Segmented Strings

    Sets up a record stream consisting of segments from a segmented
    string field. Because a single segmented string field value is
    made up of multiple segments, a record stream that includes
    a segmented string field is nested. The outer loop retrieves
    records that include the segmented string field and the inner
    loop retrieves the segments from this field, one at a time.
    Therefore, a FOR statement that retrieves segmented strings must
    be nested within a START_STREAM or FOR statement.

26.1  –  Examples

    The following programs demonstrate the use of the FOR statement
    to retrieve segmented strings. Since the PERSONNEL database does
    not have any segmented strings stored, the programs first store
    three strings in the RESUME field of the RESUMES relation (for
    more information on storing segmented strings, see the help entry
    on STORE Statement with segmented strings). The programs retrieve
    the segmented strings using a nested FOR statement. The outer FOR
    statement selects a record based on EMPLOYEE_ID. The inner FOR
    statement prints each segmented string stored in RESUME for the
    selected employee.

26.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    int line;
    char *document[3];

    document[0] = "first line of resume  ";
    document[1] = "second line of resume ";
    document[2] = "last line of resume   ";

    READY PERS;
    START_TRANSACTION READ_WRITE;

    STORE R IN RESUMES USING
       strcpy (R.EMPLOYEE_ID,"12345");
       for (line = 0; line <= 2; line++)
          STORE SEG IN R.RESUME
                strcpy(SEG.VALUE,document[line]);
                SEG.LENGTH = strlen(SEG.VALUE);
          END_STORE;
    END_STORE;

    FOR R IN RESUMES WITH R.EMPLOYEE_ID = "12345"
       FOR SEG IN R.RESUME
          printf("%s\n",SEG.VALUE);
       END_FOR;
    END_FOR;

    COMMIT;
    FINISH;
    }

26.1.2  –  Pascal Example

    program segstr (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    type                     lines = varying [80] of char;
    var                      linecnt  : integer;
                             document : array [0..2] of lines;

    begin

    document[0] := 'first line of resume  ';
    document[1] := 'second line of resume ';
    document[2] := 'last line of resume   ';

    READY PERS;
    START_TRANSACTION READ_WRITE;

    STORE R IN RESUMES USING
       R.EMPLOYEE_ID:= '12345';
       for linecnt := 0 to 2 do
          STORE SEG IN R.RESUME
             SEG := document[linecnt];
             SEG.LENGTH := length(document[linecnt]);
          END_STORE;
    END_STORE;

    FOR R IN RESUMES WITH R.EMPLOYEE_ID = '12345'
        FOR SEG IN R.RESUME
          writeln (SEG);
        END_FOR;
    END_FOR;

    COMMIT;
    FINISH;
    end.

26.2  –  Format

  (B)0FOR qq> ss-handle  qqq> IN qqqq> ss-field  qqqqqwq>qqqqqqqqqqqqwqk
                                                  mq> on-error qqj x
        lqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
        mqqqq> assignment qqqqqqqqq> END_FOR

26.2.1  –  Format arguments

    ss-handle              A name that identifies the segmented
                           string.

    ss-field               A qualified field name that refers to a
                           field defined with the SEGMENTED STRING
                           data type. Note that this field name, like
                           all field names in a FOR statement, must
                           be qualified by its own context variable.
                           This second context variable must match
                           the variable declared in the outer FOR
                           statement. See the Examples entry.

    on-error               The ON ERROR clause. Specifies host
                           language statement(s) to be performed
                           if an error occurs during the FOR loop.
                           For more information see the entry on ON
                           ERROR.

    assignment             Associates the two database variables with
                           a value expression. The database variables
                           refer to the segment of a segmented string
                           and its length. The special name for
                           the segment can be either "VALUE" or
                           "RDB$VALUE". The special name for the
                           segment length can be either "LENGTH"
                           or "RDB$LENGTH". You cannot assign any
                           other database variables to the value
                           expressions for segmented strings. The
                           assignment operator for RDML Pascal is
                           ":=" and for RDML C is "=" or strcpy.

27  –  GET

    Assigns values from data records in a record stream to host
    variables in RDML programs. You can use the GET statement in
    three different ways:

    o  When you establish a record stream with the FOR or
       START_STREAM statement, you use the GET statement to assign
       values from the current record in the stream to variables in
       your program. In the case of the START_STREAM statement, you
       also need a FETCH statement to indicate the current record in
       the stream.

    o  You can use GET within a STORE operation to retrieve the value
       of the record currently being stored. This includes the use of
       GET ... RDB$DB_KEY in a STORE ... END_STORE block to retrieve
       the database key (dbkey) of a record just stored.

    o  You can also use the GET statement alone, without a FOR,
       FETCH, or STORE statement to retrieve the result of a
       statistical expression. The record stream is formed by the
       record selection expression within the statistical expression.

27.1  –  Examples

    The following examples demonstrate the use of the GET statement
    with a statistical function. The examples store the value of the
    statistical function in the host language variable maxi, then
    print this value.

27.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    DECLARE_VARIABLE maxi SAME AS PERS.CURRENT_INFO.SALARY;

    main()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    GET
       maxi = MAX CI.SALARY OF CI IN CURRENT_INFO;
    END_GET;

    printf ("%f",maxi);
    COMMIT;
    FINISH;
    }

27.1.2  –  Pascal Example

    program max_function (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    DECLARE_VARIABLE maxi SAME AS PERS.CURRENT_INFO.SALARY;

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    GET
      maxi = MAX CI.SALARY OF CI IN CURRENT_INFO;
    END_GET;

    writeln (maxi:10:2);

    COMMIT;
    FINISH;
    end.

27.2  –  Format

  (B)0get-statement =

   GET qqwqqqq>qqqqqqqqwqqwq> get-item  qqwqqqqq> END_GET qqq>
         mq> on-error qj  mqqqqq ; <qqqqqqj

  (B)0get-item  =

   qqqqwqq> host-var qqqqqqqq>  = qqqqq> value-expr qqqqqqqqqqwqqqq>
       tqq> record-descr qqqq>  = qqqqq> context-var.* qqqqqqqu
       mqq> host-var qqqqqqqq>  = qqqqq> statistical-expr qqqqj

27.2.1  –  Format arguments

    on-error               The ON ERROR clause. Specifies host
                           language or RDML statement(s) to be
                           performed if an error occurs during the
                           GET operation. For more information see
                           the entry on ON ERROR.

    get-item               The GET statement includes an assignment
                           statement specifying a host variable
                           and a database value. The database
                           value is assigned to the host variable
                           from the Oracle Rdb value expression or
                           statistical expression. Note that the
                           GET statement must be the last statement
                           before END_STORE when it is used in a
                           STORE ... END_STORE block.

    host-var               A valid variable name declared in the host
                           program.

    value-expr             A valid RDML value expression. The value
                           expression can include the "<context-
                           variable>.RDB$DB_KEY" expression.

    record-descr           A valid host language record descriptor
                           that contains an entry for each field in
                           the relation. Each field of the record
                           descriptor must match exactly the field
                           names and data types of the fields in the
                           Oracle Rdb relation referenced by the context
                           variable.

    context-var            A context variable. A temporary name that
                           you associate with a relation. You define
                           a context variable in a relation clause.
                           For more information see the entry on
                           Context Variables.

    statistical-expr       A statistical expression; calculates
                           values based on a value expression for
                           every record in the record stream.

28  –  Host Variable

    Use a host variable value expression to pass data between a
    calling program and Oracle Rdb. A host variable is a program
    variable.

28.1  –  Examples

    The following programs demonstrate the use of the
    DECLARE_VARIABLE clause to declare a program variable. These
    programs:

    o  Declare the variable, badge, to have the same data type and
       size attributes as EMPLOYEE_ID in the EMPLOYEES relation.

    o  Use this variable for interactive processing. Note that the
       interactive portion of the programs appear before the READY
       statement. This keeps locks on the database to a minimum.

    o  Select the record from the EMPLOYEES relation that has the
       same value for EMPLOYEE_ID as is stored in badge.

    o  Modify the STATUS_CODE field of this record.

    Note that the C program uses the read_string function to prompt
    for and receive a value for badge. For more information on this
    function see Appendix B of the "RDML Reference Manual".

28.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    extern void read_string();
    static DECLARE_VARIABLE badge SAME AS EMPLOYEES.EMPLOYEE_ID;

    main()
    {
    read_string ("Employee ID: ", badge, sizeof(badge));

    READY PERS;
    START_TRANSACTION READ_WRITE;

    FOR E IN EMPLOYEES WITH E.EMPLOYEE_ID = badge
       MODIFY E USING
          strcpy(E.STATUS_CODE,"1");
       END_MODIFY;
    END_FOR;

    ROLLBACK;
    FINISH;
    }

28.1.2  –  Pascal Example

    program modify_with_host (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    var
       DECLARE_VARIABLE badge SAME AS EMPLOYEES.EMPLOYEE_ID;

    begin
    write  ('Employee ID: ');
    readln (badge);

    READY PERS;
    START_TRANSACTION READ_WRITE;

    FOR E IN EMPLOYEES WITH E.EMPLOYEE_ID = badge
        MODIFY E USING
            E.STATUS_CODE := '1';
        END_MODIFY;
    END_FOR;

    ROLLBACK;
    FINISH;
    end.

28.2  –  Format

  (B)0C-host-variable =

  VMS-name qwqqqqqqwwwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqwwq>
            mq> * qjxtqqq>  .   qqq>  field-identifier  qqqqqux
                    xx                                       xx
                    xtqqq>  [  qwq>  expression qwqq>  ]  qqqux
                    xx          mqqqqqqq , <qqqqqj           xx
                    xx                                       xx
                    xmqqq>  "->"  qqqq> field-identifier qqqqjx
                    mqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqj

    The C pointer operator is shown in quotes to distinguish it from
    the arrows that show the logical flow of the syntax. Do not use
    quotes around the pointer operator in your programs.

  (B)0Pascal-host-variable =

  VMS-name qwqqwqqqqqqqqqqqqqqqqqqq>qqqqqqqqqqqqqqqqqqqqqwqqwqqq>
            x  tqqq>  .  qqq>  field-identifier  qqqqqqqqu  x
            x  x                                         x  x
            x  tqqq>  [  qwq>  expression  qqqwqq>  ]  qqu  x
            x  x          mqqqqqqqq  ,  <qqqqqj          x  x
            x  x                                         x  x
            x  mqqq>  ^  qwqqqqqqqqqqqqq>qqqqqqqqqwqqqqqqj  x
            x             mq>  field-identifier qqj         x
            x                                               x
            mqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqj

28.2.1  –  Format arguments

    VMS-name               A valid OpenVMS name.

    field-indentifier      A valid host language field identifier.

    expression             An expression that evaluates to a valid
                           host language array element.

    "->"                   The C pointer symbol. It is shown in
                           quotes to distinguish it from the arrows
                           that show the logical flow of the syntax.
                           Do not use quotes around the pointer
                           symbol in your program.

29  –  MATCHING

    Lets you use the asterisk (*) and percent (%) pattern matching
    characters in combination with other symbols to test for
    the presence of a specified string anywhere inside a string
    expression.

    You do not have to use the pattern matching characters if the
    string you specify matches the data stored in the database
    exactly. (If the database field is defined as TEXT 10, the string
    you specify must be exactly ten characters.)

    Records are included in the record stream if the string specified
    by match expression is found within the string specified by the
    value expression. The character * matches any string that maps
    onto its position. The character % matches any character that
    maps onto its position. When MATCHING is preceded by the optional
    qualifier NOT, a record is included in the stream if the pattern
    string is not found within the target string.

    MATCHING is not case sensitive; it considers uppercase and
    lowercase forms of the same character to be a match.

29.1  –  Examples

    The following programs demonstrate the use of the MATCHING
    conditional expression and the SORTED clause. These programs
    create a record stream containing all the records in the
    EMPLOYEES relation in which the field LAST_NAME begins with the
    letter "R". Then the programs sort the record stream in ascending
    numerical order of the employee IDS. These programs print, in
    numerical order, the employee ID, followed by the last name and
    first name for all the records in the record stream.

29.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    DECLARE_VARIABLE match_string SAME AS EMPLOYEES.LAST_NAME;

    main()
    {
    read_string(match_string,"R*",sizeof(match_string));

    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR E IN EMPLOYEES
       WITH E.LAST_NAME MATCHING match_string
       SORTED BY E.EMPLOYEE_ID
          printf ("%s  %s  %s",E.EMPLOYEE_ID,
                               E.LAST_NAME,
                               E.FIRST_NAME);
    END_FOR;

    COMMIT;
    FINISH;
    }

29.1.2  –  Pascal Example

    program matching (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    var
      match_string: VARYING [10] OF CHAR;
    begin

    match_string := 'R*';

    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR E IN EMPLOYEES
       WITH E.LAST_NAME MATCHING match_string
       SORTED BY E.EMPLOYEE_ID
          writeln (E.EMPLOYEE_ID,'     ', E.LAST_NAME, E.FIRST_NAME);
    END_FOR;

    COMMIT;
    FINISH;
    end.

29.2  –  Format

  (B)0matching-clause =

  qqq> value-expr qqqwqq>qqqqqqqwq> MATCHING qqq> match-expr qqqq>
                     mqq> NOT qqj

29.2.1  –  Format arguments

    value-expr             A value expression. A symbol or a string
                           of symbols used to calculate a value. When
                           you use a value expression in a statement,
                           Oracle Rdb calculates the value associated
                           with the expression and uses that value
                           when executing the statement.

    match-expr             A match expression. An expression in
                           quotation marks that is used to match a
                           pattern. Use the double quote character
                           (")  in C programs. Use the single quote
                           character (')  in Pascal programs. The
                           match expression can include the following
                           special symbols (called wildcards):

                           o  * Matches a string of zero or more
                              characters that maps onto its position

                           o  % Matches a single character that maps
                              onto its position

30  –  MAX

    Returns the highest value for a value expression for all records
    specified by a record selection expression.

30.1  –  Examples

    The following programs demonstrate the use of the MAX function in
    an assignment statement. These programs:

    o  Declare a host variable, latest_degree

    o  Use the MAX function to compute the highest number stored in
       YEAR_GIVEN in the DEGREES relation

    o  Assign this computed value to the host variable

    o  Print an informational message and the value computed by the
       MAX function

30.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    DECLARE_VARIABLE latest_degree SAME AS DEGREES.YEAR_GIVEN;

    READY PERS;
    START_TRANSACTION READ_ONLY;

    GET
       latest_degree = MAX D.YEAR_GIVEN OF D IN DEGREES;
    END_GET;

    printf ("Latest Degree was awarded in: %d\n", latest_degree);

    COMMIT;
    FINISH;
    }

30.1.2  –  Pascal Example

    program assignmax (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    var
    DECLARE_VARIABLE latest_degree SAME AS DEGREES.YEAR_GIVEN;

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    GET
     latest_degree = MAX D.YEAR_GIVEN OF D IN DEGREES;
    END_GET;

    writeln ('Latest Degree was awarded in: ', latest_degree);

    COMMIT;
    FINISH;
    end.

30.2  –  Format

  (B)0
  q> MAX qqqqqqqqqwq>qqqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqqqqqqqqqqk
                  mq> handle-options qqj                         x
                                                                 x
  lqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
  x
  mqqqqqqqq>  value-expr  qqqq>  OF  qqqq>   rse   qqqqqqqqqqqqq>

  (B)0handle-options =

  q> ( qwqqqqqq>  REQUEST_HANDLE  qqqqq>  var qqqqqqqqwq> ) q>
        tqqqqqq> TRANSACTION_HANDLE qqq>  var qqqqqqqqu
        mqqqqqq> REQUEST_HANDLE q> var q> , qqqqqqqk  x
          lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj  x
          mqqqq> TRANSACTION_HANDLE q> var qqqqqqqqqqqj

30.2.1  –  Format arguments

    value-expr             A value expression. A symbol or a string
                           of symbols used to calculate a value. When
                           you use a value expression in a statement,
                           Oracle Rdb calculates the value associated
                           with the expression and uses that value
                           when executing the statement.

    rse                    A record selection expression. A phrase
                           that defines specific conditions that
                           individual records must meet before
                           Oracle Rdb includes them in a record stream.

    handle-options         A request handle, a transaction handle, or
                           both.

    REQUEST_HANDLE var     The REQUEST_HANDLE keyword followed by a
                           host language variable. A request handle
                           identifies a compiled Oracle Rdb request.
                           If you do not supply a request handle
                           explicitly, RDML associates a unique
                           request handle for the compiled request.

    TRANSACTION_HANDLE     The TRANSACTION_HANDLE keyword followed by
    var                    a host language variable. A transaction
                           handle identifies a transaction. If
                           you do not supply a transaction handle
                           explicitly, RDML uses the default
                           transaction handle.

31  –  MIN

    Returns the lowest value for a value expression for all records
    specified by a record selection expression.

31.1  –  Examples

    The following programs demonstrate the use of the MIN function in
    an assignment statement. These programs:

    o  Store a literal value into all fields for a record in the JOBS
       relation, except the field MINIMUM_SALARY

    o  Cross JOBS over itself

    o  Use the MIN function to compute the lowest salary in the
       existing JOBS records for which the wage class is "1"

    o  Assign this computed value to the record currently being
       stored

    Note that the C program uses the pad_string function to read
    in the values for the STORE statement. This function pads the
    values stored in each field with the correct number of trailing
    blanks to ensure that the length of the values stored match the
    text size of the field. For more information on pad_string, see
    Appendix B of the "RDML Reference Manual".

31.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    DECLARE_VARIABLE min SAME AS PERS.JOBS.MINIMUM_SALARY;

    extern void pad_string();
    main()
    {
    READY PERS;
    START_TRANSACTION READ_WRITE;

    GET
      min = MIN J2.MINIMUM_SALARY OF J2 IN JOBS
            WITH J2.WAGE_CLASS = "1";
    END_GET;

    STORE J IN JOBS USING
        pad_string ("SWPR", J.JOB_CODE, sizeof(J.JOB_CODE));
        pad_string ("1", J.WAGE_CLASS, sizeof(J.WAGE_CLASS));
        pad_string ("Sweeper", J.JOB_TITLE, sizeof(J.JOB_TITLE));
        J.MAXIMUM_SALARY = 10000.00;
        J.MINIMUM_SALARY = min;
    END_STORE;

    ROLLBACK;
    FINISH;
    }

31.1.2  –  Pascal Example

    program store_with_min (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    DECLARE_VARIABLE mini SAME AS PERS.JOBS.MINIMUM_SALARY;

    begin
    READY PERS;
    START_TRANSACTION READ_WRITE;

    GET
      mini = MIN J2.MINIMUM_SALARY OF J2 IN JOBS
             WITH J2.WAGE_CLASS = '1';
    END_GET;

    STORE J IN JOBS USING
        J.JOB_CODE := 'SWPR';
        J.WAGE_CLASS := '1';
        J.JOB_TITLE := 'Sweeper';
        J.MINIMUM_SALARY := mini;
        J.MAXIMUM_SALARY := 10000.00;
    END_STORE;

    ROLLBACK;
    FINISH;
    end.

31.2  –  Format

  (B)0
  qq> MIN qqqqqqqqqqqqqwqq>qqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqqqqqqk
                       mqq> handle-options qj                     x
                                                                  x
  lqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
  x
  mqqqqqqqq> value-expr  qqqqqq>  OF  qqqqqq>     rse   qqqqqqqqqq>

  (B)0handle-options =

  q> ( qwqqqqqq>  REQUEST_HANDLE  qqqqq>  var qqqqqqqqwq> ) q>
        tqqqqqq> TRANSACTION_HANDLE qqq>  var qqqqqqqqu
        mqqqqqq> REQUEST_HANDLE q> var q> , qqqqqqqk  x
          lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj  x
          mqqqq> TRANSACTION_HANDLE q> var qqqqqqqqqqqj

31.2.1  –  Format arguments

    value-expr             A value expression. A symbol or a string
                           of symbols used to calculate a value. When
                           you use a value expression in a statement,
                           Oracle Rdb calculates the value associated
                           with the expression and uses that value
                           when executing the statement.

    rse                    A record selection expression. A phrase
                           that defines specific conditions that
                           individual records must meet before
                           Oracle Rdb includes them in a record stream.

    handle-options         A request handle, a transaction handle, or
                           both.

    REQUEST_HANDLE var     The REQUEST_HANDLE keyword followed by a
                           host language variable. A request handle
                           identifies a compiled Oracle Rdb request.
                           If you do not supply a request handle
                           explicitly, RDML associates a unique
                           request handle for the compiled request.

    TRANSACTION_HANDLE     The TRANSACTION_HANDLE keyword followed by
    var                    a host language variable. A transaction
                           handle identifies a transaction. If
                           you do not supply a transaction handle
                           explicitly, RDML uses the default
                           transaction handle.

32  –  MISSING

    Tests for the absence of a field value. A conditional expression
    that includes MISSING is true if the value specified by the
    dbfield-expression is missing. If you precede the MISSING
    expression with the optional NOT qualifier, the condition is
    true if the field contains a value.

32.1  –  Examples

    The following programs demonstrate the use of the MISSING and
    NOT MISSING conditional expressions. These programs form a record
    stream containing the records in the COLLEGES relation that have
    nothing stored in the field STATE, but do have a college code
    stored in the field COLLEGE_CODE. Each record in the COLLEGES
    relation is tested for the above condition; if a record meets the
    condition these programs print an informational message and the
    college code of the newest record added to the record stream.

32.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    READY PERS;
    START_TRANSACTION READ_WRITE;

    FOR C IN COLLEGES
       WITH C.STATE MISSING
       AND C.COLLEGE_CODE NOT MISSING;
          printf ("State Missing for COLLEGE:  %s\n", C.COLLEGE_CODE);
    END_FOR;

    COMMIT;
    FINISH;
    }

32.1.2  –  Pascal Example

    program missing (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_WRITE;

    FOR C IN COLLEGES
       WITH C.STATE MISSING
       AND C.COLLEGE_CODE NOT MISSING;
          writeln ('State Missing for COLLEGE:', C.COLLEGE_CODE);
    END_FOR;

    COMMIT;
    FINISH;
    end.

32.2  –  Format

  (B)0missing-cond-expr

    qqq> db-field-expr qqq>qqqqwqq>qqqqqqqwqq> MISSING qqq>
                               mqq> NOT qqj

32.2.1  –  Format arguments

    db-field-expr          A database field value expression. A field
                           name qualified with a context variable.

33  –  MODIFY

    Changes the value in a field or fields in one or more records
    from a relation in an open stream.

    Before you use a MODIFY statement, you must:

    o  Start a READ_WRITE transaction

    o  Establish a record stream with a FOR statement or START_STREAM
       statement

    The context variables referenced in a MODIFY statement must be
    the same as those defined in the FOR or START_STREAM statement.

33.1  –  Examples

    The following programs demonstrate the use of the MODIFY
    statement with a host variable. These programs:

    o  Declare a host variable, badge, with the same data type and
       attributes as EMPLOYEES.EMPLOYEE_ID

    o  Prompt for a value for badge

    o  Change the status code for the employee with the specified
       badge

    The C program uses the read_string function to prompt for and
    receive a value for badge. For more information on read_string,
    see Appendix B of the "RDML Reference Manual".

33.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    extern void read_string();
    static DECLARE_VARIABLE badge SAME AS EMPLOYEES.EMPLOYEE_ID;

    main()
    {
    read_string ("Employee ID: ", badge, sizeof(badge));

    READY PERS;
    START_TRANSACTION READ_WRITE;

    FOR E IN EMPLOYEES WITH E.EMPLOYEE_ID = badge
       MODIFY E USING
          strcpy(E.STATUS_CODE,"1");
       END_MODIFY;
    END_FOR;

    ROLLBACK;
    FINISH;
    }

33.1.2  –  Pascal Example

    program modify_with_host (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    var
       DECLARE_VARIABLE badge SAME AS EMPLOYEES.EMPLOYEE_ID;

    begin
    write  ('Employee ID: ');
    readln (badge);

    READY PERS;
    START_TRANSACTION READ_WRITE;

    FOR E IN EMPLOYEES WITH E.EMPLOYEE_ID = badge
        MODIFY E USING
            E.STATUS_CODE := '1';
        END_MODIFY;
    END_FOR;

    ROLLBACK;
    FINISH;
    end.

33.2  –  Format

  (B)0MODIFY qqq> context-var qqqqq>  USING  qqqqwqqqqqqqqqqqqqqwqqqqk
                                             mqq> on-error qj    x
                                                                 x
  lqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
  x
  mqwqwqq>  statement  qqqqqqqqqqqqqqqqqqqqqqqqqqqwqwq> END_MODIFY
    x x                                           x x
    x mqq> context-var.* qq> = qq> record-descr qqj x
    x                                               x
    mqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqj

33.2.1  –  Format arguments

    context-var            A context variable. A temporary name that
                           you associate with a relation. You define
                           a context variable in a relation clause.
                           For more information see the entry on
                           Context Variables.

    on-error               The ON ERROR clause. Specifies host
                           language statement(s) to be performed
                           if an error occurs during the MODIFY
                           operation. For more information see the
                           entry on ON ERROR.

    statement              Any valid RDML or host language statement
                           to be executed within the MODIFY
                           operation. Use a semicolon (;) at the
                           end of each RDML, Pascal, or C statement.

    record-descr           A valid host language record descriptor
                           that matches all the fields of the
                           relation. Each field of the record
                           descriptor must match exactly the field
                           names and data types of the fields in the
                           Oracle Rdb relation referenced by the
                           context variable.

34  –  ON_ERROR

    The ON ERROR clause specifies the statement(s) the host
    language performs if an error occurs during the execution of
    the associated RDML statement.

    You can use the ON ERROR clause in all RDML statements except the
    DATABASE statement.

34.1  –  Examples

    The following programs demonstrate the use of the ON ERROR
    clause to trap lock errors that occur during execution of the
    READY statement. The programs start a transaction using the
    NOWAIT option. This means that execution of the READY statement
    causes a lock error if anyone else has a lock on the EMPLOYEES
    relation when you run the programs. In this case, the programs
    will print the message "database unavailable right now". The
    programs will try to access the database up to 100 more times
    before terminating the programs.

    If the error is not a lock error, the programs print the message
    "Unexpected Error, Application Terminating".

    To illustrate this application, build it, and then run it
    simultaneously from two different terminals.

34.1.1  –  C Example

    globalvalue RDB$_LOCK_CONFLICT;
    globalvalue RDB$_DEADLOCK;

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    void handle_error()
    {
    if (RDB$STATUS == RDB$_LOCK_CONFLICT)
       printf("database unavailable right now\n");
          else
             {
             printf("Unexpected Error, Application Terminating\n");
             RDML$SIGNAL_ERROR(RDB$MESSAGE_VECTOR);
             }
       return;
    }

    void access_employees()
    {
    READY PERS
       ON ERROR
          handle_error();
          return;
       END_ERROR;

    START_TRANSACTION READ_WRITE NOWAIT
       RESERVING EMPLOYEES FOR EXCLUSIVE WRITE
       ON ERROR
          handle_error();
          return;
       END_ERROR;

    /* perform some read_write operation on the EMPLOYEES relation */
    printf ("Accessing EMPLOYEES...\n");

    COMMIT;
    FINISH;
    }

    main()
    {
    int i;
    for (i=0; i<=100; i++)
       access_employees();
    }

34.1.2  –  Pascal Example

    program onerror (output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    var
        RDB$_LOCK_CONFLICT : [value,external] integer;
        i     : integer;
        error : boolean;

    procedure handle_error;
    begin
        if RDB$STATUS = RDB$_LOCK_CONFLICT
        then
            writeln ('database unavailable right now')
        else
            begin
            writeln ('Unexpected Error, Application Terminating');
            RDML$SIGNAL_ERROR(RDB$MESSAGE_VECTOR)
            end;
    end;

    begin
    for i := 1 to 100 do
        begin
        error := FALSE;
        READY PERS;
        START_TRANSACTION READ_WRITE NOWAIT
            RESERVING EMPLOYEES FOR EXCLUSIVE WRITE
            ON ERROR
              handle_error;
              error := TRUE;
            END_ERROR;

        if not error then
          begin
          {perform some read_write operation on the EMPLOYEES relation}
          writeln ('Accessing EMPLOYEES...');

          COMMIT;
          FINISH;
                           end;
        end;
    end.

34.2  –  Format

  (B)0on-error =

  ON ERROR qqwqqq> statement qqqqwqqq> END_ERROR
             mqqqqqqqqq<qqqqqqqqqj

34.2.1  –  Format arguments

    statement              Any valid RDML or host language statement
                           to be executed when an RDML error occurs.
                           Use a semicolon (;) at the end of each
                           RDML, Pascal, or C statement.

35  –  RDB$DB_KEY

    RDB$DB_KEY lets you retrieve a specific record from the database
    using a logical pointer called a database key (dbkey). A dbkey
    indicates a specific record in the database. You can retrieve
    this key as though it were a field in the record. Once you
    have retrieved the database key, you can use it to retrieve
    its associated record directly, as part of a record selection
    expression. The database key gives you the ability to keep
    track of a subset of records in the database and retrieve them
    repeatedly, without using data manipulation syntax.

35.1  –  Examples

    The following programs demonstrate the use of the RDB$DB_KEY
    value expression in a record selection expression. The programs
    sort the EMPLOYEES relation in ascending order of employee ID.
    Then, using the first 100 records from the sorted EMPLOYEES
    relation, the programs build two arrays: rdb_key_array and rdb_
    name_array. In building these arrays within a FOR statement,
    these programs create a one-to-one correspondence between the
    elements in the rdb_key_array and the rdb_name_array. Each time a
    new element is added to each of these arrays the next EMPLOYEES
    record from the sorted stream is printed.

    This one-to-one correspondence allows the programs to step
    through the EMPLOYEES records indirectly. This is demonstrated in
    the second FOR statement. The second FOR statement loops through
    the rdb_key_array in reverse order; each time the address of
    an array element in rdb_key_array is incremented, an EMPLOYEES
    record is accessed (also in reverse sorted order) and the
    employee's last name is printed.

35.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    DECLARE_VARIABLE rdb_key_array[100] SAME AS EMPLOYEES.RDB$DB_KEY;
    DECLARE_VARIABLE rdb_name_array[100] SAME AS EMPLOYEES.LAST_NAME;

    int cnt = 0;

    READY PERS;

    START_TRANSACTION READ_ONLY;

    FOR FIRST 100 E IN EMPLOYEES SORTED BY E.EMPLOYEE_ID
        rdb_key_array[cnt] = E.RDB$DB_KEY;
        strcpy (rdb_name_array[cnt], E.LAST_NAME);
        printf("%s - 1st pass\n", E.LAST_NAME);
        ++cnt;
    END_FOR;

    for ( cnt = --cnt; cnt >= 0; --cnt)
        FOR E IN EMPLOYEES
        WITH E.RDB$DB_KEY = rdb_key_array[cnt]
            if ( strcmp( E.LAST_NAME, rdb_name_array[cnt]) != 0 )
                printf("%s DOES NOT MATCH %s\n",
                           E.LAST_NAME,  rdb_name_array[cnt]);
            else printf("%s - 2nd pass\n", E.LAST_NAME);
        END_FOR;

    COMMIT;
    FINISH;
    }

35.1.2  –  Pascal Example

    program db_key (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    type
        Rdb_Key_Type = BASED ON EMPLOYEES.RDB$DB_KEY;
        Rdb_Name_Type =  BASED ON EMPLOYEES.LAST_NAME;
    var
        Rdb_Key_Array  : ARRAY [1..101] OF Rdb_Key_Type;
        Rdb_Name_Array : ARRAY [1..101] OF Rdb_Name_Type;
        Cnt : INTEGER := 1;

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR FIRST 100 E IN EMPLOYEES SORTED BY E.EMPLOYEE_ID
        Rdb_Key_Array[Cnt] := E.RDB$DB_KEY;
        Rdb_Name_Array[Cnt] := E.LAST_NAME;
        WRITELN(E.LAST_NAME, ' - 1st pass');
        Cnt := Cnt + 1;
    END_FOR;

    for Cnt := Cnt - 1 downto 1 do
        FOR E IN EMPLOYEES
        WITH E.RDB$DB_KEY = Rdb_Key_array[Cnt]
            if  E.LAST_NAME <> Rdb_Name_Array[Cnt]
            then
                writeln (E.LAST_NAME, 'DOES NOT MATCH',
                    Rdb_Name_Array[Cnt])
            else
                                 writeln (E.LAST_NAME, ' - 2nd pass');
        END_FOR;

    COMMIT;
    FINISH;
    end.

35.2  –  Format

  (B)0db-key =

    qqq> context-var qqq> . qqq> RDB$DB_KEY qq>

35.2.1  –  Format arguments

    context-var            A context variable. A temporary name that
                           you associate with a relation. You define
                           a context variable in a relation clause.
                           For more information see the entry on
                           Context Variables.

36  –  RDB$MISSING

    Lets you store the missing value for a field with the STORE
    statement or the MODIFY statement. When a field is referred to
    as missing, you can think of the field as empty, a field in which
    no value is stored.

    In order to use RDB$MISSING, you must have previously defined
    a missing value for the field when you defined the database.
    If a field is left blank, or you use RDB$MISSING without having
    defined a missing value for that field in its field definition,
    RDML returns an error.

36.1  –  Format

  (B)0missing-value =

  qqq> RDB$MISSING qqqqqqqqqqqqqqqqq>qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
  lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
  x
  mq>  (  qwq> context-var . field-name qqqqqqqqqqqqqqqwqq>   )  qqq>
           tq> relation-name . field-name qqqqqqqqqqqqqu
           mq> db-handle . relation-name . field-name qj

36.1.1  –  Format arguments

    context-var            A context variable. A temporary name that
                           you associate with a relation. You define
                           a context variable in a relation clause.
                           For more information see the entry on
                           Context Variables.

    field-name             The name of a field in a relation. For
                           example, once you have defined E as
                           the context variable for the EMPLOYEES
                           relation, E.LAST_NAME is a value
                           expression that refers to a value from
                           the LAST_NAME field of EMPLOYEES.

    relation-name          The name of a relation in the database.

    db-handle              Database handle. A host variable used
                           to refer to a specific database you have
                           invoked. For more information see the
                           entry on the Database Handle clause.

36.2  –  Examples

    The following programs demonstrate the use of the RDB$MISSING
    value expression with the STORE clause. The programs store the
    specified values for the fields in the DEGREES relation. In these
    programs, a value for DEGREE_FIELD is not specified; instead, the
    RDB$MISSING value expression is specified. This does not actually
    assign a value to the degree field; RDML marks the DEGREE_FIELD
    as empty and stores nothing in this field.

    Note that the C program uses the pad_string function to read
    in the values for the STORE statement. This function pads the
    values stored in each field with the correct number of trailing
    blanks to ensure that the length of the values stored match the
    text size of the field. For more information on pad_string, see
    Appendix B of the "RDML Reference Manual".

36.2.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    extern void pad_string();

    main()
    {
    READY PERS;
    START_TRANSACTION READ_WRITE;

    STORE D IN DEGREES USING
       pad_string ("76156", D.EMPLOYEE_ID, sizeof(D.EMPLOYEE_ID));
       pad_string ("HVDU" , D.COLLEGE_CODE, sizeof(D.COLLEGE_CODE));
       D.YEAR_GIVEN = 1978;
       pad_string ("BA", D.DEGREE, sizeof(D.DEGREE));
       pad_string (RDB$MISSING(D.DEGREE_FIELD),D.DEGREE_FIELD,
                   sizeof(D.DEGREE_FIELD));
    END_STORE;

    ROLLBACK;
    FINISH;
    }

36.2.2  –  Pascal Example

    program store_missing (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_WRITE;

    STORE D IN DEGREES USING
       D.EMPLOYEE_ID := '76156';
       D.COLLEGE_CODE := 'HVDU';
       D.YEAR_GIVEN := 1978;
       D.DEGREE := 'BA';
       D.DEGREE_FIELD := RDB$MISSING(D.DEGREE_FIELD);
    END_STORE;

    ROLLBACK;
    FINISH;
    end.

37  –  READY

    Explicitly declares your intention to access one or more
    databases and causes an attach to the database.

37.1  –  Examples

    The following program fragments demonstrate the use of the READY
    statement to open a database. These program fragments:

    o  Use the DATABASE statement to declare the PERSONNEL database

    o  Declare a database handle PERS for PERSONNEL

    o  Open the PERSONNEL database with the READY statement

37.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";
                         .
                         .
                         .
    main ()
    {
    READY PERS;
                         .
                         .
                         .

    FINISH PERS;
    }

37.1.2  –  Pascal Example

    program empupdate;
    DATABASE PERS = FILENAME 'PERSONNEL';
                         .
                         .
                         .
    begin
    READY PERS;
                         .
                         .
                         .

    FINISH PERS;
    end.

37.2  –  Format

  (B)0READY qqqwqqqq>qqqqqqqqqqqqqqwqqqwqqqq>qqqqqqqqqqqqqwqqqqq>
           mqwqq> db-handle qwqj   mqqqq> on-error qqqj
             mqqqqqq , <qqqqqj

37.2.1  –  Format arguments

    db-handle              Database handle. A host variable used
                           to refer to a specific database you have
                           invoked. For more information see the
                           entry on the Database Handle clause.

    on-error               The ON ERROR clause. Specifies host
                           language statement(s) to be executed if an
                           error occurs during the READY operation.
                           For more information see the entry on ON
                           ERROR.

38  –  REDUCED_TO

    The REDUCED TO clause lets you eliminate duplicate values for
    fields in a record stream. You can use this expression to
    eliminate redundancy in the results of a query and to group
    records in a relation according to unique field values.

38.1  –  Examples

    The following programs demonstrate the use of the REDUCED TO
    clause and the SORTED clause with a single relation. These
    programs sort the records in the EMPLOYEES relation on the basis
    of STATE. The REDUCED TO clause limits the record stream so that
    each record in the stream has a different value for the field
    STATE. The programs then display the list of states represented
    in the EMPLOYEES relation.

38.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main ()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR E IN EMPLOYEES
       REDUCED TO E.STATE
       SORTED BY E.STATE
          printf("%s\n", E.STATE);
    END_FOR;

    COMMIT;
    FINISH;
    }

38.1.2  –  Pascal Example

    program reduced_one_rel (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR E IN EMPLOYEES
       REDUCED TO E.STATE
       SORTED BY E.STATE
          writeln (E.STATE);
    END_FOR;

    COMMIT;
    FINISH;
    end.

38.2  –  Format

  (B)0reduce-clause =

    qqqqq> REDUCED TO qqqwqqqqqq> db-field qqqwqqq>
                         mqqqqqq<qqqq , <qqqqqj

38.2.1  –  Format arguments

    db-field               A database field value expression. A
                           database field value expression is a field
                           name qualified with a context variable.
                           The database field must be defined in
                           the current context of the statement.
                           For example, the database field must be
                           defined in the context of the START_STREAM
                           or DECLARE_STREAM statements or the FOR
                           loop. See the DB_Field help entry for more
                           information.

39  –  Relation Clause

    Lets you declare a context variable for a stream or a loop.
    Once you have associated a context variable with a relation,
    you can use only that context variable to refer to records from
    that relation in the record stream you created. Each relation
    (including multiple uses of the same relation) in the record
    stream must have a unique context variable. For more information
    see the entry on Context Variables.

39.1  –  Examples

    The following programs demonstrate the use of the relation clause
    with a FOR loop. These programs declare a context variable E for
    EMPLOYEES. This allows the programs to reference records from the
    EMPLOYEES relation by using the variable E in the host language
    print statements.

39.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR E IN EMPLOYEES
       printf ("%s  %s  %s\n", E.LAST_NAME,
                               E.EMPLOYEE_ID,
                               E.SEX);
    END_FOR;

    COMMIT;
    FINISH;
    }

39.1.2  –  Pascal Example

    program context_variable (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR E IN EMPLOYEES
       writeln (E.LAST_NAME, ' ', E.EMPLOYEE_ID, ' ', E.SEX);
    END_FOR;

    COMMIT;
    FINISH;
    end.

39.2  –  Format

  (B)0relation-clause =

  qq> context-var qqq> IN qqwqq>qqqqqqqqqqqqqqqqqqwqq> relation-name qq>
                            mqq> db-handle qq> . qj

39.2.1  –  Format arguments

    context-var            A context variable. A temporary name that
                           you associate with a relation. You define
                           a context variable in a relation clause.
                           For more information see the entry on
                           Context Variables.

    db-handle              Database handle. A host variable used
                           to refer to a specific database you have
                           invoked. For more information see the
                           entry on the Database Handle clause.

    relation-name          The name of a relation in the database.

40  –  Rel Operators

    Compare value expressions. Relational operators are used in
    conditional expressions. See the table in the list of subtopics
    for a summary of the RDML relational operators.

40.1  –  Table

          Relational       Value
          Operator
    -------------------------------------------------------------
          EQ        =      True if the two value expressions are
                           equal.

          NE        <>     True if the two value expressions are
                           not equal.

          GT        >      True if the first value expression is
                           greater than the second.

          GE        >=     True if the first value expression is
                           greater than or equal to the second.

          LT        <      True if the first value expression is
                           less than the second.

          LE        <=     True if the first value expression is
                           less than or equal to the second.
    -------------------------------------------------------------

         Note:   In all cases, if either value expression is
                 missing, the value of the condition is missing.

40.2  –  Examples

    The following programs demonstrate the use of the LE (less than
    or equal to) operator in a FOR statement. The programs create a
    record stream of all those employees who have an employee ID less
    than or equal to 00400. The programs then print the employee IDs
    from the records in the record stream.

40.2.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    READY PERS;
    START_TRANSACTION READ_WRITE;

    FOR E IN EMPLOYEES WITH E.EMPLOYEE_ID LE "00400"
       printf ("%s\n", E.EMPLOYEE_ID);
    END_FOR;

    COMMIT;
    FINISH;
    }

40.2.2  –  Pascal Example

    program relation (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR E IN EMPLOYEES WITH E.EMPLOYEE_ID LE '00400'
       writeln (E.EMPLOYEE_ID);
    END_FOR;

    COMMIT;
    FINISH;
    end.

41  –  Request Handle

    Identifies a compiled Oracle Rdb request. RDML generates request
    handles for statements that contain record selection expressions.
    In almost all cases, it is unnecessary for you to explicitly
    specify request handles.

    You can use a request handle in the following RDML statements:

    o  GET

    o  FOR

    o  START_STREAM

    o  STORE

    o  Statistical Functions (AVERAGE, COUNT, MAX, MIN, TOTAL)

41.1  –  More

    RDML allows the syntax (REQUEST_HANDLE rh) to go on each statistical
    expression in the GET ... END_GET block, and there is one request per
    statistical expression.  For example,

    GET
       a = COUNT
           (request_handle r1)
            ...;
       b = MAX
           (request_handle r2)
            ...;
    END_GET

41.2  –  Examples

    The following programs demonstrate the use of the REQUEST_HANDLE
    clause in a FOR statement. These programs:

    o  Declare the variable, REQ1, for a request handle and the local
       variable, "name"

    o  Initialize REQ1 to zero

    o  Assign a value to "name"

    o  Start a transaction

    o  Use the request handle in the first FOR statement

    o  Assign a new value to "name"

    o  Use the same request handle again in the second FOR statement

    By using the same request handle in the second (identical)
    request the program can reuse the code generated in the first
    FOR statement for the second FOR statement; this enhances overall
    performance.

41.2.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    DECLARE_VARIABLE name SAME AS PERS.EMPLOYEES.LAST_NAME;
    extern long RDB$RELEASE_REQUEST();
    RDML$HANDLE_TYPE REQ1;

    main()
    {
    REQ1 = 0;
    strcpy(name,"Gray");

    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR (REQUEST_HANDLE REQ1) E IN PERS.EMPLOYEES
         WITH E.LAST_NAME = name
         printf("%s\n",E.FIRST_NAME);
    END_FOR;

    if ((RDB$RELEASE_REQUEST(RDB$MESSAGE_VECTOR, &REQ1) & 1) == 0)
                             RDML$SIGNAL_ERROR(RDB$MESSAGE_VECTOR);

    COMMIT;
    FINISH;
    }

41.2.2  –  Pascal Example

    program request (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    DECLARE_VARIABLE OF name SAME AS PERS.EMPLOYEES.LAST_NAME;
    REQ1 : RDML$HANDLE_TYPE;

    begin
    REQ1 := 0;
    name := 'Gray';

    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR (REQUEST_HANDLE REQ1) E IN PERS.EMPLOYEES
       WITH E.LAST_NAME = name
       writeln (E.FIRST_NAME);
    END_FOR;

    if not RDB$RELEASE_REQUEST(RDB$MESSAGE_VECTOR, REQ1)
    then  RDML$SIGNAL_ERROR(RDB$MESSAGE_VECTOR);

    COMMIT;

    FINISH;
    end.

41.3  –  Format

  (B)0request-handle =

  qq>( q> REQUEST_HANDLE qqqqqqq> host-variable qqqqq> ) qq>

41.3.1  –  Format arguments

    host-variable          A valid host language variable.

42  –  ROLLBACK

    Terminates a transaction and undoes all changes made to the
    database since the program's most recent START_TRANSACTION
    statement or since the start of the specified transaction.

42.1  –  Examples

    The following programs demonstrate the use of the ROLLBACK
    statement with a transaction handle to undo changes to the
    database made with the STORE statement. These programs:

    o  Start a READ_WRITE transaction, SAL_INCREASE

    o  Store a new JOBS record using the SAL_INCREASE transaction

    o  Use the ROLLBACK statement to undo the changes made to the
       database during the SAL_INCREASE increase transaction, that
       is, the new record is not stored in the database

    Note that the C program uses the pad_string function to read
    in the values for the STORE statement. This function pads the
    values stored in each field with the correct number of trailing
    blanks to ensure that the length of the values stored match the
    text size of the field. For more information on pad_string, see
    Appendix B of the "RDML Reference Manual".

42.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    extern void pad_string();

    main()
    {
    int SAL_INCREASE = 0;

    READY PERS;
    START_TRANSACTION (TRANSACTION_HANDLE SAL_INCREASE) READ_WRITE;

    STORE (TRANSACTION_HANDLE SAL_INCREASE) J IN JOBS USING
       pad_string ("TYPS", J.JOB_CODE, sizeof(J.JOB_CODE));
       pad_string ("1", J.WAGE_CLASS, sizeof(J.WAGE_CLASS));
       pad_string ("TYPIST", J.JOB_TITLE, sizeof(J.JOB_TITLE));
       J.MINIMUM_SALARY = 10000;
       J.MAXIMUM_SALARY = 17000;
    END_STORE;

    ROLLBACK (TRANSACTION_HANDLE SAL_INCREASE);
    FINISH;
    }

42.1.2  –  Pascal Example

    program rollback_trans (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';
    var sal_increase : [volatile] integer := 0;

    begin
    READY PERS;
    START_TRANSACTION (TRANSACTION_HANDLE SAL_INCREASE) READ_WRITE;

    STORE (TRANSACTION_HANDLE SAL_INCREASE) J IN JOBS USING
        J.JOB_CODE := 'TYPS';
        J.WAGE_CLASS := '1';
        J.JOB_TITLE := 'Typist';
        J.MINIMUM_SALARY := 10000;
        J.MAXIMUM_SALARY := 17000;
    END_STORE;

    ROLLBACK (TRANSACTION_HANDLE SAL_INCREASE);
    FINISH;
    end.

42.2  –  Format

  (B)0ROLLBACK qqwqq>qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqwqk
             mqq> ( qq> TRANSACTION_HANDLE qq> var qq> )qj x
                                                           x
             lqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqj
             x
             mqqqqqqqqwqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqqqqqq>
                      mq> on-error qqqqj

42.2.1  –  Format arguments

    TRANSACTION_HANDLE     The TRANSACTION_HANDLE keyword followed by
    var                    a host language variable. A transaction
                           handle identifies a transaction. If
                           you do not supply a transaction handle
                           explicitly, RDML uses the default
                           transaction handle.

    on-error               The ON ERROR clause. Specifies host
                           language statement(s) to be performed
                           if an error occurs during the ROLLBACK
                           operation. For more information see the
                           entry on ON ERROR.

43  –  RSE

    A record selection expression (RSE) defines specific conditions
    individual records must meet before Oracle Rdb includes them in a
    record stream. RSE clauses let you:

    o  Include all records in the relation

    o  Eliminate duplicate records

    o  Limit the number of records returned

    o  Test for values and conditions

    o  Sort the records in the record stream

    o  Combine records from the same or different relations

    The RDML rse clauses are:

    o  CROSS

    o  FIRST

    o  REDUCED

    o  SORTED

    o  WITH

    For more information and the syntax diagrams see the HELP entry
    for each of these clauses.

43.1  –  Format

  (B)0rse =

  qqwqqqqqqqqqqqqqqqqqqqwqqq> relation-clause qqwqqqqqqqqqqqqqqqqqqwqk
    mqq> first-clause qqj                       mq> cross-clause qqj x
                                                                     x
   lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
   mwqqqqqqqqqqqqqqqqqqwqwqqqqqqqqqqqqqqqqqqqqwqwqqqqqqqqqqqqqqqqqqwqq>
    mqq> with-clause qqj mqq> reduce-clause qqj mqq> sort-clause qqj

44  –  SORTED_BY

    Lets you sort the records in the record stream by the values of
    specific fields. You sort on a database field value expression,
    called a sort key. The sort key determines the order in which
    Oracle Rdb returns the records in the record stream. The default
    sorting order is ascending order.

44.1  –  Examples

    The following programs demonstrate the use of the SORT clause
    using the default sort order, ascending. These programs:

    o  Sort the records in CURRENT_INFO using SALARY as the sort key

    o  Sort in ascending order because no sort order is specified

    o  Print the last names and salaries stored in the sorted records

44.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR CI IN CURRENT_INFO
       SORTED BY CI.SALARY
          printf ("%s $%f\n",CI.LAST_NAME, CI.SALARY);
    END_FOR;

    COMMIT;
    FINISH;
    }

44.1.2  –  Pascal Example

    program sort_single_field (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR CI IN CURRENT_INFO
       SORTED BY CI.SALARY
          writeln (CI.LAST_NAME, ' $', CI.SALARY :10:2);
    END_FOR;

    COMMIT;
    FINISH;
    end.

44.2  –  Format

  (B)0sort-clause =

  qqq> SORTED BY qqqwqwqqqqqqqqqqqqqqqqwqqqq> db-field qqqqqqwqq>
                    x tqq> ASCENDING qqu                     x
                    x mqq> DESCENDING qj                     x
                    mqqqqqqqqqqqqqq , <qqqqqqqqqqqqqqqqqqqqqqj

44.2.1  –  Format arguments

    ASCENDING              The default sorting order. Oracle Rdb sorts
                           the records in ascending order ("A"
                           precedes "B", 1 precedes 2, and so on).
                           Missing values appear as the last items
                           in this list of sorted values. You can
                           abbreviate the ASCENDING keyword to ASC.

    DESCENDING             Oracle Rdb sorts the records in descending
                           order ("A" follows "B", 1 follows 2, and
                           so on). Missing values appear as the first
                           items in this list of sorted values. You
                           can abbreviate the DESCENDING keyword to
                           DESC.

    db-field               A database field value expression. A
                           database field value expression is a field
                           name qualified with a context variable.
                           For more information see the entry on the
                           Database Field value expression.

45  –  START_TRANSACTION

    START_TRANSACTION initiates a transaction. All the statements
    that modify records within a transaction become permanent when
    the transaction is completed, or none of them do. If you end
    the transaction with the COMMIT statement, all the statements
    within the transaction execute. If you end the transaction with a
    ROLLBACK statement, none of the statements take effect.

    To use the two-phase commit protocol for new application
    programs that invoke only Oracle Rdb databases use the
    DISTRIBUTED_TRANSACTION keyword in the START_TRANSACTION
    statement. When you do this, Oracle Rdb invokes the DECdtm system
    service calls for your application.

45.1  –  Examples

    The following statement starts a transaction with the following
    characteristics:

    o  Default transaction (no user-specified transaction handle)

    o  READ_WRITE access

    o  CONSISTENCY mode

    o  WAIT option (by default)

    o  Will evaluate the constraint JOB_CODE_REQUIRED when the DML
       statement is executed

    o  Will attempt to reserve the relation JOBS for SHARED_WRITE
       access

45.1.1  –  C Statement

    START_TRANSACTION READ_WRITE ON pers USING (READ_WRITE CONSISTENCY
                      EVALUATING pers.JOB_CODE_REQUIRED AT VERB_TIME
                      RESERVING JOBS FOR SHARED WRITE);

45.1.2  –  Pascal Statement

    START_TRANSACTION READ_WRITE ON pers USING (READ_WRITE CONSISTENCY
                      EVALUATING pers.JOB_CODE_REQUIRED AT VERB_TIME
                      RESERVING JOBS FOR SHARED WRITE);

45.2  –  Format

  (B)0START_TRANSACTION qwqqqqqqqqqqqqqqqqqqqq>qqqqqqqqqqqqqqqqqqwqk
                     mq> ( qq> TRANSACTION_HANDLE var qq> ) qj x
   lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqj
   mwqqqqqqqqqqqqqqqq>qqqqqqqqqqqqqqqqwqwqqqqqqq>qqqqqqqqwqk
    mq> distributed-transaction-flag qj tq> tx-options qqu x
                                        mq> on-clause qqqj x
   lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
   mqqwqqqqqqqq>qqqqqqqwqq>
      mqq> on-error qqqj

  (B)0distributed-transaction-flag =

  q> DISTRIBUTED_TRANSACTION qwqqqqqqqqqqqqqqqqqqq>qqqqqqqqqqqqqqqwq>
                              m> DISTRIBUTED_TID distributed-tid qj

  (B)0tx-options =

  qqwq> BATCH_UPDATE qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqwq>
    x                                                                x
    mqqwqqqqqqqqqqqqqqqqqwqqwqqqqqqqqqqqwqqwqqqqqqqqqqqqqqqqqwqqqqqk x
       tq> READ_ONLY  qqqu  tq> WAIT qqqu  tq> CONCURRENCY qqu     x x
       mq> READ_WRITE qqqj  mq> NOWAIT qj  mq> CONSISTENCY qqj     x x
                                                                   x x
    lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x
    x                                                                x
    mqqqwqq>qqqqqqqqqqqqqqqq>qqqqqqqqqqqqqqqqqqqqqqqwqqqqqqqq>qqqqqk x
        mqq> EVALUATING qqwq> evaluating-clause qqqwj              x x
                          mqqqqqqqq  , <qqqqqqqqqqqj               x x
                                                                   x x
    lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x
    x                                                                x
    mqwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqwqqqqqqqqqq>qqqqqqqj
      mqq> RESERVING qqqwq> reserving-clause qqwqqj
                        mqqqqqqqqqqq , <qqqqqqqj

  (B)0on-clause =

  qwq> ON qwq> db-handle qwq> USING qqq> ( qwq> tx-options   qwq> )qwq>
   x       x              x                 mq> DEFAULTS qqqqqj     x
   x       mqqqq  , <qqqqqj                                         x
   x                                                                x
   mqqqqqqqqqqqqqqqqqqqqqqqqq<qqq AND <qqqqqqqqqqqqqqqqqqqqqqqqqqqqqj

  (B)0evaluating-clause =

  qqwqqqqqqqqqqqqqqq>qqqqqqqqwqq constraint qqk
    mq> db-handle qq> . qq> qj                x
                                              x
    lqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqj
    x
    mqqqqq>  AT qqqwqq> VERB_TIME qqqwqqqq>
                   mqq> COMMIT_TIME qj

  (B)0reserving-clause =

  qqqwqqwqqqqqqqq>qqqqqqqqqqqqwqqq> relation-name qqqqqqqqqqqwqqk
     x  mq> db-handle qq> . <qj                              x  x
     x                                                       x  x
     mqqqqqqqqqqqqqqqqqqq , <qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj  x
                                                                x
     lqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
     x
     mqq> FOR qqwq>qqqqqqqqqqqqqqqwqqqwqq> READ qqqwqqqqqqqqqqqqqqk
                tq> EXCLUSIVE qqqqu   mqq> WRITE qqj              x
                tq> PROTECTED qqqqu                               x
                mq> SHARED qqqqqqqj                               x
                                                                  x
      lqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
      x
      mqqqqqqqqqwqqqqqqqqqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqqqqqqqqqq>
                tq> WITH AUTO_LOCKING qqqu
                mq> WITH NOAUTO_LOCKING qj

45.2.1  –  Format arguments

    TRANSACTION_HANDLE     The TRANSACTION_HANDLE keyword followed by
    var                    a host language variable. A transaction
                           handle identifies a transaction. If
                           you do not supply a transaction handle
                           explicitly, RDML uses the default
                           transaction handle.

    DISTRIBUTED_           You use this clause to specify the
    TRANSACTION            distributed transaction of which your
                           transaction will be a part.

    DISTRIBUTED_TID        A keyword followed by a host language
    distributed-tid        variable. You use the distributed-
                           tid variable to hold the value of the
                           distributed TID that DECdtm services
                           generate and return to the application.
                           DECdtm services use the TID to distinguish
                           the databases involved in a particular
                           distributed transaction.

    tx-options             Transaction options. Allow you to specify
                           the type of transaction you want, when you
                           want constraints to be evaluated and which
                           relations you intend to access.

    on-clause              Allows you to specify which database you
                           intend to access.

                           If you do not specify the ON clause, the
                           default Oracle Rdb behavior is to attempt
                           to start a transaction on all declared
                           databases (even if the RESERVING clause of
                           the START_TRANSACTION statement explicitly
                           specifies only tables in a particular
                           database).

    DEFAULTS               Allows you to specify that you want to
                           accept the default transaction options.

    on-error               The ON ERROR clause. Specifies
                           host language statement(s) to be
                           performed if an error occurs during the
                           START_TRANSACTION operation. For more
                           information see the entry on ON ERROR.

    BATCH_UPDATE
    READ_ONLY
    READ_WRITE             Declares what you intend to do with the
                           transaction as a whole. READ_ONLY is the
                           default.

    WAIT
    NOWAIT                 Specifies what your transaction will do
                           if it needs resources that are locked by
                           another transaction:

                           o  WAIT is the default. It causes your
                              transaction to wait until the necessary
                              recourses are released or until Oracle Rdb
                              detects a deadlock.

                           o  With NOWAIT, Oracle Rdb will return an
                              error if the resources you need are not
                              immediately available, thereby forcing
                              you to roll back your transaction.

    CONCURRENCY
    CONSISTENCY            These options specify the consistency mode
                           of the transaction:

                           o  CONCURRENCY is equivalent to SQL
                              ISOLATION LEVEL READ COMMITTED
                              (formerly called CONSISTENCY LEVEL
                              2).

                           o  CONSISTENCY is the default. Consistency
                              guarantees that when all transactions
                              complete by committing or rolling back,
                              the effect on the database is the
                              same as if all transactions were run
                              sequentially.

    evaluating-clause      Allows you to specify the point at which
                           the named constraint(s) are evaluated. If
                           you specify VERB_TIME, they are evaluated
                           when the data manipulation statement is
                           issued. If you specify COMMIT_TIME, they
                           are evaluated when the COMMIT statement
                           executes. The evaluating clause is allowed
                           syntactically, but is ignored, with
                           READ_ONLY transactions.

    db-handle              Database handle. A host variable used
                           to refer to a specific database you have
                           invoked. For more information see the
                           entry on the Database Handle clause.

    constraint             The name of an Oracle Rdb constraint.

    VERB_TIME
    COMMIT_TIME            VERB_TIME states when the data
                           manipulation statement is issued. COMMIT_
                           TIME reflects when the COMMIT statement
                           executes. VERB_TIME is the default.

    reserving-clause       Allows you to specify the relations you
                           plan to use and attempts to lock those
                           relations for your access. If you use the
                           WITH AUTO_LOCKING option (the default),
                           constraints and triggers defined on the
                           reserved relations will be able to access
                           additional relations that do not appear
                           in the list of reserved relations. The
                           WITH_AUTOLOCKING option will not work
                           for other relations not referenced in the
                           reserving clause.

    relation-name          The name of a relation in the database.

    EXCLUSIVE
    PROTECTED
    SHARED                 The Oracle Rdb share modes. The keyword
                           you choose determines what operations
                           you allow others to perform on the
                           relations you are reserving. For READ_ONLY
                           transactions, EXCLUSIVE and PROTECTED are
                           syntactically allowed, but are ignored.
                           SHARED is the default.

    READ
    WRITE                  Declares what you intend to do with the
                           relations you have reserved:

                           o  READ reserves the specified relation(s)
                              for read-only access

                           o  WRITE reserves the specified
                              relation(s) for read and write access

    WITH AUTO_LOCKING
    WITH NOAUTO_LOCKING    Oracle Rdb automatically locks any relations
                           referenced within a transaction unless you
                           specify the optional WITH NOAUTO_LOCKING
                           clause. WITH AUTO_LOCKING is the default.

46  –  STARTING_WITH

    The STARTING WITH conditional expression tests for the presence
    of a specified string at the beginning of a string expression. A
    STARTING WITH conditional expression is true if the second string
    expression begins with the characters specified in the first
    string expression.

    If you precede the STARTING WITH expression by the optional NOT
    qualifier, the condition is true if the first value expression
    does not begin with the characters specified by the second value
    expression.

    The STARTING WITH conditional expression is case-sensitive; it
    considers uppercase and lowercase forms of the same character to
    be different.

46.1  –  Examples

    The following programs demonstrate the use of the STARTING WITH
    clause. These programs create a record stream containing the
    records in the EMPLOYEES relation in which the field LAST_NAME
    has a name that begins with the string "IACO" or "Iaco". These
    programs print the employee ID and last name contained in each
    record in the record stream.

46.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR E IN EMPLOYEES CROSS D1 IN DEGREES OVER EMPLOYEE_ID
       WITH (UNIQUE D2 IN DEGREES WITH D2.EMPLOYEE_ID = E.EMPLOYEE_ID)
       AND D1.DEGREE_FIELD = "Arts"
       AND D1.COLLEGE_CODE = "STAN"
          printf ("%s\n", E.EMPLOYEE_ID);
    END_FOR;

    COMMIT;
    FINISH;
    }

46.1.2  –  Pascal Example

    program multiple_cond (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR E IN EMPLOYEES CROSS D1 IN DEGREES OVER EMPLOYEE_ID
       WITH (UNIQUE D2 IN DEGREES WITH D2.EMPLOYEE_ID = E.EMPLOYEE_ID)
       AND D1.DEGREE_FIELD = 'Arts'
       AND D1.COLLEGE_CODE = 'STAN'
          writeln (E.EMPLOYEE_ID);
    END_FOR;

    COMMIT;
    FINISH;
    end.

46.2  –  Format

  (B)0starting-with-clause =

  qqq> value-expr qqwqq>qqqqqqqqwqq> STARTING WITH qqq> value-expr qq>
                    mqq> NOT qqqj

46.2.1  –  Format arguments

    value-expr             A value expression. A symbol or a string
                           of symbols used to calculate a value. When
                           you use a value expression in a statement,
                           Oracle Rdb calculates the value associated
                           with the expression and uses that value
                           when executing the statement.

47  –  Statistical funcs

    Calculate values based on a value expression for every record
    in a record stream. You do not specify a value expression for
    the COUNT statistical function because it operates on the record
    stream formed by the RSE, not on a value expression. When you
    use the AVERAGE, MAX, MIN, and TOTAL statistical functions, you
    specify a value expression and a record selection expression
    (RSE). Oracle Rdb then:

    o  Evaluates the value expression for each record in the record
       stream formed by the RSE

    o  Calculates a single value based on the results of the first
       step

    The RDML Statistical functions are:

    o  AVERAGE

    o  COUNT

    o  MIN

    o  MAX

    o  TOTAL

    For more information and the syntax diagrams see the HELP entry
    on each of these functions.

47.1  –  Format

  (B)0statistical-expr =

  qqqwqq> MAX qqqqqwqq> value-expr qwqqqqqqqqqqqqqqqqqqqqqk
     tqq> MIN qqqqqu                x                     x
     tqq> TOTAL qqqu                x                     x
     tqq> AVERAGE qj                x                     x
     mqq> COUNT qqqqqqqqqqqqqqqqqqqqj                     x
   lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
   mqqqqqqqqqqqqqqqqqq>qqqqqqqwqq>qqqqqqqqqqqqqqqqqqqqwqqqk
                              mqq>  handle-options qqqj   x
                                                          x
   lqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqj
   mqqq>  OF  qqqqqqq>  rse  qqqqqqqqqqqqqqqqqqqqqqqqqqqqq>

47.1.1  –  Format arguments

    value-expr             A value expression. A symbol or a string
                           of symbols used to calculate a value. When
                           you use a value expression in a statement,
                           Oracle Rdb calculates the value associated
                           with the expression and uses that value
                           when executing the statement.

    handle-options         A transaction handle, a request handle, or
                           both.

    rse                    A record selection expression. A phrase
                           that defines specific conditions that
                           individual records must meet before
                           Oracle Rdb includes them in a record stream.

48  –  TOTAL

    Returns the sum of the values specified by a record selection
    expression. The value expression must be a numeric data type.

48.1  –  Examples

    The following programs demonstrate the use of the TOTAL function
    in an assignment statement. These programs:

    o  Use the TOTAL function to compute the total amount budgeted
       for all departments in the DEPARTMENTS relation

    o  Print this computed value

48.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    DECLARE_VARIABLE all SAME AS PERS.DEPARTMENTS.BUDGET_ACTUAL;
    main()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    GET
        all = TOTAL D.BUDGET_ACTUAL OF D IN DEPARTMENTS;
    END_GET;

    printf ("%f", all);

    COMMIT;
    FINISH;
    }

48.1.2  –  Pascal Example

    program total_function (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    all : double;

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    GET
       all = TOTAL D.BUDGET_ACTUAL OF D IN DEPARTMENTS;
    END_GET;

    writeln (all:10:2);

    COMMIT;
    FINISH;
    end.

48.2  –  Format

  (B)0 q> TOTAL qqqqqwq>qqqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqqqqqqqk
                 mq> handle-options qqj                      x
                                                             x
  lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqj
  x
  mqq>  value-expr  qqqqqq>  OF  qqqqqq>   rse   qqqqqqqqqqqq>

  (B)0handle-options =

  q> ( qwqqqqqq>  REQUEST_HANDLE  qqqqq>  var qqqqqqqqwq> ) q>
        tqqqqqq> TRANSACTION_HANDLE qqq>  var qqqqqqqqu
        mqqqqqq> REQUEST_HANDLE q> var q> , qqqqqqqk  x
          lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj  x
          mqqqq> TRANSACTION_HANDLE q> var qqqqqqqqqqqj

48.2.1  –  Format arguments

    value-expr             A value expression. A symbol or a string
                           of symbols used to calculate a value. When
                           you use a value expression in a statement,
                           Oracle Rdb calculates the value associated
                           with the expression and uses that value
                           when executing the statement.

    rse                    A record selection expression. A phrase
                           that defines specific conditions that
                           individual records must meet before
                           Oracle Rdb includes them in a record stream.

    handle-options         A request handle, a transaction handle, or
                           both.

    REQUEST_HANDLE var     The REQUEST_HANDLE keyword followed by a
                           host language variable. A request handle
                           identifies a compiled Oracle Rdb request.
                           If you do not supply a request handle
                           explicitly, RDML associates a unique
                           request handle for the compiled request.

    TRANSACTION_HANDLE     The TRANSACTION_HANDLE keyword followed by
    var                    a host language variable. A transaction
                           handle identifies a transaction. If
                           you do not supply a transaction handle
                           explicitly, RDML uses the default
                           transaction handle.

49  –  STORE Statement

    Inserts a record into an existing relation. You can add a
    record to only one relation with a single STORE statement.
    The statements between the keywords STORE and END_STORE form a
    context block. You cannot store records into views defined by any
    of the following record selection expression (RSE) clauses:

    o  WITH

    o  CROSS

    o  REDUCED

    o  FIRST

    Trying to store into views that were defined with any of the
    above clauses could cause unexpected results in your database.

    You can use the GET statement within the bounds of the STORE ...
    END_STORE block. Note that any valid format of the GET statement
    is permitted within this block.

    You may find it particularly useful to use the GET statement to
    place the database key (dbkey) of the record you are storing into
    a host variable. Use the GET...RDB$DB_KEY construct to assign the
    value of the dbkey to the host variable.

49.1  –  Examples

    The following programs demonstrate the use of the STORE
    statement. The programs:

    o  Prompt the user for information to store in the COLLEGES
       relation

    o  Start a READ_WRITE transaction

    o  Use a STORE statement to store the user input into the
       COLLEGES relation

    o  Use the GET statement to store the value of the dbkey for
       the newly stored record into the host variable my_db_key.
       (Retrieving the dbkey is not a required part of the STORE
       statement syntax, but may be helpful in some applications.)

49.1.1  –  C Example

    DATABASE PERS = FILENAME "PERSONNEL";

    extern void read_string();
    static DEFINE_TYPE coll_code SAME AS COLLEGES.COLLEGE_CODE;
    static DEFINE_TYPE coll_name SAME AS COLLEGES.COLLEGE_NAME;
    static DEFINE_TYPE coll_city SAME AS COLLEGES.CITY;
    static DEFINE_TYPE coll_state SAME AS COLLEGES.STATE;
    static DEFINE_TYPE post_code SAME AS COLLEGES.POSTAL_CODE;
    static DEFINE_TYPE my_db_key SAME AS COLLEGES.RDB$DB_KEY;

    main()
    {
    read_string ("Enter College Code: ", coll_code, sizeof(coll_code));
    read_string ("Enter College Name: ", coll_name, sizeof(coll_name));
    read_string ("Enter College City: ", coll_city, sizeof(coll_city));
    read_string ("Enter College State: ",coll_state, sizeof(coll_state));
    read_string ("Enter Postal Code: ", post_code, sizeof(post_code));

    READY PERS;
    START_TRANSACTION READ_WRITE;

    STORE C IN COLLEGES USING
       strcpy (C.COLLEGE_CODE, coll_code);
       strcpy (C.COLLEGE_NAME, coll_name);
       strcpy (C.CITY, coll_city);
       strcpy (C.STATE, coll_state);
       strcpy (C.POSTAL_CODE, post_code);
       GET
          my_db_key = C.RDB$DB_KEY;
       END_GET;
    END_STORE;

    COMMIT;
    FINISH;
    }

49.1.2  –  Pascal Example

    program store_with_host_lang (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    var
       DECLARE_VARIABLE coll_code SAME AS COLLEGES.COLLEGE_CODE;
       DECLARE_VARIABLE coll_name SAME AS COLLEGES.COLLEGE_NAME;
       DECLARE_VARIABLE coll_city SAME AS COLLEGES.CITY;
       DECLARE_VARIABLE coll_state SAME AS COLLEGES.STATE;
       DECLARE_VARIABLE post_code SAME AS COLLEGES.POSTAL_CODE;
       DECLARE_VARIABLE my_db_key SAME AS COLLEGES.RDB$DB_KEY;
    begin
       writeln ('Enter College Code:');
       readln  (coll_code);
       writeln ('Enter College Name:');
       readln  (coll_name);
       writeln ('Enter College City:');
       readln  (coll_city);
       writeln ('Enter College State:');
       readln  (coll_state);
       writeln ('Enter College Postal Code:');
       readln  (post_code);

       READY PERS;
       START_TRANSACTION READ_WRITE;

       STORE C IN COLLEGES USING
          C.COLLEGE_CODE := coll_code;
          C.COLLEGE_NAME := coll_name;
          C.CITY := coll_city;
          C.STATE := coll_state;
          C.POSTAL_CODE := post_code;
          GET
            my_db_key = C.RDB$DB_KEY;
          END_GET;
       END_STORE;

       COMMIT;
       FINISH;
    end.

49.2  –  Format

  (B)0STORE qqqqwqq>qqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
            mqq> handle-options qj                                x
                                                                  x
  lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
  mqq> context-var qqq> IN qqqqqqqqqqqqqqqqqqqqqqqqqqq>qqqqqqqqqqqk
  lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
  mqqwq>qqqqqqqqqqqqqqqqqqwqq> relation-name qqqqq> USING  qqqqqqqk
     mq> db-handle qq> . qj                                       x
  lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqj
  mqqwq>qqqqqqqqqqqwqqwq>  statement qqqqqqqqqqqqqqqqqqqqqqqqqqqqwk
     mq> on-error qj  tq>  context-var.* qq> = qq> record-descr qux
                      mqqqqqqqqqqqqqqqqqq <qqqqqqqqqqqqqqqqqqqqqqjx
  lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqj
  mqqqqqqqqwqqqqqqqqqqqqqqqqqqwqqqqqqqqqq> END_STORE
           mq> get-statement qj

  (B)0handle-options =

  q> ( qwqqqqqq>  REQUEST_HANDLE  qqqqq>  var qqqqqqqqwq> ) q>
        tqqqqqq> TRANSACTION_HANDLE qqq>  var qqqqqqqqu
        mqqqqqq> REQUEST_HANDLE q> var q> , qqqqqqqk  x
          lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj  x
          mqqqq> TRANSACTION_HANDLE q> var qqqqqqqqqqqj

  (B)0get-statement =

   GET qqwqqqq>qqqqqqqqwqqwq> get-item  qqwqqqqq> END_GET qqq>
         mq> on-error qj  mqqqqq ; <qqqqqqj

  (B)0get-item  =

   qqqqwqq> host-var qqqqqqqq>  = qqqqq> value-expr qqqqqqqqqqwqqqq>
       tqq> record-descr qqqq>  = qqqqq> context-var.* qqqqqqqu
       mqq> host-var qqqqqqqq>  = qqqqq> statistical-expr qqqqj

49.2.1  –  Format arguments

    handle-options         A request handle, a transaction handle, or
                           both.

    REQUEST_HANDLE var     The REQUEST_HANDLE keyword followed by a
                           host language variable. A request handle
                           identifies a compiled Oracle Rdb request.
                           If you do not supply a request handle
                           explicitly, RDML associates a unique
                           request handle for the compiled request.

    TRANSACTION_HANDLE     The TRANSACTION_HANDLE keyword followed by
    var                    a host language variable. A transaction
                           handle identifies a transaction. If
                           you do not supply a transaction handle
                           explicitly, RDML uses the default
                           transaction handle.

    context-var            A context variable. A temporary name that
                           you associate with a relation. You define
                           a context variable in a relation clause.
                           For more information see the entry on
                           Context Variables.

    db-handle              Database handle. A host variable used
                           to refer to a specific database you have
                           invoked. For more information see the
                           entry on the Database Handle clause.

    relation-name          The name of a relation in the database.

    on-error               The ON ERROR clause. The first occurrence
                           specifies host language or RDML
                           statement(s) to be performed if an error
                           occurs during the STORE operation. The
                           second occurrence specifies host language
                           or RDML statement(s) to be performed if
                           an error occurs during the GET operation.
                           For more information see the entry on ON
                           ERROR.

    statement              Any valid RDML or host language statement,
                           except the GET statement, to be executed
                           during the STORE operation. Use a
                           semicolon (;) at the end of each RDML,
                           Pascal, or C statement.

    get-item               The GET statement includes an assignment
                           statement specifying a host variable and
                           a database value. The database value is
                           assigned to the host variable from the
                           Oracle Rdb value expression or statistical
                           expression. Note that the GET statement
                           must be the last statement to appear
                           before the END_STORE statement.

    host-var               A valid variable name declared in the host
                           program.

    value-expr             A valid RDML value expression. The value
                           expression can include the "<context-
                           variable>.RDB$DB_KEY" expression.

    record-descr           A valid host language record descriptor
                           that contains an entry for each field in
                           fields of the relation. Each field of the
                           record descriptor must match exactly the
                           field names and data types of the fields
                           in the Oracle Rdb relation referenced by
                           the context variable.

    statistical-expr       A statistical expression; calculates
                           values based on a value expression for
                           every record in the record stream.

50  –  STORE Seg Strings

    Stores a segmented string into a segmented string field. Must be
    nested within a regular STORE statement.

50.1  –  Examples

    The following programs demonstrate the use of the STORE statement
    to store segmented strings in a record. These programs:

    o  Declare an array to hold the segmented strings to be stored.

    o  Assign values to the array.

    o  Use a STORE operation to store the employee ID in the RESUMES
       record.

    o  Use an inner STORE operation to store the segmented strings.
       This ensures that the employee ID and the segmented strings
       are stored in the same record.

    o  Store the values from the array into the RESUME field of
       RESUMES.

    o  Complete the STORE operation.

    o  Retrieve the segmented strings (just stored) using a nested
       FOR statement.

    For more information on retrieving segmented strings, see the
    entry on FOR Seg_String.

50.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    int line;
    char *document[3];

    document[0] = "first line of resume  ";
    document[1] = "second line of resume ";
    document[2] = "last line of resume   ";

    READY PERS;
    START_TRANSACTION READ_WRITE;

        STORE R IN RESUMES USING
            strcpy (R.EMPLOYEE_ID,"12345");
                             for (line = 0; line <= 2; line++)
                STORE LINE IN R.RESUME
                                     strcpy(LINE.VALUE,document[line]);
                    LINE.LENGTH = strlen(LINE.VALUE);
                END_STORE;
        END_STORE;

    FOR R IN RESUMES WITH R.EMPLOYEE_ID = "12345"
        FOR LINE IN R.RESUME
          printf("%s\n",LINE.VALUE);
        END_FOR;
    END_FOR;

    COMMIT;
    FINISH;
    }

50.1.2  –  Pascal Example

    program segstr (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    type                     lines = varying [80] of char;
    var                      linecnt  : integer;
                             document : array [0..2] of lines;

    begin

    document[0] := 'first line of resume  ';
    document[1] := 'second line of resume ';
    document[2] := 'last line of resume   ';

    READY PERS;
    START_TRANSACTION READ_WRITE;

    STORE R IN RESUMES USING
       R.EMPLOYEE_ID:= '12345';
       for linecnt := 0 to 2 do
           STORE SEG IN R.RESUME
                               SEG  := document[linecnt];
                               SEG.LENGTH := length(document[linecnt]);
            END_STORE;
    END_STORE;

    COMMIT;

    START_TRANSACTION READ_WRITE;

    FOR R IN RESUMES WITH R.EMPLOYEE_ID = '12345'
        FOR SEG IN R.RESUME
          writeln(SEG);
        END_FOR;
    END_FOR;

    COMMIT;
    FINISH;
    end.

50.2  –  Format

  (B)0STORE qqqqqwq>qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq>qqwqqqqqqqk
             mq> ( qq> TRANSACTION_HANDLE qq  var qq>  )qj       x
        lqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqj
        mqq> ss-handle  qqq> IN qqqq> ss-field qqqqqqqqqqqqqqqqqqk
        lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqj
        mqq> USING qqqwq>qqqqqqqqqqqqwqqqqqqqqqqqqqqqqqqk
                      mq> on-error qqj                  x
        lqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
        mqqqqqqqqqqqqqqqq assignment qqqqqqqqqqqq>qqqqqqk
                                                        x
        lqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqj
        mqqqq> END_STORE qqqqq>

50.2.1  –  Format arguments

    TRANSACTION_HANDLE     The TRANSACTION_HANDLE keyword followed by
    var                    a host language variable. A transaction
                           handle identifies a transaction. If
                           you do not supply a transaction handle
                           explicitly, RDML uses the default
                           transaction handle.

    ss-handle              A segmented string handle. A name that
                           identifies the segmented string.

    ss-field               A qualified field name that refers to a
                           field defined with the SEGMENTED STRING
                           data type. Note that this field name, like
                           all field names in a FOR statement, must
                           be qualified by its own context variable.
                           This second context variable must match
                           the variable declared in the outer FOR
                           statement. See the Examples entry.

    on-error               The ON ERROR clause. Specifies host
                           language statement(s) to be performed
                           if an error occurs during the STORE
                           operation. For more information see the
                           entry on ON ERROR.

    assignment             Associates the two database variables with
                           a value expression. The database variables
                           refer to the segment of a segmented string
                           and its length. The special name for
                           the segment can be either "VALUE" or
                           "RDB$VALUE". The special name for the
                           segment length can be either "LENGTH"
                           or "RDB$LENGTH". You cannot assign any
                           other database variables to the value
                           expressions for segmented strings. The
                           assignment operator for RDML Pascal is
                           ":=" and for RDML C is "=" or strcpy.

51  –  Trans Handle

    A host language variable that allows you to associate a name
    with a particular transaction. If you do not supply a handle name
    explicitly, RDML defines a default transaction handle for the
    transaction.

51.1  –  Examples

    The following programs demonstrate the use a host variable value
    expression as a transaction handle. These programs declare the
    host variable, EMP_UPDATE. The programs use EMP_UPDATE to qualify
    the transaction in the START_TRANSACTION expression, the record
    selection expression, and the COMMIT statement. The record
    selection expression modifies the record with the specified ID
    number in the EMPLOYEES relation. The COMMIT statement, also
    qualified with the transaction handle, ensures that the modified
    record is stored in the database.

    Note that the C program uses the pad_string function to read
    in the values for the STORE statement. This function pads the
    values stored in each field with the correct number of trailing
    blanks to ensure that the length of the values stored match the
    text size of the field. For more information on pad_string, see
    Appendix B of the "RDML Reference Manual".

51.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    extern void pad_string();

    main()
    {
    int EMP_UPDATE = 0;

    READY PERS;
    START_TRANSACTION (TRANSACTION_HANDLE EMP_UPDATE) READ_WRITE;

    FOR (TRANSACTION_HANDLE EMP_UPDATE) E IN EMPLOYEES
       WITH E.EMPLOYEE_ID = "00178"
          MODIFY E USING
             pad_string("Brannon", E.LAST_NAME, sizeof(E.LAST_NAME));
          END_MODIFY;
    END_FOR;

    COMMIT(TRANSACTION_HANDLE EMP_UPDATE);
    FINISH;
    }

51.1.2  –  Pascal Example

    program trhand (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    var EMP_UPDATE : [volatile] integer := 0;

    begin

    READY PERS;
    START_TRANSACTION (TRANSACTION_HANDLE EMP_UPDATE) READ_WRITE;

    FOR (TRANSACTION_HANDLE EMP_UPDATE) E IN EMPLOYEES
       WITH E.EMPLOYEE_ID = '00178'
          MODIFY E USING
             E.LAST_NAME := 'Brannon';
          END_MODIFY;
    END_FOR;

    COMMIT (TRANSACTION_HANDLE EMP_UPDATE);
    FINISH;
    end.

51.2  –  Format

  (B)0transaction-handle =

  qq>  (  qq> TRANSACTION_HANDLE  qqq> host-var q>   )  qqq>

51.2.1  –  Format arguments

    host-var               A valid host language variable.

52  –  Undeclared START STREAM

    Declares and opens a record stream. The undeclared START_STREAM
    statement:

    o  Forms a record stream from one or more relations. The record
       selection expression determines the records in the record
       stream.

    o  Places a pointer for that stream just before the first record
       in this stream.

    You must then use the FETCH statement to advance the pointer one
    record at a time through the stream and other RDML statements
    (for example, MODIFY and ERASE) to manipulate each record.

52.1  –  Examples

    The following programs:

    o  Create a record stream, CURRENT_INF_STREAM, consisting of the
       CURRENT_INFO record sorted by highest salary first

    o  Fetch the first record, thereby fetching the CURRENT_INFO
       record with the highest salary

    o  Display a message about that record

52.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    START_STREAM CURRENT_INF_STREAM USING
       CI IN CURRENT_INFO SORTED BY DESC CI.SALARY;
       FETCH CURRENT_INF_STREAM;
          printf ("%s makes the largest salary!\n", CI.LAST_NAME);
    END_STREAM CURRENT_INF_STREAM;

    COMMIT;
    FINISH;
    }

52.1.2  –  Pascal Example

    program record_stream (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    START_STREAM CURRENT_INF_STREAM USING
       CI IN CURRENT_INFO SORTED BY DESC CI.SALARY;
       FETCH CURRENT_INF_STREAM;
          writeln (CI.LAST_NAME, ' makes the largest salary!');
    END_STREAM CURRENT_INF_STREAM;

    COMMIT;
    FINISH;
    end.

52.2  –  Format

  (B)0START_STREAM qqqwqq>qqqqqqqqqqqqqqqqqqwqqq> stream-name qqqqqqk
                  mqq> handle-options qqj                       x
                                                                x
  lqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
  x
  mqqqqqqqq>  USING  qqqq>  rse  qqqqwqqqqqqqqqqqqqqqwqqqqqqqqqq>
                                     mqq> on-error qqj

  (B)0on-error =

  ON ERROR qqwqqq> statement qqqqwqqq> END_ERROR
             mqqqqqqqqq<qqqqqqqqqj

  (B)0handle-options =

  q> ( qwqqqqqq>  REQUEST_HANDLE  qqqqq>  var qqqqqqqqwq> ) q>
        tqqqqqq> TRANSACTION_HANDLE qqq>  var qqqqqqqqu
        mqqqqqq> REQUEST_HANDLE q> var q> , qqqqqqqk  x
          lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj  x
          mqqqq> TRANSACTION_HANDLE q> var qqqqqqqqqqqj

52.2.1  –  Format arguments

    stream-name            The stream that you create. The stream-
                           name must be a valid operating system
                           name.

    rse                    A record selection expression. A phrase
                           that defines specific conditions that
                           individual records must meet before
                           Oracle Rdb includes them in a record stream.

    on-error               The ON ERROR clause. Specifies host
                           language statement(s) to be performed
                           if an error occurs during the START_STREAM
                           operation. For more information see the
                           entry on ON ERROR.

    handle-options         A request handle, a transaction handle, or
                           both.

    REQUEST_HANDLE var     The REQUEST_HANDLE keyword followed by a
                           host language variable. A request handle
                           identifies a compiled Oracle Rdb request.
                           If you do not supply a request handle
                           explicitly, RDML associates a unique
                           request handle for the compiled request.

    TRANSACTION_HANDLE     The TRANSACTION_HANDLE keyword followed by
    var                    a host language variable. A transaction
                           handle identifies a transaction. If
                           you do not supply a transaction handle
                           explicitly, RDML uses the default
                           transaction handle.

53  –  UNIQUE

    Tests for the presence of a single record in a record stream.
    A UNIQUE conditional expression is true if the record stream
    specified by the record selection expression consists of only one
    record.

    If you precede the UNIQUE expression with the optional NOT
    qualifier, the condition is true if there is more than one record
    in the record stream or if the stream is empty.

53.1  –  Examples

    The following programs demonstrate the use of the UNIQUE
    conditional expression. These programs join the relations
    EMPLOYEES and DEGREES over their common field, EMPLOYEE_ID. The
    UNIQUE expression limits the record stream to those records in
    the EMPLOYEES relation that have only one corresponding record
    in the DEGREES relation. These programs print an informational
    message and the selected employees first and last name in
    alphabetical order, based on the last name.

53.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR E IN EMPLOYEES
        SORTED BY E.FIRST_NAME
        WITH UNIQUE D IN DEGREES WITH D.EMPLOYEE_ID = E.EMPLOYEE_ID
           printf("%s %s has one and only one college degree.\n",
                         E.FIRST_NAME, E.LAST_NAME);
    END_FOR;

    COMMIT;
    FINISH;
    }

53.1.2  –  Pascal Example

    program unique_expr (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR E IN EMPLOYEES
       WITH UNIQUE D IN DEGREES WITH D.EMPLOYEE_ID = E.EMPLOYEE_ID
          writeln (E.FIRST_NAME, ' ', E.LAST_NAME,
                  ' has one and only one college degree.');
    END_FOR;

    COMMIT;
    FINISH;
    end.

53.2  –  Format

  (B)0unique-clause =

    qqqwqq>qqqqqqqwqqqqqqqqqq> UNIQUE qqqqqqwq>qqqqqqqqqqqqqqqqqqwqqqqk
       mqq> NOT qqj                         mq> handle-options qqj    x
                                                                      x
     lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
     mqqqqqqqqqqqqqq>  rse  qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq>

  (B)0handle-options =

  q> ( qwqqqqqq>  REQUEST_HANDLE  qqqqq>  var qqqqqqqqwq> ) q>
        tqqqqqq> TRANSACTION_HANDLE qqq>  var qqqqqqqqu
        mqqqqqq> REQUEST_HANDLE q> var q> , qqqqqqqk  x
          lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj  x
          mqqqq> TRANSACTION_HANDLE q> var qqqqqqqqqqqj

53.2.1  –  Format arguments

    rse                    A record selection expression. A phrase
                           that defines specific conditions that
                           individual records must meet before
                           Oracle Rdb includes them in a record stream.

    handle-options         A request handle, a transaction handle, or
                           both.

    REQUEST_HANDLE var     The REQUEST_HANDLE keyword followed by a
                           host language variable. A request handle
                           identifies a compiled Oracle Rdb request.
                           If you do not supply a request handle
                           explicitly, RDML associates a unique
                           request handle for the compiled request.

    TRANSACTION_HANDLE     The TRANSACTION_HANDLE keyword followed by
    var                    a host language variable. A transaction
                           handle identifies a transaction. If
                           you do not supply a transaction handle
                           explicitly, RDML uses the default
                           transaction handle.

54  –  Value expr

    A value expression is a symbol or string of symbols that you
    use to calculate a value. When you use a value expression in
    a statement, Oracle Rdb calculates the value associated with the
    expression and uses it when executing the statement.

    The RDML value expressions are:

    o  Arithmetic

    o  Database Field Value

    o  FIRST FROM

    o  Host Variable

    o  RDB$DB_KEY

    o  RDB$MISSING

    For more information and the syntax diagrams see the HELP entries
    for each of these expressions.

54.1  –  Format

  (B)0value-expr =

    qqqwqqq> host-variable qqqqqqqqqqqqwqqq>
       tqqq> db-field qqqqqqqqqqqqqqqqqu
       tqqq> quoted-string qqqqqqqqqqqqu
       tqqq> numeric-literal qqqqqqqqqqu
       tqqq> statistical-expr qqqqqqqqqu
       tqqq> arithmetic-expr qqqqqqqqqqu
       tqqq> missing-value qqqqqqqqqqqqu
       tqqq> first-expr  qqqqqqqqqqqqqqu
       tqqq> concat-expr qqqqqqqqqqqqqqu
       tqqq> dbkey  qqqqqqqqqqqqqqqqqqqu
       tqqq> ( qq> value-expr qq> ) qqqu
       tqqq> -  qq> value-expr qqqqqqqqu
       mqqq> +  qq> value-expr qqqqqqqqj

    The concat-expr consists of the concatenate operator ( | ) and
    two value expressions. The concat-expr joins the second value
    expression to the first value expression.

55  –  WITH

    Contains a conditional expression that lets you specify
    conditions that must be true for a record to be included in a
    record stream.

55.1  –  Examples

    The following programs demonstrate the use of the WITH clause in
    a record selection expression. These programs:

    o  Create a record stream of all those records in the employee
       relation with an employee ID of "00169"

    o  Print the employee ID and last name from the records in the
       record stream

55.1.1  –  C Example

    #include <stdio.h>
    DATABASE PERS = FILENAME "PERSONNEL";

    main()
    {
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR E IN EMPLOYEES
       WITH E.EMPLOYEE_ID = "00169"
          printf ("%s  ", E.EMPLOYEE_ID);
          printf ("%s", E.LAST_NAME);
    END_FOR;

    COMMIT;
    FINISH;
    }

55.1.2  –  Pascal Example

    program with_clause (input,output);
    DATABASE PERS = FILENAME 'PERSONNEL';

    begin
    READY PERS;
    START_TRANSACTION READ_ONLY;

    FOR E IN EMPLOYEES
       WITH E.EMPLOYEE_ID = '00169'
          writeln (E.EMPLOYEE_ID, ' ', E.LAST_NAME);
    END_FOR;

    COMMIT;
    FINISH;
    end.

55.2  –  Format

  (B)0with-clause =

    qqqqqq> WITH qqq> conditional-expr qqq>

55.2.1  –  Format arguments

    conditional-expr       Conditional expression. An expression
                           that evaluates to true or false. For more
                           information see the entry on Conditional
                           expressions.
Close Help