DB2 Server for VSE: System Administration

+---------------------General-Use Programming Interface----------------------+


Field Procedures

A field procedure is a General-Use programming interface. Macro ARIBFPPB is a General-Use programming interface. General-Use programming interface is defined in Programming Interface Information.

A field procedure is a user-written exit routine that transforms values in a single short-string column. When values in the column are changed, or new values are inserted, the field procedure is run to encode each value, which is then stored. When values are retrieved from the column, the field procedure is run to decode each value back to the original string value. A field procedure can be used to alter the sorting sequence of values entered in a column. For example, telephone directories sometimes require that names such as McCabe and MacCabe appear next to each other. This cannot be achieved with the standard EBCDIC sorting sequence. Languages that do not use the Roman alphabet have similar requirements. However, if a column is provided with a suitable field procedure, you can obtain the desired ordering with the ORDER BY clause.

Any indexes defined on a column that uses a field procedure are built with encoded values.

The transformation that a field procedure performs on a value is called field-encoding. The same routine is used to undo the transformation when values are retrieved; that operation is called field-decoding.

The field procedure is called when a table is created or altered, to define the data type and attributes of an encoded value to the database manager. That operation is called field-definition. The data type of the encoded value can be CHAR, VARCHAR, GRAPHIC, or VARGRAPHIC. If the datatype is VARCHAR the length must be 254 or less. If the database is VARGRAPHIC, the length must be 127 or less. For the applicable data types, see the description for the FPVDTYPE field in Table 28. The length, precision, or scale of the encoded value must be compatible with its data type. Values in columns with a field procedure are described to the database manager in the following catalog tables:

For more information about catalog tables, see the DB2 Server for VSE & VM SQL Reference manual.

Specifying the Field Procedure

To name a field procedure for a column, use the FIELDPROC clause of the CREATE TABLE or ALTER TABLE statement, followed by the name of the procedure and, optionally, a list of parameters. You can use a field procedure only with a short string column. You cannot add a field procedure to an existing column of a table. You can, however, use the ALTER TABLE statement to add to an existing table a new column that uses a field procedure. (To do so, you would have to unload the data, recreate the table, and load the data back into the table.)

The optional parameter list that follows the procedure name is a list of constants, enclosed in parentheses, called the literal list. The literal list is incorporated into a data structure called the field procedure parameter value list (FPPVL). That structure is passed to the field procedure during the field-definition operation. At that time, the procedure can modify it or return it unchanged. The output form of the FPPVL is called the modified FPPVL; it is stored in the DB2 Server for VSE catalog as part of the field description. The modified FPPVL is passed again to the field procedure when the procedure is called for field-encoding or field-decoding.

When Field Procedures are Called

A field procedure specified for a column is called in three situations:

A field procedure is never called to process a null value.

General Considerations for Writing Field Procedures

Your field procedure must adhere to the following rules:

Attention: A field procedure should always transform one input data value into one output data value, unless the parameters are different. This means that the same field procedure with the same parameters must implement a one to one data conversion, in both directions. The field-decoding function must be the exact inverse of the field-encoding function. For example, if a routine encodes ALABAMA to 01, it must decode 01 to ALABAMA. A violation of this rule can lead to unpredictable results and possible data corruption.

A Warning about Blanks

When the database manager compares the values of two strings with different lengths, it temporarily pads the shorter string with blanks (in either single-byte or double-byte characters, as appropriate) up to the length of the longer string. If the shorter string is the value of a column with a field procedure, the padding is done to the encoded value, but the pad character is not encoded. Hence, if the procedure changes blanks to some other character, encoded blanks at the end of the longer string are not equal to padded blanks at the end of the shorter string. That situation can lead to errors; for example, some strings that should be equal may not be recognized as such. You should not encode blanks with a field procedure.

Maintaining Field Procedures

Field procedures are kept in the appropriate VSE library. They can reside in the PRD2 library as a separate sublibrary. The maximum number of active field procedures on one installation is 16. If this limit is exceeded, an attempt to load a field procedure results in an SQLCODE -682 with reason code 4.

Recovering from Abends in Exits

If a field procedure ends abnormally, a message (ARI0022E) to remove the field procedure from the installation is issued to the operator, the database manager takes a SNAP dump, and processing continues.

Security with Field Procedures

Since exit routines run as extensions of the database manager and have all its privileges, they can impact its security and integrity. All field procedures must be tested and appropriate security measures taken before they are installed on a system.

Field Procedures for Cultural Sorts

By default, string data is sorted based on the S/390 collating sequence. However, the collating sequence required for certain alphabets is different from the default S/390 collating sequence. Users expect that sorted data will match the order that is culturally correct for them and that searches on data will return the result that is correct for the sorting sequence of their language. They are at ease with only one sort order, the one used in their dictionaries, telephone directories, book indices, and so on.

A way to accommodate special sorting requirements is to use Field Procedures. Field Procedures can be used to encode data being inserted into a column. The encoding effectively alters the collating sequence for the data in the column, enabling the special sorting requirements to be met by the S/390 collating sequence.

Two field procedures are provided. The procedures are supplied as A-type members.

The field procedures provided are:

The field procedures are written in Assembler. The field procedure must be assembled and the corresponding phase must be generated and placed in a library that is accessible to the database manager when it is running.

Once the phase for the field procedure has been generated and made accessible to the database manager, it can be used by specifying its name in the FIELDPROC clause of the CREATE TABLE or ALTER TABLE statement.

Field Procedure Interface to the Database Manager

This section describes certain control blocks that are used to communicate to a field procedure, under the following headings:

The Field Procedure Parameter List (FPPL)

The FPPL is pointed to by register 1 on entry to a field procedure. It, in turn, contains the addresses of five other areas, shown in Figure 115. The FPPL and the areas to which it points are all described by the mapping macro ARIBFPPB, which is provided as an E-type member.

Figure 115. Field Procedure Parameter List

arip2fpl

The Work Area

The work area is an area of storage used by a field procedure as working storage. A new area is provided each time the procedure is called.

The size of the area you need depends on the way you have programmed your field-encoding and field-decoding operations. For the field-definition operation, the database manager passes your routine a value of 512 bytes for the length of the work area (FPBWKLN in FPIB). If, for example, the longest work area you need for field-encoding or field-decoding is 1024 bytes, your field-definition operation must change the length to 1024. Thereafter, whenever your field procedure is called for either encoding or decoding, the database manager makes an area of 1024 bytes available to it.

If 512 bytes is sufficient for your operations, your field-definition operation need not change the value supplied by the database manager. If you need less than 512 bytes, your field-definition can return a smaller value. However, your field-definition itself must not use more than 512 bytes.

The Field Procedure Information Block (FPIB)

The FPIB communicates general information to a field procedure. For example, it tells what operation is to be done, allows the field procedure to signal errors, and gives the size of the work area. Its format is shown in Table 27.


Table 27. Format of FPIB, Defined in Copy Macro ARIBFPPB
  Name 'Hex' Offset     Data Type     Description
FPBFCODE 0 Signed halfword integer Function code.
Code
Means
0
Field-encoding
4
Field-decoding
8
Field-definition
FPBWKLN 2 Signed halfword integer Length of work area; the maximum is 32767 bytes.
  4 Signed halfword integer Reserved.
FPBRTNC 6 Character, 2 bytes Return code set by field procedure.
FPBRSNC 8 Character, 4 bytes Reason code set by field procedure.
FPBTOKP 12 Address Address of a 40-byte area, within the work area or within the field procedure's static area, containing an error message.

Value Descriptors

Value descriptors describe the data type and other attributes of a value. They are used with field procedures in these ways:

The CVD contains a description of a column value and, if appropriate, the value itself. During field encoding, the CVD describes the value to be encoded; during field decoding, it describes the decoded value to be supplied by the field procedure; and during field definition, it describes the column as defined in the CREATE TABLE or ALTER TABLE statement.

The FVD contains a description of a field value and, if appropriate, the value itself. During field-encoding, the FVD describes the encoded value to be supplied by the field procedure; during field-decoding, it describes the value to be decoded. Field-definition must put into the FVD a description of the encoded value.

The format of value descriptors is shown in Table 28.

Table 28. Format of Value Descriptors
Name 'Hex' Offset Data Type Description
FPVDTYPE 0 Signed halfword integer Data type of the value:
Code
Means
16
CHAR
20
VARCHAR
24
GRAPHIC
28
VARGRAPHIC
FPVDVLEN 2 Signed halfword integer For a varying-length string value, its maximum length.
FPVDVALE 4 None The value. If the value is a varying-length string, the first half word is the value's actual length in bytes. This field is not present in a CVD, or in an FVD used as input to the field-definition operation.

The Field Procedure Parameter Value List (FPPVL)

The FPPVL communicates the literal list, supplied in the CREATE TABLE or ALTER TABLE statement, to the field procedure during field definition. At that time the field procedure can reformat the FPPVL. The reformatted FPPVL is stored in SYSTEM.SYSFPARMS and communicated to the field procedure during field encoding and field decoding as the modified FPPVL.

Its format is shown in Table 29.

Table 29. Format of FPPVL, Defined in Copy Macro ARIBFPPB
Name 'Hex' Offset Data Type Description
FPPVLEN 0 Signed halfword integer Length in bytes of the area containing FPPVCNT and FPPVVDS. At least 254 for field-definition.
FPPVCNT 2 Signed halfword integer Number of value descriptors that follow, equal to the number of parameters in the FIELDPROC clause. Zero if no parameters were listed.
FPPVVDS 4 Structure For each parameter in the FIELDPROC clause, there is:
  • A signed fullword integer giving the length of the following value descriptor.
  • A value descriptor.

Field-Definition (Function Code 8)

The input provided to the field-definition operation, and the output required, are as follows:

On ENTRY

The registers have the following information:

Register
Contains

1
Address of the field procedure parameter list (FPPL). For a schematic diagram, see Figure 115.

2-12
Unknown values that must be restored on exit.

13
Address of the register save area.

14
Return address.

15
Address of entry point of exit routine.

The contents of all other registers, and of fields not listed below, are unpredictable.

The work area consists of 512 contiguous uninitialized bytes.

The FPIB has the following information:

Field
Contains

FPBFCODE
8, the function code.

FPBWKLN
512, the length of the work area.

The CVD has the following information:

Field
Contains

FPVDTYPE
One of these codes for the data type of the column value:
Code
Means
16
CHAR
20
VARCHAR
24
GRAPHIC
28
VARGRAPHIC

FPVDVLEN
The length attribute of the column.

The FPVDVALE field is omitted.

The FVD provided is 4 bytes long.

The FPPVL has the following information:

Field
Contains

FPPVLEN
The length, in bytes, of the area containing the parameter value list. The minimum value is 254, even if there are no parameters.

FPPVCNT
The number of value descriptors that follow; zero if there are no parameters.

FPPVVDS
A contiguous set of value descriptors, one for each parameter in the parameter value list, each preceded by a 4-byte length field.

On EXIT

The registers must have the following information:

Register
Contains

2-12
The values they contained on entry.

15
The integer zero if the column described in the CVD is valid for the field procedure; otherwise the value must not be zero.

Fields listed below must be set as shown; all other fields must remain as on entry.

The FPIB must have the following information:

Field
Contains

FPBWKLN
The length, in bytes, of the work area to be provided to the field-encoding and field-decoding operations; 0 if no work area is required.

FPBRTNC
An optional 2-byte character return code, defined by the field procedure; blanks if no return code is given.

FPBRSNC
An optional 4-byte character reason code, defined by the field procedure; blanks if no reason code is given.

FPBTOKP
Optionally, the address of a 40-byte error message residing in the work area or in the field procedure's static area; zeros if no message is given.

Errors signalled by a field procedure result in an SQL return code of -681, which is set in the SQL communication area (SQLCA). The contents of FPBRTNC and FPBRSNC, and the error message pointed to by FPBTOKP, are also placed into the tokens, in SQLCA, as field SQLERRMT. The meaning of the error message is determined by the field procedure.

The FVD must have the following information:

Field
Contains

FPVDTYPE
The numeric code for the data type of the field value. Any of the data types listed in Table 28 is valid.

FPVDVLEN
The length of the field value.

Field FPVDVALE must not be set; the length of the FVD is 4 bytes only.

The FPPVL can be redefined to suit the field procedure, and returned as the modified FPPVL, subject to the following restrictions:

The modified FPPVL is recorded in the SYSTEM.SYSFPARMS catalog table and is passed again to the field procedure during field-encoding and field-decoding. The modified FPPVL need not have the format of a field procedure parameter list, and it need not describe constants by value descriptors.

Field-Encoding (Function Code 0)

The input provided to the field-encoding operation, and the output required, are as follows:

On ENTRY

The registers have the following information:

Register
Contains

1
Address of the field procedure parameter list (FPPL). For a schematic diagram, see Figure 115.

2-12
Unknown values that must be restored on exit.

13
Address of the register save area.

14
Return address.

15
Address of entry point of exit routine.

The contents of all other registers, and of fields not listed below, are unpredictable.

The work area is contiguous, uninitialized, and of the length specified by the field procedure during field-definition.

The FPIB has the following information:

Field
Contains

FPBFCODE
0, the function code.

FPBWKLN
The length of the work area.

The CVD has the following information:

Field
Contains

FPVDTYPE
The numeric code for the data type of the column value, as shown in Table 28.

FPVDVLEN
The length of the column value.

FPVDVALE
The column value; if the value is a variable-length string, the first halfword contains its length.

The FVD has the following information:

Field
Contains

FPVDTYPE
The numeric code for the data type of the field value.

FPVDVLEN
The length of the field value.

FPVDVALE
An area of unpredictable content that is as long as the field value.

The modified FPPVL produced by the field procedure during field-definition is provided if it exists.

On EXIT

The registers must have the following information:

Register
Contains

2-12
The values they contained on entry.

15
The integer zero if the encoding is successful; otherwise the value must not be zero.

The FVD must contain the encoded (field) value in field FPVDVALE. If the value is a varying-length string, the first halfword must contain its length.

The FPIB may have the following information:

Field
Contains

FPBRTNC
An optional 2-byte character return code, defined by the field procedure; blanks if no return code is given.

FPBRSNC
An optional 4-byte character reason code, defined by the field procedure; blanks if no reason code is given.

FPBTOKP
Optionally, the address of a 40-byte error message residing in the work area or in the field procedure's static area; zeros if no message is given.

Errors signalled by a field procedure result in an SQL return code of -681, which is set in the SQL communication area (SQLCA). The contents of FPBRTNC and FPBRSNC, and the error message pointed to by FPBTOKPT, are also placed into the tokens, in SQLCA, as field SQLERRMT. The meaning of the error message is determined by the field procedure.

All other fields must remain as on entry.

Field-Decoding (Function Code 4)

The input provided to the field-decoding operation, and the output required, are as follows:

On ENTRY

The registers have the following information:

Register
Contains

1
Address of the field procedure parameter list (FPPL). For a schematic diagram, see Figure 115.

2-12
Unknown values that must be restored on exit.

13
Address of the register save area.

14
Return address.

15
Address of entry point of exit routine.

The contents of all other registers, and of fields not listed below, are unpredictable.

The work area is contiguous, uninitialized, and of the length specified by the field procedure during field-definition.

The FPIB has the following information:

Field
Contains
FPBFCODE
4, the function code.
FPBWKLN
The length of the work area.

The CVD has the following information:

Field
Contains

FPVDTYPE
The numeric code for the data type of the column value, as shown in Table 28.

FPVDVLEN
The length of the column value.

FPVDVALE
An area of unpredictable content that is as long as the column value.

The FVD has the following information:

Field
Contains

FPVDTYPE
The numeric code for the data type of the field value.

FPVDVLEN
The length of the field value.

FPVDVALE
The field value; if the value is a varying-length string, the first halfword contains its length.

The modified FPPVL, produced by the field procedure during field-definition, is provided if it exists.

On EXIT

The registers must have the following information:

Register
Contains

2-12
The values they contained on entry.

15
The integer zero if the decoding is successful; otherwise the value must not be zero.

The CVD must contain the decoded (column) value in field FPVDVALE. If the value is a varying-length string, the first halfword must contain its length.

The FPIB may have the following information:

Field
Contains

FPBRTNC
An optional 2-byte character return code, defined by the field procedure; blanks if no return code is given.

FPBRSNC
An optional 4-byte character reason code, defined by the field procedure; blanks if no reason code is given.

FPBTOKP
Optionally, the address of a 40-byte error message residing in the work area or in the field procedure's static area; zeros if no message is given.

Errors signalled by a field procedure result in an SQL return code of -681, which is set in the SQL communication area (SQLCA). The contents of FPBRTNC and FPBRSNC, and the error message pointed to by FPBTOKP, are also placed into the tokens, in SQLCA, as field SQLERRMT. The meaning of the error message is determined by the field procedure.

All other fields must remain as on entry.

A Sample Exit

Figure 116 shows an example of a field procedure.

Figure 116. Field Procedure Example

 
FLCTFLC  TITLE 'DB2 Server for VSE FIELD PROCEDURE EXAMPLE'
FLCTFLC  START 0
FLCTFLC  AMODE 31
FLCTFLC  RMODE ANY
************************************************************
*        DB2 Server for VSE FIELD PROCEDURE TO CONVERT                 *
*        FIXED LENGTH CHARACTER TO FIXED                   *
*        LENGTH CHARACTER USING A LOOKUP TABLE             *
************************************************************
         SPACE 3
         PRINT GEN
         USING FLCTFLC,R3              BASE REGISTER
         USING FPIB,R9                 COMMON INFORMATION BLOCK
         USING FPVD,R10                VALUE DESCRIPTOR
         USING FPPL,R11                PARAMETER LIST
         USING WA,R12                  WORK AREA
         USING FPPVL,R8                PARAMETER VALUE LIST
         USING TBLHDRD,R7              TABLE HEADER
         SPACE 3
*************************************************************
*        SET UP MAIN LINE               RETURN R14          *
*************************************************************
         SPACE 3
         SAVE  (14,12),,FLCTFLC
         LR    R3,R15                  LOAD BASE REGISTER
         LR    R11,R1                  PARAMETER LIST POINTER
         L     R12,FPPWORK             WORK AREA ADDRESS
         ST    R13,SAVE13
         L     R9,FPPFPIB              COMMON INFORMATION BLOCK
         MVC   FPBRTNC,=AL2(FPBRC0)    RETURN CODE = 0
         LH    R2,FPBFCODE
         L     R15,FDLFC(R2)           SELECT APPROPRIATE ROUTINE
         LA    R14,RET1
         BR    R15
RET1     DS    0H
         PACK  WADW,FPBRTNC            SET RETURN CODE R15
         CLI   FPBRTNC+L'FPBRTNC-1,C' '
         BNE   NOTBL
         PACK  WADW,FPBRTNC(L'FPBRTNC-1)
NOTBL    DS    0H
         CVB   R15,WADW
         L     R13,SAVE13
         RETURN (14,12),T,RC=(15)
         LTORG
FDLFC    DC    A(ENCODE,DECODE,DEFINE)
         SPACE 3
 
****************************************************************
*        ENCODING ROUTINE                     RETURN R14       *
****************************************************************
         SPACE 3
ENCODE   DS    0H
         MVC   FUNCT,=C'ENCD'
         LA    R5,B1
         B     CHKINP                  CHECK INPUT DESCRIPTION
B1       DS    0H
         LA    R5,B2
         B     CHKOUT                  CHECK OUTPUT DESCRIPTION
B2       DS    0H
         SPACE 3
******************************************************************
*        LOOKUP ROUTINE FOR ENCODING                             *
******************************************************************
         SPACE 3
         L     R10,FPPCVD              INPUT VALUE
         L     R6,TABADDR              TOP OF LOOKUP TABLE
         LA    R5,B3
         B     SETLUP                  SET UP LOOKUP VARIABLES
B3       DS    0H
         SPACE 3
*****************************************************************
*        SET UP LOOP VARIABLES                                  *
*****************************************************************
         SPACE 3
         SR    R4,R4                   CLEAR R4
         IC    R4,ILEN                 LENGTH FOR COMPARE
         SH    R4,=H'1'                -1
ITOP     DS    0H
         EX    R4,CLCINST
         BE    IHIT
         A     R6,INCRLEN              INCREMENT TO NEXT ENTRY
         BCT   R13,ITOP
         LA    R13,ER5
         B     ERROR4
IHIT     DS    0H
         L     R10,FPPFVD
         SPACE 3
 
***************************************************************
*        SET UP MOVE INSTRUCTION                              *
***************************************************************
         SPACE 3
         SR    R13,R13                 CLEAR R13
         IC    R13,OLEN                OUTPUT LENGTH
         SH    R13,=H'1'               -1
         SR    R5,R5                   CLEAR R5
         IC    R5,ILEN                 INPUT LENGTH
         AR    R6,R5                   POINT TO OUTPUT VALUE IN TABLE
         EX    R13,MVCINST
         BR    R14
         SPACE 3
*******************************************************************
*        MOVE AND COMPARE INSTRUCTION FOR EXECUTION INSTRUCTION   *
*******************************************************************
         SPACE 3
         DS    0H
CLCINST  CLC   0(1,R6),FPVDVALE
MVCINST  MVC   FPVDVALE,0(R6)
         SPACE 3
*******************************************************************
*        DECODING ROUTINE                                         *
*******************************************************************
         SPACE 3
DECODE   DS    0H
         MVC   FUNCT,=C'DECD'
         LA    R5,BB1
         B     CHKINP                  CHECK INPUT DESCRIPTION
BB1      DS    0H
         LA    R5,BB2
         B     CHKOUT                  CHECK OUTPUT DESCRIPTION
BB2      DS    0H
         SPACE 3
*******************************************************************
*        LOOKUP ROUTINE FOR DECODING                              *
*******************************************************************
         SPACE 3
         L     R10,FPPFVD              OUTPUT VALUE
         L     R6,TABADDR              TOP OF LOOKUP TABLE
         LA    R5,BB3
         B     SETLUP                  SET LOOKUP VARIABLES
BB3      DS    0H
         SPACE 3
 
*******************************************************************
*        SET UP LOOP VARIABLES                                    *
*******************************************************************
         SPACE 3
         SR    R4,R4                   CLEAR R4
         IC    R4,OLEN                 LENGTH FOR COMPARE
         SH    R4,=H'1'                -1
         SR    R5,R5                   CLEAR R5
         IC    R5,ILEN                 INPUT LENGTH
         AR    R6,R5                   POINT TO OUTPUT VALUE IN TABLE
OTOP     DS    0H
         EX    R4,CLCINST
         BE    OHIT
         A     R6,INCRLEN              POINT TO NEXT ENTRY
         BCT   R13,OTOP
         LA    R13,ER8
         B     ERROR4
OHIT     DS    0H
         L     R10,FPPCVD
         SPACE 3
******************************************************************
*        SET UP MOVE INSTRUCTION                                 *
******************************************************************
         SPACE 3
         SR    R13,R13                 CLEAR R13
         IC    R13,ILEN                INPUT LENGTH
         SR    R6,R13                  POINT TO INPUT VALUE IN TABLE
         SH    R13,=H'1'               -1
         EX    R13,MVCINST
         BR    R14
         SPACE 3
*******************************************************************
*        DEFINE ROUTINE                   RETURN R14              *
*******************************************************************
         SPACE 3
DEFINE   DS    0H
         MVC   FUNCT,=C'DEFN'
         LA    R5,BBB1
         B     CHKINP
BBB1     DS    0H
         SPACE 3
******************************************************************
*        UPDATE WORK AREA LENGTH IN FPIB                         *
******************************************************************
         MVC   FPBWKLN,=Y(WAEND-WA)
         SPACE 3
 
********************************************************************
*        SET UP FIELD VALUE DESCRIPTOR                             *
********************************************************************
         SPACE 3
         L     R10,FPPFVD              OUTPUT DESCRIPTOR
         MVC   FPVDTYPE,=Y(FPVDTCHR)   FIXED CHARACTER
         MVI   FPVDVLEN,X'00'
         AH    R10,=H'3'
         MVC   0(1,R10),OLEN
         BR    R14
         SPACE 3
********************************************************************
*        CHECK INPUT ROUTINE             RETURN R5                 *
********************************************************************
         SPACE 3
CHKINP   DS    0H
         L     R8,FPPPVL
         L     R10,FPPCVD              INPUT DESCRIPTOR
         CLC   =Y(FPVDTCHR),FPVDTYPE   FIXED CHARACTER ?
         BNE   CHKINPE1
         CLC   FPPVCNT,=H'1'           ONLY ONE PARAMETER ?
         BNE   CHKINPE2                NO, ERROR
         LA    R7,TBLHDR               POINT TO TABLE HEADER TABLE
LOOP1    DS    0H
         CLC   CODE,FPPVVDS+8          IS VALUE IN TABLE
         BNE   CPEND                   NO, INCREMENT
         B     CINCL                   YES, A HIT
CPEND    DS    0H
         AH    R7,=H'8'                EACH TABLE ENTRY 8 BYTES
         CLI   CODE,X'FF'              END OF TABLE?
         BNE   LOOP1                   NO
         LA    R13,ER3
         B     ERROR8                  YES, ERROR
CINCL    DS    0H
         CLC   ILEN,FPVDVLEN+1         CHECK INPUT LENGTH
         BER   R5
         LA    R13,ER4
         B     ERROR4
CHKINPE1 DS    0H
         LA    R13,ER1
         B     ERROR4
CHKINPE2 DS    0H
         LA    R13,ER2
 
ERROR8   DS    0H
         MVC   FPBRTNC,=AL2(FPBRC8)
         B     ERROR
ERROR4   DS    0H
         MVC   FPBRTNC,=AL2(FPBRC4)
ERROR    DS    0H
         MVC   FPBRSNC,FUNCT
         ST    R13,FPBTOKP
         BR    R14
         SPACE 3
*************************************************************
*        CHECK OUTPUT DESCRIPTOR            RETURN R5       *
*************************************************************
         SPACE 3
CHKOUT   DS    0H
         L     R10,FPPFVD              FIELD DESCRIPTOR
         CLC   =Y(FPVDTCHR),FPVDTYPE   FIXED CHARACTER ?
         BNE   CHKOUTE1
         CLC   OLEN,FPVDVLEN+1         CHECK OUTPUT LENGTH
         BER   R5
         LA    R13,ER6
         B     ERROR4
CHKOUTE1 DS    0H
         LA    R13,ER7
         B     ERROR4
         SPACE 3
*******************************************************************
*        SET UP LOOKUP VARIABLE ROUTINE        RETURN R5         *
*******************************************************************
         SPACE 3
SETLUP   DS    0H
         SR    R4,R4                   CLEAR R4
         IC    R4,ILEN                 INPUT LENGTH
         ST    R4,INCRLEN              SAVE INPUT LENGTH
         SR    R4,R4                   CLEAR R4
         IC    R4,OLEN                 OUTPUT LENGTH
         A     R4,INCRLEN              ADD INPUT LENGTH
         ST    R4,INCRLEN              STORE TABLE ENTRY LENGTH
         SR    R13,R13                 CLEAR R13
         IC    R13,NENTR               NUMBER OF ENTRIES
         BR    R5
         SPACE 3
 
********************************************************************
*        ERROR MESSAGES                                            *
********************************************************************
ER1      DC    CL40'INVALID COLUMN TYPE'
ER2      DC    CL40'INVALID NUMBER OF PARAMETERS'
ER3      DC    CL40'INVALID PARAMETER VALUE'
ER4      DC    CL40'INVALID COLUMN LENGTH'
ER5      DC    CL40'INVALID INPUT VALUE TO ENCODE'
ER6      DC    CL40'INVALID FIELD LENGTH'
ER7      DC    CL40'INVALID FIELD TYPE'
ER8      DC    CL40'INVALID FIELD VALUE TO DECODE'
         SPACE 3
**********************************************************************
*        TABLE HEADER TABLE                                          *
**********************************************************************
TBLHDR   DS    0F
**********************************************************************
*        FIRST TABLE   CODE = 'A'                                    *
**********************************************************************
         DC    C'A'                    CODE
         DC    X'01'                   INPUT LENGTH
         DC    X'01'                   OUTPUT LENGTH
         DC    X'03'                   NUMBER OF ENTRIES
         DC    A(TABA)                 ADDRESS OF LOOKUP TABLE
**********************************************************************
*        SECOND TABLE   CODE = 'B'                                   *
**********************************************************************
         DC    C'B'                    CODE
         DC    X'04'                   INPUT LENGTH
         DC    X'01'                   OUTPUT LENGTH
         DC    X'22'                   NUMBER OF ENTRIES
         DC    A(TABB)                 ADDRESS OF LOOKUP TABLE
*******************************************************************
*        PUT ADDITIONAL TABLE HEADER ENTRIES HERE                 *
*******************************************************************
         SPACE 3
*******************************************************************
*        END OF TABLE HEADERS                                     *
*******************************************************************
         DC    X'FF'
         SPACE 3
TABA     DS    0H
         DC    C'H'                    HIGH
         DC    C'7'
         DC    C'M'                    MEDIUM
         DC    C'5'
         DC    C'L'                    LOW
         DC    C'3'
         SPACE 3
 
TABB     DS    0H
         DC    C'AAA '
         DC    X'F0'                   240
         DC    C'AA+ '
         DC    X'E6'                   230
         DC    C'AA  '
         DC    X'DC'                   220
         DC    C'AA- '
         DC    X'D2'                   210
         DC    C'A+  '
         DC    X'C8'                   200
         DC    C'A1  '
         DC    X'BE'                   190
         DC    C'A   '
         DC    X'B4'                   180
         DC    C'A-  '
         DC    X'AA'                   170
         DC    C'BBB+'
         DC    X'A0'                   160
         DC    C'BBB '
         DC    X'96'                   150
         DC    C'BBB-'
         DC    X'8C'                   140
         DC    C'BB+ '
         DC    X'82'                   130
         DC    C'BB  '
         DC    X'78'                   120
         DC    C'BB- '
         DC    X'6E'                   110
         DC    C'B+  '
         DC    X'64'                   100
         DC    C'B   '
         DC    X'5A'                    90
         DC    C'B-  '
         DC    X'50'                    80
         DC    C'CCC '
         DC    X'46'                    70
         DC    C'CC  '
         DC    X'3C'                    60
         DC    C'C   '
         DC    X'32'                    50
         DC    C'D   '
         DC    X'28'                    40
         DC    C'NR  '
         DC    X'1E'
         SPACE 3
 
**********************************************************************
*        TABLE HEADER TABLE DSECT                                    *
**********************************************************************
TBLHDRD  DSECT
CODE     DS    CL1
ILEN     DS    CL1
OLEN     DS    CL1
NENTR    DS    CL1
TABADDR  DS    A
         SPACE 3
*********************************************************************
*        WORK AREA                                                  *
*********************************************************************
         SPACE 3
WA       DSECT
SAVE13   DS    F
INCRLEN  DS    F
FUNCT    DS    CL4
WADW     DS    D
WAEND    DS    0H
         SPACE 3
         ARIBFPPB
R0       EQU   0
R1       EQU   1
R2       EQU   2
R3       EQU   3
R4       EQU   4
R5       EQU   5
R6       EQU   6
R7       EQU   7
R8       EQU   8
R9       EQU   9
R10      EQU   10
R11      EQU   11
R12      EQU   12
R13      EQU   13
R14      EQU   14
R15      EQU   15
         END

+------------------End of General-Use Programming Interface------------------+


[ Top of Page | Previous Page | Next Page | Table of Contents | Index ]