PL1
PL1
PL1
Programming Guide
Version 3 Release 2.0
SC27-1457-02
Enterprise PL/I for z/OS and OS/390 IBM
Programming Guide
Version 3 Release 2.0
SC27-1457-02
Note!
Before using this information and the product it supports, be sure to read the general information under “Notices” on page 361.
This edition applies to Version 3 Release 2 of Enterprise PL/I for z/OS and OS/390, 5655-H31, and to any subsequent releases until
otherwise indicated in new editions or technical newsletters. Make sure you are using the correct edition for the level of the product.
Order publications through your IBM representative or the IBM branch office serving your locality. Publications are not stocked at the
address below.
A form for readers' comments is provided at the back of this publication. If the form has been removed, address your comments to:
IBM Corporation, Department HHX/H1
555 Bailey Ave
San Jose, CA, 95141-1099
United States of America
When you send information to IBM, you grant IBM a nonexclusive right to use or distribute the information in any way it believes
appropriate without incurring any obligation to you.
Contents v
Using the binder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Using the prelinker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Run-time considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Formatting conventions for PRINT files . . . . . . . . . . . . . . . . . . . . . . 110
Changing the format on PRINT files . . . . . . . . . . . . . . . . . . . . . . . . 110
Automatic prompting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Punctuating long input lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Punctuating GET LIST and GET DATA statements . . . . . . . . . . . . . . . 112
ENDFILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
SYSPRINT considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Using FETCH in your routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
FETCHing Enterprise PL/I routines . . . . . . . . . . . . . . . . . . . . . . . . 114
FETCHing OS/390 C routines . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
FETCHing assembler routines . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Invoking MAIN under USS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Contents vii
Stream and record files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Capital and lowercase characters . . . . . . . . . . . . . . . . . . . . . . . . . 177
Output from the PUT EDIT command . . . . . . . . . . . . . . . . . . . . . . . 177
Using record-oriented data transmission . . . . . . . . . . . . . . . . . . . . . . . 177
Specifying record format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Defining files using record I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Specifying ENVIRONMENT options . . . . . . . . . . . . . . . . . . . . . . . . 179
Creating a data set with record I/O . . . . . . . . . . . . . . . . . . . . . . . . 181
Accessing and updating a data set with record I/O . . . . . . . . . . . . . . . 181
Contents ix
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Notices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Trademarks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
Contents xi
Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Enterprise PL/I publications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
PL/I for MVS & VM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
z/OS Language Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
CICS Transaction Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
DB2 UDB for OS/390 and z/OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
DFSORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
IMS/ESA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
z/OS MVS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
z/OS UNIX System Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
z/OS TSO/E . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
z/Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Unicode and character representation . . . . . . . . . . . . . . . . . . . . . . . 364
Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
The following tables show you how to use the publications you receive with
Enterprise PL/I and Language Environment. You'll want to know information about
both your compiler and run-time environment. For the complete titles and order
numbers of these and other related publications, see “Bibliography” on page 363.
──REQUIRED_ITEM────────────────────────────────────────────────────
Optional Items
Optional items appear below the main path.
──REQUIRED_ITEM──┬───────────────┬─────────────────────────────────
└─optional_item─┘
If an optional item appears above the main path, that item has no effect on the
execution of the statement and is used only for readability.
┌─optional_item─┐
──REQUIRED_ITEM──┴───────────────┴─────────────────────────────────
──REQUIRED_ITEM──┬─required_choice1─┬──────────────────────────────
└─required_choice2─┘
If choosing one of the items is optional, the entire stack appears below the
main path.
──REQUIRED_ITEM──┬──────────────────┬──────────────────────────────
├─optional_choice1─┤
└─optional_choice2─┘
Repeatable items
An arrow returning to the left above the main line indicates that an item can be
repeated.
┌──
─────────────────┐
─repeatable_item─┴───────────────────────────────
──REQUIRED_ITEM───
If the repeat arrow contains a comma, you must separate repeated items with
a comma.
┌─,───────────────┐
─repeatable_item─┴───────────────────────────────
──REQUIRED_ITEM───
A repeat arrow above a stack indicates that you can specify more than one of
the choices in the stack.
Default keywords
IBM-supplied default keywords appear above the main path, and the remaining
choices are shown below the main path. In the parameter list following the
syntax diagram, the default choices are underlined.
──REQUIRED_ITEM──┼─────────────────┼───────────────────────────────
├─optional_choice─┤
└─optional_choice─┘
Fragments
Sometimes a diagram must be split into fragments. The fragments are
represented by a letter or fragment name, set off like this: | A |. The fragment
follows the end of the main diagram. The following example shows the use of
a fragment.
Substitution-block
Sometimes a set of several parameters is represented by a substitution-block
such as <A>. For example, in the imaginary /VERB command you could enter
/VERB LINE 1, /VERB EITHER LINE 1, or /VERB OR LINE 1.
──/VERB──┬─────┬──LINE──line#──────────────────────────────────────────────
└─<A>─┘
──┬─EITHER─┬───────────────────────────────────────────────────────────────
└─OR─────┘
Parameter endings
Parameters with number values end with the symbol '#', parameters that are
names end with 'name', and parameters that can be generic end with '*'.
──/MSVERIFY──┬─MSNAME──msname─┬────────────────────────────────────────────
└─SYSID──sysid#──┘
The MSNAME keyword in the example supports a name value and the SYSID
keyword supports a number value.
Example of notation
The following example of PL/I syntax illustrates the notational symbols described In
“How to read the notational symbols” on page xviii:
DCL file-reference FILE STREAM
{INPUT | OUTPUT [PRINT]}
ENVIRONMENT(option ...);
Improved performance
The compiler now handles even more conversions by generating inline code
which means these conversions will be done much faster than previously. Also,
all conversions done by library call are now flagged by the compiler.
The compiler-generated code now uses, in various situations, less stack
storage.
The compiler now generates much better code for references to the
TRANSLATE built-in function.
The compiler-generated code for SUBSCRIPTRANGE checking is now, for
arrays with known bounds, twice as fast as before.
The ARCH and TUNE options now support 4 as a suboption, thereby allowing
exploitation of instructions new to the zSeries machines.
ARCH(2), FLOAT(AFP) and TUNE(3) are now the default.
Easier migration
Compiler defaults have been changed for easier migration and compatibility.
The changed defaults are:
– CSECT
– CMPAT(V2)
– LIMITS(EXTNAME(7))
– NORENT
Improved usability
The defaults for compiler options may now be changed at installation.
The integrated SQL preprocessor now supports DB2 Unicode.
The compiler now generates information that allows Debug Tool to support
Auto Monitor, whereby immediately before each statement is executed, all the
values of all the variables used in the statement are displayed.
The new NOWRITABLE compiler option lets you specify that even under
NORENT and at the expense of optimal performance, the compiler should use
no writable static when generating code to handle FILEs and CONTROLLED.
The new USAGE compiler option gives you full control over the IBM or ANS
behavior of the ROUND and UNSPEC built-in function without the other effects
of the RULES(IBM|ANS) option.
The new STDSYS compiler option lets you specify that the compiler should
cause the SYSPRINT file to be equated to the C stdout file.
The new COMPACT compiler option lets you direct the compiler to favour those
optimizations which tend to limit the growth of the code.
The LRECL for SYSPRINT has been changed to 137 to match that of the
C/C++ compiler.
POINTERs are now allowed in PUT LIST and PUT EDIT statements: the 8-byte
hex value will be output.
If specified on a STATIC variable, the ABNORMAL attribute will cause that
variable to be retained even if unused.
This release also provides all of the functional enhancements offered in VisualAge
PL/I V2R2, including the following:
Initial UTF-16 support via the WIDECHAR attribute
There is currently no support yet for
– WIDECHAR characters in source files
– W string constants
– use of WIDECHAR expressions in stream I/O
– implicit conversion to/from WIDECHAR in record I/O
– implicit endianness flags in record I/O
If you create a WIDECHAR file, you should write the endianness flag
('fe_ff'wx) as the first two bytes of the file.
DESCRIPTORS and VALUE options supported in DEFAULT statements
PUT DATA enhancements
– POINTER, OFFSET and other non-computational variables supported
– Type-3 DO specifications allowed
– Subscripts allowed
DEFINE statement enhancements
– Unspecified structure definitions
– CAST and RESPEC type functions
Additional built-in functions:
– ACOSF
– ASINF
– ATANF
– CHARVAL
– COSF
– EXPF
– ISIGNED
– IUNSIGNED
– LOG10F
Table 3 lists all the compiler options with their abbreviations (if any) and their
IBM-supplied default values. If an option has any suboptions which may be
abbreviated, those abbreviations are described in the full description of the option.
For the sake of brevity, some of the options are described loosely in the table (for
example, only one suboption of LANGLVL is mandatory, and similarly, if you
specify one suboption of TEST, you do not have to specify the other). The full and
completely accurate syntax is described in the pages that follow.
The paragraphs following Table 3 describe the options in alphabetical order. For
those options specifying that the compiler is to list information, only a brief
description is included; the generated listing is described under “Using the compiler
listing” on page 55.
AGGREGATE
The AGGREGATE option creates an Aggregate Length Table that gives the lengths
of arrays and major structures in the source program in the compiler listing.
┌─NOAGGREGATE─┐
──┴─AGGREGATE───┴──────────────────────────────────────────────────────────────
The Aggregate Length Table includes structures but not arrays that have
non-constant extents, but the sizes and offsets of elements within structures with
non-constant extents may be inaccurate or specified as *.
ARCH
The ARCH option specifies the architecture for which the executable program's
instructions are to be generated. It allows the optimizer to take advantage of
specific hardware instruction sets. A subparameter specifies the group to which a
model number belongs.
┌─2─┐
──ARCH──(──┴─n─┴──)────────────────────────────────────────────────────────────
ATTRIBUTES
The ATTRIBUTES option specifies that the compiler includes a table of
source-program identifiers and their attributes in the compiler listing.
┌─NOATTRIBUTES─┐
──┴─ATTRIBUTES───┴──┬─────────────────┬────────────────────────────────────────
│ ┌─FULL──┐ │
└─(──┴─SHORT─┴──)─┘
ABBREVIATIONS: A, NA, F, S
FULL
All identifiers and attributes are included in the compiler listing. FULL is the
default.
SHORT
Unreferenced identifiers are omitted, making the listing more manageable.
If you include both ATTRIBUTES and XREF (creates a cross-reference table), the
BLANK
The BLANK option specifies up to ten alternate symbols for the blank character.
┌──
──────┐
──BLANK──(──'───char─┴─'──)────────────────────────────────────────────────────
The IBM-supplied default code point for the BLANK symbol is X'05'.
char
A single SBCS character.
You cannot specify any of the alphabetic characters, digits, and special characters
defined in the PL/I Language Reference.
If you specify the BLANK option, the standard blank symbol is still recognized as a
blank.
CHECK
The CHECK option alters the behavior of the ALLOCATE and FREE statements.
┌─NOSTORAGE─┐
──CHECK──(──┴─STORAGE───┴──)───────────────────────────────────────────────────
When you specify CHECK(STORAGE), the compiler calls slightly different library
routines for ALLOCATE and FREE statements (except when these statements
occur within an AREA). The following built-in functions, described in the PL/I
Language Reference, can be used only when CHECK(STORAGE) has been
specified:
ALLOCSIZE
CHECKSTG
UNALLOCATED
CMPAT
The CMPAT option specifies whether object compatibility with OS PL/I Version 1,
OS PL/I Version 2, PL/I for MVS and VM, VisualAge PL/I for OS/390 or Enterprise
PL/I for z/OS is to be maintained for programs sharing strings, AREAs, arrays
and/or structures.
┌─V2─┐
──CMPAT──(──┼─LE─┼──)──────────────────────────────────────────────────────────
└─V1─┘
V1 Under CMPAT(V1), you can share strings, AREAs, arrays and/or structures
with programs compiled with the OS PL/I Version 1 compiler and with programs
compiled with later PL/I compilers as long as the the CMPAT(V1) option was
used.
V2 Under CMPAT(V2), you can share strings, AREAs, arrays and/or structures
with programs compiled with the OS PL/I Version 2 compiler (and later
compilers) as long as the the CMPAT(V2) option was used.
All the modules in an application must be compiled with the same CMPAT option.
CODEPAGE
The CODEPAGE option specifies the code page used for:
conversions between CHARACTER and WIDECHAR
the default code page used by the PLISAX built-in subroutines
──CODEPAGE──(──ccsid──)────────────────────────────────────────────────────────
The default CCSID 1140 is an equivalent of CCSID 37 (EBCDIC Latin-1, USA) but
includes the Euro symbol.
COMPACT
During optimizations performed during code generation, choices must be made
between those optimizations which tend to result in faster but larger code and those
which tend to result in smaller but slower code. The COMPACT option influences
these choices. When the COMPACT option is used, the compiler favours those
optimizations which tend to limit the growth of the code. Because of the interaction
between various optimizations, including inlining, code compiled with the
COMPACT option may not always generate smaller code and data.
┌─NOCOMPACT─┐
──┴─COMPACT───┴────────────────────────────────────────────────────────────────
If the objects and modules are smaller with an acceptable change in execution
time, then you can consider using COMPACT.
As new optimizations are added to the compiler, the behavior of the COMPACT
option may change. You should re-evaluate the use of this option for each new
release of the compiler and when the user changes the application code.
COMPILE
The COMPILE option causes the compiler to stop compiling after all semantic
checking of the source program if it produces a message of a specified severity
during preprocessing or semantic checking. Whether the compiler continues or not
depends on the severity of the error detected, as specified by the NOCOMPILE
option in the list below. The NOCOMPILE option specifies that processing stops
unconditionally after semantic checking.
┌─NOCOMPILE──┬─────────────┬─┐
│ │ ┌─S─┐ │ │
│ └─(──┼─W─┼──)─┘ │
│ └─E─┘ │
──┴─COMPILE────────────────────┴───────────────────────────────────────────────
ABBREVIATIONS: C, NC
NOCOMPILE
Compilation stops after semantic checking.
NOCOMPILE(W)
No code generation if a warning, error, severe error, or unrecoverable error is
detected.
NOCOMPILE(E)
No code generation if an error, severe error, or unrecoverable error is detected.
NOCOMPILE(S)
No code generation if a severe error or unrecoverable error is detected.
CSECT
The CSECT option ensures that the object module, if generated, contains named
CSECTs. Use this option if you will be using SMP/E to service your product or to
aid in debugging your program.
┌─CSECT───┐
──┴─NOCSECT─┴──────────────────────────────────────────────────────────────────
Under the NOCSECT option, the code and static sections of your object module
are given default names.
Under the CSECT option, the code and static sections of your object module are
given names that depend on the "package name" which is defined as follows:
if the package statement was used, the "package name" is the leftmost label on
the package statement
otherwise, the "package name" is the leftmost label on the first procedure
statement.
The code csect name is built by taking the modified package name and appending
a '1' to it.
So, for a package named "SAMPLE", the code csect name would be "*SAMPLE1",
and the static csect name would be "*SAMPLE2", and
CURRENCY
The CURRENCY option allows you to specify an alternate character to be used in
picture strings instead of the dollar sign.
┌─$─┐
──CURRENCY──(──'──┴─x─┴──'──)──────────────────────────────────────────────────
ABBREVIATIONS: CURR
x Character that you want the compiler and runtime to recognize and accept as
the dollar sign in picture strings.
DBCS
The DBCS option ensures that the listing, if generated, is sensitive to the possible
presence of DBCS even though the GRAPHIC option has not been specified.
┌─NODBCS─┐
──┴─DBCS───┴───────────────────────────────────────────────────────────────────
The NODBCS option will cause the listing, if generated, to show all DBCS
shift-codes as ".".
The NODBCS option should not be specified if the GRAPHIC option is also
specified.
DD
The DD option allows you to specify alternate DD names for the compiler listing,
the primary source file, the default include dataset and the mdeck dataset.
──DD──┬─────────────────────────────────────────────────────────────────────────────┬─────
└─(──SYSPRINT──┬─────────────────────────────────────────────────────────┬──)─┘
└─,──SYSIN──┬───────────────────────────────────────────┬─┘
└─,──SYSLIB──┬────────────────────────────┬─┘
└─,──SYSPUNCH──┬───────────┬─┘
└─,──SYSLIN─┘
You can also use * to indicate that the default DD name should be used. Thus
DD(*,ALTIN) is equivalent to DD(SYSPRINT,ALTIN).
DEFAULT
The DEFAULT option specifies defaults for attributes and options. These defaults
are applied only when the attributes or options are not specified or implied in the
source.
──DEFAULT──(──┬────────────────────────────────────────────────┬──)───────────────────────
│ ┌─┬───┬──────────────────────────────────────┐ │
│ │ └─,─┘ │ │
│ │ ┌─IBM─┐ │ │
└───┬─┴─ANS─┴────────────────────────────────┬─┴─┘
│ ┌─EBCDIC─┐ │
├─┴─ASCII──┴─────────────────────────────┤
│ ┌─ASSIGNABLE────┐ │
├─┴─NONASSIGNABLE─┴──────────────────────┤
│ ┌─BYADDR──┐ │
├─┴─BYVALUE─┴────────────────────────────┤
│ ┌─NONCONNECTED─┐ │
├─┴─CONNECTED────┴───────────────────────┤
│ ┌─DESCRIPTOR───┐ │
├─┴─NODESCRIPTOR─┴───────────────────────┤
│ ┌─NATIVE────┐ │
├─┴─NONNATIVE─┴──────────────────────────┤
│ ┌─NATIVEADDR────┐ │
├─┴─NONNATIVEADDR─┴──────────────────────┤
│ ┌─NOINLINE─┐ │
├─┴─INLINE───┴───────────────────────────┤
│ ┌─ORDER───┐ │
├─┴─REORDER─┴────────────────────────────┤
│ ┌─OPTLINK─┐ │
├─LINKAGE──(──┴─SYSTEM──┴──)─────────────┤
│ ┌─EVENDEC───┐ │
├─┴─NOEVENDEC─┴──────────────────────────┤
│ ┌─NULL37K─┐ │
├─┴─NULLSYS─┴────────────────────────────┤
│ ┌─NONRECURSIVE─┐ │
├─┴─RECURSIVE────┴───────────────────────┤
│ ┌─DESCLOCATOR─┐ │
├─┴─DESCLIST────┴────────────────────────┤
│ ┌─BYADDR──┐ │
├─RETURNS──(──┴─BYVALUE─┴──)─────────────┤
│ ┌─NOINITFILL─────────────────────────┐ │
├─┴─INITFILL──┬──────────────────────┬─┴─┤
│ └─(────init_value────)─┘ │
│ ┌─HEXADEC─┐ │
├─SHORT──(──┴─IEEE────┴──)───────────────┤
│ ┌─ALIGNED───┐ │
├─DUMMY──(──┴─UNALIGNED─┴──)─────────────┤
│ ┌─LOWERINC─┐ │
├─┴─UPPERINC─┴───────────────────────────┤
│ ┌─NORETCODE─┐ │
├─┴─RETCODE───┴──────────────────────────┤
│ ┌─ALIGNED───┐ │
├─┴─UNALIGNED─┴──────────────────────────┤
│ ┌─MIN─┐ │
├─ORDINAL──(──┴─MAX─┴──)─────────────────┤
│ ┌─NOOVERLAP─┐ │
├─┴─OVERLAP───┴──────────────────────────┤
│ ┌─HEXADEC─┐ │
├─┴─IEEE────┴────────────────────────────┤
│ ┌─HEXADEC─┐ │
└─E──(──┴─IEEE────┴──)───────────────────┘
Under the IBM suboption, variables with names beginning from I to N default to
FIXED BINARY and any other variables default to FLOAT DECIMAL. If you
select the ANS suboption, the default for all variables is FIXED BINARY.
IBM is the default.
ASCII | EBCDIC
Use this option to set the default for the character set used for the internal
representation of character problem program data.
Specify ASCII only when compiling programs that depend on the ASCII
character set collating sequence. Such a dependency exists, for example, if
your program relies on the sorting sequence of digits or on lowercase and
uppercase alphabetics. This dependency also exists in programs that create
an uppercase alphabetic character by changing the state of the high-order bit.
Note: The compiler supports A and E as suffixes on character strings. The A
suffix indicates that the string is meant to represent ASCII data, even if the
EBCDIC compiler option is in effect. Alternately, the E suffix indicates that the
string is EBCDIC, even when you select DEFAULT(ASCII).
'123'A is the same as '313233'X
'123'E is the same as 'F1F2F3'X
EBCDIC is the default.
ASSIGNABLE | NONASSIGNABLE
This option causes the compiler to apply the specified attribute to all static
variables that are not declared with the ASSIGNABLE or NONASSIGNABLE
attribute. The compiler flags statements in which NONASSIGNABLE variables
are the targets of assignments.
ASSIGNABLE is the default.
BYADDR | BYVALUE
Set the default for whether arguments or parameters are passed by address or
by value. BYVALUE applies only to certain arguments and parameters. See
the PL/I Language Reference for more information.
BYADDR is the default.
CONNECTED | NONCONNECTED
Set the default for whether parameters are connected or nonconnected.
CONNECTED allows the parameter to be used as a target or source in
record-oriented I/O or as a base in string overlay defining.
NONCONNECTED is the default.
NATIVE | NONNATIVE
This option affects only the internal representation of fixed binary, ordinal,
offset, area, and varying string data. When the NONNATIVE suboption is in
effect, the NONNATIVE attribute is applied to all such variables not declared
with the NATIVE attribute.
You should specify NONNATIVE only to compile programs that depend on the
nonnative format for holding these kind of variables.
If your program bases fixed binary variables on pointer or offset variables (or
conversely, pointer or offset variables on fixed binary variables), specify either:
NATIVEADDR | NONNATIVEADDR
This option affects only the internal representation of pointers. When the
NONNATIVEADDR suboption is in effect, the NONNATIVE attribute is applied
to all pointer variables not declared with the NATIVE attribute.
If your program bases fixed binary variables on pointer or offset variables (or
conversely, pointer or offset variables on fixed binary variables), specify either:
INLINE | NOINLINE
This option sets the default for the inline procedure option.
Specifying INLINE allows your code to run faster but, in some cases, also
creates a larger executable file. For more information on how inlining can
ORDER | REORDER
Affects optimization of the source code. Specifying REORDER allows further
optimization of your source code, see Chapter 11, “Improving performance” on
page 230.
ORDER is the default.
LINKAGE
The linkage convention for procedure invocations is:
OPTLINK
The default linkage convention for Enterprise PL/I. This linkage provides
the best performance.
SYSTEM
The standard linking convention for system APIs.
EVENDEC | NOEVENDEC
This suboption controls the compiler's tolerance of fixed decimal variables
declared with an even precision.
Under NOEVENDEC, the precision for any fixed decimal variable is rounded up
to the next highest odd number.
If you specify EVENDEC and then assign 123 to a FIXED DEC(2) variable, the
SIZE condition is raised. If you specify NOEVENDEC, the SIZE condition is not
raised.
EVENDEC is the default.
NULLSYS | NULL370
This suboption determines which value is returned by the NULL built-in
function. If you specify NULLSYS, binvalue(null()) is equal to 0. If you want
binvalue(null()) to equal 'ff_00_00_00'xn as is true with previous releases of
PL/I, specify NULL370.
NULL370 is the default.
RECURSIVE | NONRECURSIVE
When you specify DEFAULT(RECURSIVE), the compiler applies the
RECURSIVE attribute to all procedures. If you specify
DEFAULT(NONRECURSIVE), all procedures are nonrecursive except
procedures with the RECURSIVE attribute.
NONRECURSIVE is the default.
INITFILL | NOINITFILL
This suboption controls the default initialization of automatic variables.
If you specify INITFILL with a hex value (nn), that value is used to initialize the
storage used by all automatic variables in a block each time that block is
entered. If you do not enter a hex value, the default is '00'.
Note that the hex value may be specified without or without quotes, but if it is
specified with quotes, the string should not have an X suffix.
Under NOINITFILL, the storage used by an automatic variable may hold
arbitrary bit patterns unless the variable is explicitly initialized.
INITIFILL can cause programs to run significantly slower and should not be
specified in production programs. However, the INITFILL option produces code
that runs faster than the LE STORAGE option. Also, during program
development, this option is very useful for detecting uninitialized automatic
variables: a program that runs correctly with DFT(INITFILL('00')) and with with
DFT(INITFILL('ff')) probably has no uninitialized automatic variables.
NOINITIFILL is the default.
call x( b3 );
If you specified DEFAULT(DUMMY(ALIGNED)), a dummy argument would be
created, while if you specified DEFAULT(DUMMY(UNALIGNED)), no dummy
argument would be created.
DUMMY(ALIGNED) is the default.
LOWERINC | UPPERINC
If you specify LOWERINC, the compiler requires that the actual file names of
INCLUDE files are in lowercase. If you specify UPPERINC, the compiler
requires that the names are in uppercase.
Note: This suboption applies only to compilations under OS/390 UNIX.
Under OS/390 UNIX, the include name is built using the EXT suboption of the
INCLUDE option. So, for example, under the DFT(LOWERINC) and
INCLUDE(EXT('inc')) option, the statement %INCLUDE STANDARD; will cause
the compiler to try to include standard.inc.
LOWERINC is the default.
RETCODE | NORETCODE
If you specify RETCODE, for any external procedure that does not have the
RETURNS attribute, the compiler will generate extra code so that the
procedure returns the integer value obtained by invoking the PLIRETV built-in
function just prior to returning from that procedure.
If you specify NORETCODE, no special code is generated for procedures that
do not have the RETURNS attribute.
NORETCODE is the default.
ALIGNED | UNALIGNED
This suboption allows you to force byte-alignment on all of your variables.
If you specify ALIGNED, all variables other than character, bit, graphic, and
picture are given the ALIGNED attribute unless the UNALIGNED attribute is
explicitly specified (possibly on a parent structure) or implied by a DEFAULT
statement.
If you specify UNALIGNED, all variables are given the UNALIGNED attribute
unless the ALIGNED attribute is explicitly specified (possibly on a parent
structure) or implied by a DEFAULT statement.
ORDINAL(MIN | MAX)
If you specify ORDINAL(MAX), all ordinals whose definition does not include a
PRECISION attribute is given the attribute PREC(31). Otherwise, they are
given the smallest precision that covers their range of values.
ORDINAL(MIN) is the default.
OVERLAP | NOOVERLAP
If you specify OVERLAP, the compiler presumes the source and target in an
assignment can overlap and generates, as needed, extra code in order to
ensure that the result of the assignment is okay.
NOOVERLAP will produce code that performs better; however, if you use
NOOVERLAP, you must insure that the source and target never overlap.
NOOVERLAP is the default.
HEXADEC | IEEE
This suboption allows you to specify the default representation used to hold all
FLOAT variables and all floating-point intermediate results.
Programs that communicate with JAVA should probably use the IEEE option,
and programs that pass data to or receive data from platforms where IEEE is
the default representation for floating-point data might also want to use the
IEEE option.
If use DFT(IEEE) and extended-precision floating point, you must link and run
with z/OS 1.2 or later.
HEXADEC is the default.
E (HEXADEC | IEEE)
The E suboption determines how many digits will be used for the exponent in
E-format items.
If you specify E(IEEE), 4 digits will be used for the exponent in E-format items.
If you specify E(HEXADEC), 2 digits will be used for the exponent in E-format
items.
If DFT( E(HEXADEC) ) is specified, an attempt to use an expression whose
exponent has an absolute value greater than 99 will cause the SIZE condition
to be raised.
If the compiler option DFT(IEEE) is in effect, you should normally also use the
option DFT( E(IEEE) ). However, under this option, some E format items that
would be valid under DFT( E(HEXADEC) ) would not be valid. For instance,
under DFT( E(IEEE) ), the statement "put skip edit(x) ( e(15,8));" would be
flagged because the E format item is invalid.
E(HEXADEC) is the default.
┌─WTO─┐
──DISPLAY──(──┴─STD─┴──)───────────────────────────────────────────────────────
STD
All DISPLAY statements are completed by writing the text to stdout and
reading any REPLY text from stdin.
WTO
All DISPLAY statements are completed via WTOs. This is the default.
DLLINIT
The DLLINIT option applies OPTIONS(FETCHABLE) to all external procedures that
are not MAIN. It should be used only on compilation units containing one external
procedure, and then that procedure should be linked as a DLL.
┌─NODLLINIT─┐
──┴─DLLINIT───┴────────────────────────────────────────────────────────────────
EXIT
The EXIT option enables the compiler user exit to be invoked.
┌─NOEXIT────────────────────────────┐
──┴─EXIT──┬─────────────────────────┬─┴────────────────────────────────────────
└─(────inparm_string────)─┘
inparm_string
A string that is passed to the compiler user exit routine during initialization.
The string can be up to 31 characters long.
EXTRN
The EXTRN option controls when EXTRNs are emitted for external entry constants.
┌─SHORT─┐
──EXTRN──(──┴─FULL──┴──)───────────────────────────────────────────────────────
FULL
EXTRNs are emitted for all declared external entry constants.
SHORT
EXTRNs are emitted only for those constants that are referenced. This is the
default.
──FLAG──┬─────────────┬────────────────────────────────────────────────────────
│ ┌─W─┐ │
└─(──┼─I─┼──)─┘
├─E─┤
└─S─┘
ABBREVIATION: F
If messages are below the specified severity or are filtered out by a compiler exit
routine, they are not listed.
FLOAT
The FLOAT option controls the use of additional floating-point registers.
┌─AFP───┐
──FLOAT──(──┴─NOAFP─┴──)───────────────────────────────────────────────────────
FLOAT(NOAFP)
Compiler-generated code uses the traditional 4 floating-point registers.
FLOAT(AFP)
Compiler-generated code uses 16 floating-point registers.
GONUMBER
The GONUMBER option specifies that the compiler produces additional information
that allows line numbers from the source program to be included in run-time
messages.
┌─NOGONUMBER─┐
──┴─GONUMBER───┴───────────────────────────────────────────────────────────────
Alternatively, the line numbers can be derived by using the offset address, which is
always included in run-time messages, and either the table produced by the
OFFSET option or the assembler listing produced by the LIST option.
GONUMBER is forced by the ALL and STMT suboptions of the TEST option.
Note that there is no GOSTMT option. The only option that will produce
information at run-time identifying where an error has occurred is the GONUMBER
GRAPHIC
The GRAPHIC option specifies that the source program can contain double-byte
characters. The hexadecimal codes '0E' and '0F' are treated as the shift-out and
shift-in control codes, respectively, wherever they appear in the source program,
including occurrences in comments and string constants.
┌─NOGRAPHIC─┐
──┴─GRAPHIC───┴────────────────────────────────────────────────────────────────
The GRAPHIC option must be specified if the source program uses any of the
following:
DBCS identifiers
Graphic string constants
Mixed-string constants
Shift codes anywhere else in the source
INCAFTER
The INCAFTER option specifies a file to be included after a particular statement in
your source program.
──INCAFTER──(──┬─────────────────────────┬──)──────────────────────────────────
└─PROCESS──(──filename──)─┘
filename
Name of the file to be included after the last PROCESS statement.
Currently, PROCESS is the only suboption and specifies the name of a file to be
included after the last PROCESS statement.
INCDIR
The INCDIR compiler option specifies a directory to be added to the search path
used to locate of include files.
Note: This option applies only to compilations under OS/390 UNIX.
──INCDIR──(──'directory name'──)───────────────────────────────────────────────
INCLUDE
The INCLUDE option specifies the file name extensions under which include files
are searched.
Note: This option applies only to compilations under OS/390 UNIX.
──INCLUDE──┬──────────────────────────────────────┬────────────────────────────
└─(──EXT──(──'include extension'──)──)─┘
ABBREVIATION: INC
If you specify more than one file name extension, the compiler searches for include
files with the left most extension you specify first. It then searches for extensions
that you specified from left to right. You can specify a maximum of 7 extensions.
INSOURCE
The INSOURCE option specifies that the compiler should include a listing of the
source program before the PL/I macro preprocessor translates it.
┌─NOINSOURCE────────────────────┐
──┴─INSOURCE──┬─────────────────┬─┴────────────────────────────────────────────
│ ┌─FULL──┐ │
└─(──┴─SHORT─┴──)─┘
FULL
The INSOURCE listing will ignore %NOPRINT statements and will contain all
the source before the preprocessor translates it.
FULL is the default.
The INSOURCE listing has no effect unless the MACRO option is in effect.
Under the INSOURCE option, text is included in the listing not according to the
logic of the program, but as each file is read. So, for example, consider the
following simple program which has a %INCLUDE statement between its PROC
and END statements.
The INSOURCE listing will contain all of the main program before any of the
included text from the file "member" (and it would contain all of that file before any
text included by it - and so on).
INTERRUPT
The INTERRUPT option causes the compiled program to respond to attention
requests (interrupts).
┌─NOINTERRUPT─┐
──┴─INTERRUPT───┴──────────────────────────────────────────────────────────────
This option determines the effect of attention interrupts when the compiled PL/I
program runs under an interactive system. This option will have an effect only on
programs running under TSO. If you have written a program that relies on raising
the ATTENTION condition, you must compile it with the INTERRUPT option. This
option allows attention interrupts to become an integral part of programming. This
gives you considerable interactive control of the program.
If you specify NOINTERRUPT, an attention interrupt during a program run does not
give control to any ATTENTION ON-units.
If you require the attention interrupt capability only for testing purposes, use the
TEST option instead of the INTERRUPT option. For more information see “TEST”
on page 46.
LANGLVL
The LANGLVL option specifies the level of PL/I language definition that you want
the compiler to accept.
┌─┬───┬─────────┐
│ └─,─┘ │
│ ┌─SAA2─┐ │
──LANGLVL──(────┬─┴─SAA──┴──┬─┴──)─────────────────────────────────────────────
│ ┌─OS────┐ │
└─┴─NOEXT─┴─┘
SAA
The compiler flags keywords and other language constructs that are not
supported by OS PL/I Version 2 Release 3, and the compiler does not
recognize any built-in functions not supported by OS PL/I Version 2 Release 3.
SAA2
The compiler accepts the PL/I language definition contained in the PL/I
Language Reference.
NOEXT
The only ENVIRONMENT options accepted are:
OS
All ENVIRONMENT options are allowed. For a complete list of the
ENVIRONMENT options, see Table 13 on page 147.
LIMITS
The LIMITS option specifies various implementation limits.
┌─┬───┬─────────────────────────────────────┐
│ └─,─┘ │
│ ┌─7─┐ │
──LIMITS──(────┬─EXTNAME──(──┴─n─┴──)──────────────────┬─┴──)──────────────────
│ ┌─15─┐ │
├─FIXEDDEC──(──┴─31─┴──)────────────────┤
│ ┌─31─┐ │
├─FIXEDBIN──(──┴─63─┴──┬───────────┬──)─┤
│ └─,──┬─31─┬─┘ │
│ └─63─┘ │
│ ┌─1##─┐ │
└─NAME──(──┴─n───┴──)───────────────────┘
EXTNAME
Specifies the maximum length for EXTERNAL name. The maximum value for n
is 100; the minimum value is 7.
FIXEDDEC
Specifies the maximum precision for FIXED DECIMAL.
NAME
Specifies the maximum length of variable names in your program. The
maximum value for n is 100; the minimum value is 31.
LINECOUNT
The LINECOUNT option specifies the number of lines per page for compiler
listings, including blank and heading lines.
┌─6#─┐
────LINECOUNT────(──┴─n──┴──)──────────────────────────────────────────────────
ABBREVIATION: LC
n The number of lines in a page in the listing. The value can be from 10 to
32,767.
LIST
The LIST option specifies that the compiler should produce a pseudo-assembler
listing.
┌─NOLIST─┐
──┴─LIST───┴───────────────────────────────────────────────────────────────────
Specifying the LIST option will increase time and region required for a compilation.
The OFFSET and MAP options may provide the information you need at much less
cost.
MACRO
The MACRO option invokes the MACRO preprocessor.
┌─NOMACRO─┐
──┴─MACRO───┴──────────────────────────────────────────────────────────────────
You may also invoke the MACRO preprocessor via the PP(MACRO) option. For
more discussion of the PP option, see “PP” on page 33.
┌─NOMAP─┐
──┴─MAP───┴────────────────────────────────────────────────────────────────────
MARGINI
The MARGINI option specifies a character that the compiler will place in the column
preceding the left-hand margin, and also in the column following the right-hand
margin, of the listings produced by the INSOURCE and SOURCE options.
┌─NOMARGINI─┐
──┴─MARGINI───┴──(──'──c──'──)─────────────────────────────────────────────────
MARGINS
The MARGINS option specifies which part of each compiler input record contains
PL/I statements, and the position of the ANS control character that formats the
listing, if the SOURCE and/or INSOURCE options apply. The compiler does not
process data that is outside these limits, but it does include it in the source listings.
The PL/I source is extracted from the source input records so that the first data
byte of a record immediately follows the last data byte of the previous record. For
variable records, you must ensure that when you need a blank you explicitly insert
it between margins of the records.
┌─2─┐ ┌─72─┐
──MARGINS──(──┴─m─┴──,──┴─n──┴──┬──────┬──)────────────────────────────────────
└─,──c─┘
ABBREVIATION: MAR
m The column number of the leftmost character (first data byte) that is processed
by the compiler. It must not exceed 100.
n The column number of the rightmost character (last data byte) that is
processed by the compiler. It should be greater than m, but must not exceed
200, except under MVS batch where it must not exceed 100.
Variable-length records are effectively padded with blanks to give them the
maximum record length.
c The column number of the ANS printer control character. It must not exceed
200, except under MVS batch where it must not exceed 100, and it should be
outside the values specified for m and n. A value of 0 for c indicates that no
ANS control character is present. Only the following control characters can be
used:
Use the MARGINS option to override the default for the primary input in a program.
The secondary input must have the same margins as the primary input.
MAXMEM
When compiling with OPTIMIZE, the MAXMEM option limits the amount of memory
used for local tables of specific, memory intensive optimizations to the specified
number of kilobytes. The minimum number of kilobytes that may be specified is 1.
The maximum number of kilobytes that may be specified is 2097152, and the
default is 1048576.
If you specify the maximum value of 2097152, the compiler will assume that
unlimited memory is available. If you specify any smaller value for MAXMEM, the
compiler, especially when the OPT(2) option is in effect, may issue a message
saying that optimization is inhibited and that you should try using a larger value for
MAXMEM.
Use the MAXMEM option if you know that less (or more) memory is available than
implied by the default value.
──MAXMEM──(──size──)───────────────────────────────────────────────────────────
ABBREVIATIONS: MAXM
When a large size is specified for MAXMEM, compilation may be aborted because
of insufficient virtual storage, depending on the source file being compiled, the size
of the subprogram in the source, and the virtual storage available for the
compilation.
MAXMSG
The MAXMSG option specifies the maximum number of messages with a given
severity (or higher) that the compilation should produce.
──MAXMSG──┬───────────────────────┬────────────────────────────────────────────
│ ┌─┬───┬───────┐ │
│ │ └─,─┘ │ │
│ │ ┌─W─┐ │ │
└─(────┬─┼─I─┼───┬─┴──)─┘
│ ├─E─┤ │
│ └─S─┘ │
│ ┌─25#─┐ │
└─┴─n───┴─┘
MAXSTMT
Under the MAXSTMT option, optimization will be turned off for any block that has
more than the specified number of statements. Use the MAXSTMT option - with a
reasonable limit to the number of statements - if you want the compiler to optimize
the code generated for a program and are willing for the compiler to optimize only
the reasonably sized blocks in that program.
──MAXSTMT──(──size──)──────────────────────────────────────────────────────────
When a large size is specified for MAXSTMT and some blocks have a large
number of statements, compilation may be aborted if there is not enough virtual
storage available.
MDECK
The MDECK option specifies that the preprocessor produces a copy of its output
either on the file defined by the SYSPUNCH DD statement under OS/390, or on the
.dek file under OS/390 UNIX.
──┴─MDECK───┴──────────────────────────────────────────────────────────────────
The MDECK option allows you to retain the output from the preprocessor as a file
of 80-column records. This option is applicable only when the MACRO option is in
effect.
NAMES
The NAMES option specifies the extralingual characters that are allowed in
identifiers. Extralingual characters are those characters other than the 26
alphabetic, 10 digit, and special characters defined in PL/I Language Reference.
┌──
──────────────┐
──NAMES──(──'──extraling_char┴─'──┬─────────────────────────────────┬──)───────
│ ┌──
──────────────────┐ │
└──┬───┬─'──upp_extraling_char┴─'─┘
└─,─┘
extralingual_char
An extralingual character
upp_extraling_char
The extralingual character that you want interpreted as the uppercase version
of the corresponding character in the first suboption.
If you omit the second suboption, PL/I uses the character specified in the first
suboption as both the lowercase and the uppercase values. If you specify the
second suboption, you must specify the same number of characters as you specify
in the first suboption.
NAME
The NAME option specifies that the TEXT file created by the compiler will contain a
NAME record.
┌─NONAME─────────────────┐
──┴─NAME──┬──────────────┬─┴───────────────────────────────────────────────────
└─(──'name'──)─┘
ABBREVIATIONS: N
If no 'name' is specified as a suboption of the NAME option, then the 'name' used
is determined as follows
if there is a PACKAGE statement, the leftmost name on it is used
otherwise, the leftmost name on the first PROCEDURE statement is used
The length of the 'name' must not be greater than 8 characters if the
LIMITS(EXTNAME(n)) option is used with n <= 8.
┌─ENU─┐
──NATLANG──(──┴─UEN─┴──)───────────────────────────────────────────────────────
ENU
All compiler messages, headers etc will be in mixedcase English.
UEN
All compiler messages, headers etc will be in uppercase English.
NEST
The NEST option specifies that the listing resulting from the SOURCE option
indicates the block level and the do-group level for each statement.
┌─NONEST─┐
──┴─NEST───┴───────────────────────────────────────────────────────────────────
NOT
The NOT option specifies up to seven alternate symbols that can be used as the
logical NOT operator.
┌──
──────┐
──NOT──(──'───char─┴─'──)──────────────────────────────────────────────────────
char
A single SBCS character.
You cannot specify any of the alphabetic characters, digits, and special characters
defined in PL/I Language Reference, except for the logical NOT symbol (¬).
When you specify the NOT option, the standard NOT symbol is no longer
recognized unless you specify it as one of the characters in the character string.
For example, NOT('˜') means that the tilde character, X'A1', will be recognized as
the logical NOT operator, and the standard NOT symbol, '¬', X'5F', will not be
recognized. Similarly, NOT('˜¬') means that either the tilde or the standard NOT
symbol will be recognized as the logical NOT operator.
The IBM-supplied default code point for the NOT symbol is X'5F'. The logical
NOT sign might appear as a logical NOT symbol (¬) or a caret symbol (^) on your
keyboard.
┌─NUMBER───┐
──┴─NONUMBER─┴─────────────────────────────────────────────────────────────────
Note that if a preprocessor has been used, more than one line in the source listing
may be identified by the same line and file numbers. For example, almost every
EXEC CICS statement generates several lines of code in the source listing, but
these would all be identified by one line and file number.
Also note that in the pseudo-assembler listing produced by the LIST option, the file
number is left blank for the first file,and for all other files, the file number shown is
one less than the file number given in the File Reference Table.
OBJECT
The OBJECT option specifies that the compiler either creates an object module and
stores it in a data set defined by the DD statement with the name SYSLIN under
OS/390, or creates a .o file under OS/390 UNIX.
┌─OBJECT───┐
──┴─NOOBJECT─┴─────────────────────────────────────────────────────────────────
OFFSET
The OFFSET option specifies that the compiler is to print a table of line numbers
for each procedure and BEGIN block with their offset addresses relative to the
primary entry point of the procedure. This table can be used to identify a statement
from a run-time error message if the GONUMBER option is not used.
┌─NOOFFSET─┐
──┴─OFFSET───┴─────────────────────────────────────────────────────────────────
OPTIMIZE
The OPTIMIZE option specifies the type of optimization required:
┌─NOOPTIMIZE─┐
──┴─OPTIMIZE───┴──(──┬─TIME─┬──)───────────────────────────────────────────────
├─K────┤
└─2────┘
OPTIMIZE(0)
The equivalent of NOOPTIMIZE.
OPTIMIZE(2)
The equivalent of OPTIMIZE(TIME).
NOOPTIMIZE
Specifies fast compilation speed, but inhibits optimization.
For more information on choosing the best options to improve the performance of
your code, see Chapter 11, “Improving performance” on page 230.
OPTIONS
The OPTIONS option specifies that the compiler includes a list showing the
compiler options to be used during this compilation in the compiler listing.
┌─NOOPTIONS─┐
──┴─OPTIONS───┴────────────────────────────────────────────────────────────────
This list includes all options applied by default, those specified in the PARM
parameter of an EXEC statement or in the invoking command (pli), those specified
in a %PROCESS statement, those specified in the IBM_OPTIONS environment
variable under OS/390, and all those incorporated from any options file.
┌──
──────────────────┐
──OR────(──'──char──'──)─┴─────────────────────────────────────────────────────
The IBM-supplied default code point for the OR symbol (|) is X'4F'.
char
A single SBCS character.
You cannot specify any of the alphabetic characters, digits, and special characters
defined in the PL/I Language Reference, except for the standard logical OR symbol
(|).
For example, OR('\') means that the backslash character, X'E0', will be
recognized as the logical OR operator, and two consecutive backslashes will be
recognized as the concatenation operator. The standard OR symbol, '|', X'4F',
will not be recognized as either operator. Similarly, OR('\|') means that either the
backslash or the standard OR symbol will be recognized as the logical OR
operator, and either symbol or both symbols can be used to form the concatenation
operator.
PP
The PP option specifies which (and in what order) preprocessors are invoked prior
to compilation.
┌─NOPP───────────────────────────────────────┐
│ ┌─┬───┬────────────────────────┐ │
│ │ └─,─┘ │ │
──┴─PP──(────pp-name──┬─────────────────┬─┴──)─┴───────────────────────────────
└─(──pp-string──)─┘
pp-name
The name given to a particular preprocessor. CICS, INCLUDE, MACRO and
SQL are the only preprocessors currently supported. Using an undefined name
causes a diagnostic error.
pp-string
A string, delimited by quotes, of up to 100 characters representing the options
for the corresponding preprocessor. For example, PP(MACRO('CASE(ASIS)'))
invokes the MACRO preprocessor with the option CASE(ASIS).
Preprocessor options are processed from left to right, and if two options conflict, the
last (rightmost) option is used. For example, if you invoke the MACRO
preprocessor with the option string 'CASE(ASIS) CASE(UPPER)', then the option
CASE(UPPER) is used.
The MACRO option and the PP(MACRO) option both cause the macro facility to be
invoked prior to compilation. If both MACRO and PP(MACRO) are specified, the
macro facility is invoked twice.
PPTRACE
The PPTRACE option specifies that, when a deck file is written for a preprocessor,
every nonblank line in that file is preceded by a line containing a %LINE directive.
The directive indicates the original source file and line to which the nonblank line
should be attributed.
┌─NOPPTRACE─┐
──┴─PPTRACE───┴────────────────────────────────────────────────────────────────
PREFIX
The PREFIX option enables or disables the specified PL/I conditions in the
compilation unit being compiled without your having to change the source program.
The specified condition prefixes are logically prefixed to the beginning of the first
PACKAGE or PROCEDURE statement.
──PREFIX──(──┬───────────────┬──)──────────────────────────────────────────────
│ ┌─┬───┬─────┐ │
│ │ └─,─┘ │ │
└───condition─┴─┘
condition
Any condition that can be enabled/disabled in a PL/I program, as explained in
PL/I Language Reference.
PROCEED
The PROCEED option stops the compiler after processing by a preprocessor is
completed depending on the severity of messages issued by previous
preprocessors.
┌─NOPROCEED──┬─────────────┬─┐
│ │ ┌─S─┐ │ │
│ └─(──┼─W─┼──)─┘ │
│ └─E─┘ │
──┴─PROCEED────────────────────┴───────────────────────────────────────────────
NOPROCEED
Ends the processing after the preprocessor has finished compiling.
NOPROCEED(S)
The invocation of preprocessors and the compiler does not continue if a severe
or unrecoverable error is detected in this stage of preprocessing.
NOPROCEED(E)
The invocation of preprocessors and the compiler does not continue if an error,
severe error, or unrecoverable error is detected in this stage of preprocessing.
NOPROCEED(W)
The invocation of preprocessors and the compiler does not continue if a
warning, error, severe error, or unrecoverable error is detected in this stage of
preprocessing.
REDUCE
The REDUCE option specifies that the compiler is permitted to reduce an
assignment of a null string to a structure into a simple copy operation - even if that
means padding bytes might be overwritten.
┌─REDUCE───┐
──┴─NOREDUCE─┴─────────────────────────────────────────────────────────────────
The REDUCE option will cause less executable code to be generated for an
assignment of a null string to a structure, and that will usually mean your code will
run much faster. However, under the REDUCE option, any assignment of a null
string to a structure that is reduced to a simple copy will also cause any padding
bytes in that structure to be filled with '00'x.
For instance, in the following structure, there is one byte of padding between
field11 and field12.
dcl
1 struc,
5 field1K bin fixed(31),
5 field11 dec fixed(13)
5 field12 bin fixed(15),
5 field13 char(2);
Under the NOREDUCE option, the assignment struc = ''; will cause four
assignments to be generated, but the padding byte will be unchanged. However,
under the REDUCE option, the assigment would be reduced to one simple copy (a
MVC), but the padding byte will be set to a '00'x.
──┴─RENT───┴───────────────────────────────────────────────────────────────────
Your code is "naturally reentrant" if it does not alter any of its static variables.
The RENT option specifies that the compiler is to take code that is not naturally
reentrant and make it reentrant. Refer to the OS/390 Language Environment
Programming Guide for a detailed description of reentrancy. If you use the RENT
option, the Linkage Editor cannot directly process the object module that is
produced: you must use either the binder or the prelinker.
The NORENT option specifies that the compiler is not to specifically generate
reentrant code from non-reentrant code. Any naturally reentrant code remains
reentrant.
If you use the RENT option, then when you link FETCHABLE modules, you must
specify DYNAM=DLL on the link step.
If you use the RENT option and CICS 4.1 or earlier, then since CICS 4.1 doesn't
support the new Program Object format created by the binder, you must link your
application via the prelinker.
Note that independent of whether you specify RENT or NORENT, for all
FETCHABLE modules, either you must specify OPTION(FETCHABLE) on the
procedure statement of the entry point to be FETCHed or you must link the module
with an apropriate ENTRY card.
If you specify the options NORENT and LIMITS(EXTNAME(n)) (with n <= 7), then
the text decks generated by the compiler will have the same format as those
generated by the older PL/I compilers. This means that the prelinker would not be
needed to create a PDS-style load module. If you use any other options, you must
use either the prelinker or PDSE's.
The code generated under the NORENT option may not be reentrant unless the
NOWRITABLE option is also specified.
The use of the NORENT does preclude the use of some features of the compiler.
In particular:
DLLs cannot be built
reentrant, writeable static is not supported
a STATIC ENTRY VARIABLE cannot have an INITIAL value
You may mix RENT and NORENT code subject to the following restrictions:
code compiled with RENT cannot be mixed with code compiled with NORENT if
they share any EXTERNAL STATIC variables
code compiled with RENT cannot call an ENTRY VARIABLE set in code
compiled with NORENT
code compiled with RENT cannot call an ENTRY CONSTANT that was
FETCHed in code compiled with NORENT
RESPECT
The RESPECT option causes the compiler to honor any specification of the DATE
attribute and to apply the DATE attribute to the result of the DATE built-in function.
──RESPECT──(──┬──────┬──)──────────────────────────────────────────────────────
└─DATE─┘
Using the default, RESPECT(), causes the compiler to ignore any specification of the
DATE attribute and ensures that the compiler does not apply the DATE attribute to
the result of the DATE built-in function.
RULES
The RULES option allows or disallows certain language capabilities and lets you
choose semantics when alternatives are available. It can help you diagnose
common programming errors.
──RULES──(────┬─┴─ANS─┴──────────┬─┴──)────────────────────────────────────────
│ ┌─BYNAME───┐ │
├─┴─NOBYNAME─┴─────┤
│ ┌─GOTO───┐ │
├─┴─NOGOTO─┴───────┤
│ ┌─NOLAXBIF─┐ │
├─┴─LAXBIF───┴─────┤
│ ┌─NOLAXCTL─┐ │
├─┴─LAXCTL───┴─────┤
│ ┌─LAXDCL───┐ │
├─┴─NOLAXDCL─┴─────┤
│ ┌─LAXIF───┐ │
├─┴─NOLAXIF─┴──────┤
│ ┌─LAXLINK───┐ │
├─┴─NOLAXLINK─┴────┤
│ ┌─LAXMARGINS───┐ │
├─┴─NOLAXMARGINS─┴─┤
│ ┌─LAXPUNC───┐ │
├─┴─NOLAXPUNC─┴────┤
│ ┌─LAXQUAL───┐ │
├─┴─NOLAXQUAL─┴────┤
│ ┌─NOLAXSTRZ─┐ │
├─┴─LAXSTRZ───┴────┤
│ ┌─MULTICLOSE───┐ │
└─┴─NOMULTICLOSE─┴─┘
IBM | ANS
Under the IBM suboption:
For operations requiring string data, data with the BINARY attribute is
converted to BIT.
Conversions in arithmetic operations or comparisons occur as described in
the PL/I Language Reference.
Conversions for the ADD, DIVIDE, MULTIPLY, and SUBTRACT built-in
functions occur as described in the PL/I Language Reference except that
operations specified as scaled fixed binary are evaluated as scaled fixed
decimal.
Nonzero scale factors are permitted in FIXED BIN declares.
If the result of any precision-handling built-in function (ADD, BINARY, etc.)
has FIXED BIN attributes, the specified or implied scale factor can be
nonzero.
Even if all arguments to the MAX or MIN built-in functions are UNSIGNED
FIXED BIN, the result is always SIGNED.
Even when you add, multiply, or divide two UNSIGNED FIXED BIN
operands, the result has the SIGNED attribute.
Even when you apply the MOD or REM built-in functions to two
UNSIGNED FIXED BIN operands, the result has the SIGNED attribute.
For operations requiring string data, data with the BINARY attribute is
converted to CHARACTER.
Conversions in arithmetic operations or comparisons occur as described in
the PL/I Language Reference.
Also, under RULES(ANS), the following errors, which the old compilers ignored,
will produce E-level messages
BYNAME | NOBYNAME
Specifying NOBYNAME causes the compiler to flag all BYNAME assignments
with an E-level message.
GOTO|NOGOTO
Specifying NOGOTO causes all GOTO statements to be flagged.
LAXBIF | NOLAXBIF
Specifying LAXBIF causes the compiler to build a contextual declaration for
built-in functions, such as NULL, even when used without an empty parameter
list.
LAXCTL | NOLAXCTL
Specifying LAXCTL allows a CONTROLLED variable to be declared with a
constant extent and yet to be allocated with a differing extent. NOLAXCTL
requires that if a CONTROLLED variable is to be allocated with a varying
extent, then that extent must be specified as an asterisk or as a non-constant
expression.
The following code is illegal under NOLAXCTL:
dcl a bit(8) ctl;
alloc a;
alloc a bit(16);
But this code would still be valid under NOLAXCTL:
dcl b bit(n) ctl;
dcl n fixed bin(31) init(8);
alloc b;
alloc b bit(16);
LAXIF | NOLAXIF
Specifying LAXIF allows IF, WHILE, UNTIL, and WHEN clauses to evaluate to
other than BIT(1) NONVARYING. NOLAXIF allows IF, WHILE, UNTIL, and
WHEN clauses to evaluate to only BIT(1) NONVARYING.
The following are illegal under NOLAXIF:
dcl i fixed bin;
dcl b bit(8);
..
.
if i then ...
if b then ...
LAXLINK | NOLAXLINK
Specifying LAXLINK causes the compiler to ignore the LINKAGE and other
options specified in the declarations of two ENTRY variables or constants when
you assign or compare one with the other.
Under RULES(NOLAXLINK), the following errors will also be flagged with
E-level messages:
LAXMARGINS | NOLAXMARGINS
Specifying NOLAXMARGINS causes the compiler to flag any line containing
non-blank characters after the right margin. This can be useful in detecing
code, such as a closing comment, that has accidentally been pushed out into
the right margin.
LAXPUNC | NOLAXPUNC
Specifying NOLAXPUNC causes the compiler to flag with an E-level message
any place where it assumes punctuation that is missing.
For instance, given the statement "I = (1 * (2);", the compiler assumes that a
closing right parenthesis was meant before the semicolon. Under
RULES(NOLAXPUNC), this statement would be flagged with an E-level
message; otherwise it would be flagged with a W-level message.
LAXQUAL | NOLAXQUAL
Specifying NOLAXQUAL causes the compiler to flag any reference to structure
members that are not level 1 and are not dot qualified. Consider the following
example:
LAXSTRZ | NOLAXSTRZ
Specifying LAXSTRZ causes the compiler not to flag any bit or character
variable that is initialized to or assigned a constant value that is too long if the
excess bits are all zeros (or if the excess characters are all blank).
MULTICLOSE | NOMULTICLOSE
NOMULTICLOSE causes the compiler to flag all statements that force the
closure of multiple groups of statement with an E-level message.
SEMANTIC
The SEMANTIC option specifies that the execution of the compiler's semantic
checking stage depends on the severity of messages issued prior to this stage of
processing.
┌───NOSEMANTIC────┬─────────────┬─┐
│ │ ┌─S─┐ │ │
│ └─(──┼─W─┼──)─┘ │
│ └─E─┘ │
──┴─SEMANTIC────────────────────────┴──────────────────────────────────────────
SEMANTIC
Equivalent to NOSEMANTIC(S).
NOSEMANTIC
Processing stops after syntax checking. No semantic checking is performed.
NOSEMANTIC (S)
No semantic checking is performed if a severe error or an unrecoverable error
has been encountered.
NOSEMANTIC (E)
No semantic checking is performed if an error, a severe error, or an
unrecoverable error has been encountered.
NOSEMANTIC (W)
No semantic checking is performed if a warning, an error, a severe error, or an
unrecoverable error has been encountered.
Semantic checking is not performed if certain kinds of severe errors are found. If
the compiler cannot validate that all references resolve correctly (for example, if
built-in function or entry references are found with too few arguments) the suitability
of any arguments in any built-in function or entry reference is not checked.
┌─NOSERVICE───────────────────────┐
──┴─SERVICE──(──'service string'──)─┴──────────────────────────────────────────
To ensure that the string remains readable across locales, only characters from the
invariant character set should be used.
SOURCE
The SOURCE option specifies that the compiler includes a listing of the source
program in the compiler listing. The source program listed is either the original
source input or, if any preprocessors were used, the output from the last
preprocessor.
┌─NOSOURCE─┐
──┴─SOURCE───┴─────────────────────────────────────────────────────────────────
ABBREVIATIONS: S, NS
SPILL
The SPILL option specifies the size of the spill area to be used for the compilation.
When too many registers are in use at once, the compiler dumps some of the
registers into temporary storage that is called the spill area.
──SPILL──(──size──)────────────────────────────────────────────────────────────
ABBREVIATIONS: SP
If you have to expand the spill area, you will receive a compiler message telling you
the size to which you should increase it. Once you know the spill area that your
source program requires, you can specify the required size (in bytes) as shown in
the syntax diagram above. The maximum spill area size is 3900. Typically, you will
need to specify this option only when compiling very large programs with
OPTIMIZE.
STDSYS
The STDSYS option specifies that the compiler should cause the SYSPRINT file to
be equated to the C stdout file.
┌─NOSTDSYS─┐
──┴─STDSYS───┴─────────────────────────────────────────────────────────────────
STMT
The STMT option specifies that statements in the source program are to be
counted and that this "statement number" is used to identify statements in the
compiler listings resulting from the AGGREGATE, ATTRIBUTES, SOURCE and
XREF options.
┌─NOSTMT─┐
──┴─STMT───┴───────────────────────────────────────────────────────────────────
When the STMT option is specified, the source listing will include both the logical
statement numbers and the source file numbers.
Note that there is no GOSTMT option. The only option that will produce
information at run-time identifying where an error has occurred is the GONUMBER
option. Also note that when the GONUMBER option is used, the term "statement"
in the run-time error messages will refer to line numbers as used by the NUMBER
compiler option - even if the STMT option was in effect.
STORAGE
The STORAGE option determines whether or not the compiler flags statements
using an excessive amount of storage for compiler-generated temporaries.
┌─NOSTORAGE──────────────┐
──┴─STORAGE──┬───────────┬─┴───────────────────────────────────────────────────
└─(──max──)─┘
max
The limit for the number of bytes that can be used for compiler-generated
temporaries. The compiler flags any statement that uses more bytes than
those specified by max. The default for max is 1000.
You should examine statements that are flagged under this option - if you code
them differently, you may be able to reduce the amount of stack storage required
by your code.
SYNTAX
The SYNTAX option specifies that the compiler continues into syntax checking after
preprocessing when you specify the MACRO option, unless an unrecoverable error
has occurred. Whether the compiler continues with the compilation depends on the
severity of the error, as specified by the NOSYNTAX option.
──┴─SYNTAX────────────────────────┴────────────────────────────────────────────
SYNTAX
Continues syntax checking after preprocessing unless a severe error or an
unrecoverable error has occurred. SYNTAX is equivalent to NOSYNTAX(S).
NOSYNTAX
Processing stops unconditionally after preprocessing.
NOSYNTAX(W)
No syntax checking if a warning, error, severe error, or unrecoverable error is
detected.
NOSYNTAX(E)
No syntax checking if the compiler detects an error, severe error, or
unrecoverable error.
NOSYNTAX(S)
No syntax checking if the compiler detects a severe error or unrecoverable
error.
You can use this option to prevent wasted runs when debugging a PL/I program
that uses the preprocessor.
If the NOSYNTAX option is in effect, any specification of the CICS preprocessor via
the CICS, XOPT or XOPTS options will be ignored. This allows the MACRO
preprocessor to be invoked before invoking the CICS translator.
SYSPARM
The SYSPARM option allows you to specify the value of the string that is returned
by the macro facility built-in function SYSPARM.
──SYSPARM──(──'string'──)──────────────────────────────────────────────────────
string
Can be up to 64 characters long. A null string is the default.
For more information about the macro facility, see PL/I Language Reference.
SYSTEM
The SYSTEM option specifies the format used to pass parameters to the MAIN PL/I
procedure, and generally indicates the host system under which the program runs.
──SYSTEM──(──┼─CICS─┼──)───────────────────────────────────────────────────────
├─IMS──┤
├─OS───┤
└─TSO──┘
Table 4 shows the type of parameter list you can expect, and how the program
runs under the specified host system. It also shows the implied settings of
NOEXECOPS. Your MAIN procedure must receive only those types of parameter
lists that are indicated as valid in this table. Additional run-time information for the
SYSTEM option is provided in OS/390 Language Environment Programming Guide.
.
Under SYSTEM(IMS), all pointers are presumed to be passed BYVALUE, but under
SYSTEM(MVS) they are presumed to be passed BYADDR.
TERMINAL
The TERMINAL option determines whether or not diagnostic and information
messages produced during compilation are displayed on the terminal.
Note: This option applies only to compilations under OS/390 UNIX.
┌─TERMINAL───┐
──┴─NOTERMINAL─┴───────────────────────────────────────────────────────────────
TERMINAL
Messages are displayed on the terminal.
NOTERMINAL
No information or diagnostic compiler messages are displayed on the terminal.
┌─NOTEST──────────────────────────────────────────┐
──┴─TEST──┬───────────────────────────────────────┬─┴──────────────────────────
│ ┌─ALL───┐ │
└─(──┬─┼─NONE──┼──┬──────────────┬─┬──)─┘
│ ├─BLOCK─┤ │ ┌─SYM───┐ │ │
│ ├─STMT──┤ └─,──┴─NOSYM─┴─┘ │
│ └─PATH──┘ │
│ ┌─SYM───┐ │
└─┴─NOSYM─┴──┬──────────────┬─┘
│ ┌─ALL───┐ │
└─,──┼─NONE──┼─┘
├─BLOCK─┤
├─STMT──┤
└─PATH──┘
STMT
Inserts hooks at statement boundaries and block boundaries. STMT generates
a statement table.
PATH
Tells the compiler to insert hooks:
BLOCK
Tells the compiler to insert hooks at block boundaries (block entry and block
exit).
ALL
Inserts hooks at all possible locations and generates a statement table.
Note: Under opt(2), hooks are set only at block boundaries.
NONE
No hooks are put into the program.
SYM
Creates a symbol table that allows you to examine variables by name.
NOTEST
Suppresses the generation of all testing information.
Any TEST option other than NOTEST and TEST(NONE,NOSYM) will automatically
provide the attention interrupt capability for program testing.
If the program has an ATTENTION ON-unit that you want invoked, you must
compile the program with either of the following:
The INTERRUPT option
A TEST option other than NOTEST or TEST(NONE,NOSYM)
Note: ATTENTION is supported only under TSO.
Because the TEST option can increase the size of the object code and can affect
performance, you might want to limit the number and placement of hooks.
Structures with REFER are supported in the symbol table only if the REFER usage
is "simple" - this means the REFER must occur on an item where
the item must have logical level 2
the item must not itself be a structure, and
the item must be either a char string or an array of numerics or pointers where
all but the upper bound of the first dimension is constant
TUNE
The TUNE option specifies the architecture for which the executable program will
be optimized. This option allows the optimizer to take advantage of architectural
differences such as scheduling of instructions.
┌─3─┐
──TUNE──(──┴─n─┴──)────────────────────────────────────────────────────────────
The current values that may be specified for the TUNE level are:
0 Generates code that is executable on all models, but that does not take
advantage of any architectural differences.
USAGE
The USAGE option lets you choose IBM or ANS semantics for selected built-in
functions.
┌─┬───┬─────────────────────┐
│ └─,─┘ │
│ ┌─IBM─┐ │
──USAGE──(────┬─ROUND──(──┴─ANS─┴──)──┬─┴──)───────────────────────────────────
│ ┌─IBM─┐ │
└─UNSPEC──(──┴─ANS─┴──)─┘
WIDECHAR
The WIDECHAR option specifies the format in which WIDECHAR data will be
stored.
┌─BIGENDIAN────┐
──WIDECHAR──(──┴─LITTLEENDIAN─┴──)─────────────────────────────────────────────
BIGENDIAN
Indicates that WIDECHAR data will be stored in bigendian format. For
instance, the WIDECHAR value for the UTF-16 character '1' will be stored as
'0031'x.
LITTLEENDIAN
Indicates that WIDECHAR data will be stored in littleendian format. For
instance, the WIDECHAR value for the UTF-16 character '1' will be stored as
'3100'x.
WINDOW
The WINDOW option sets the value for the w window argument used in various
date-related built-in functions.
┌─195#─┐
──WINDOW──(──┴─w────┴──)───────────────────────────────────────────────────────
WRITABLE
The WRITABLE option specifies that the compiler may treat static storage as
writable (and if it does, this would make the resultant code non-reentrant).
┌─WRITABLE───┐
──┴─NOWRITBALE─┴───────────────────────────────────────────────────────────────
This option has no effect on programs compiled with the RENT option.
The NORENT WRITABLE options allow the compiler to use a static pointer
as the base for the stack that tracks a CONTROLLED variable
as the handle for the storage that represents a FILE
Under the NORENT NOWRITABLE options, an application may not perform as well
as if it were compiled with the RENT or WRITABLE options if the application
uses CONTROLLED variables
assigns FILE CONSTANTs to FILE VARIABLEs
Code compiled with NORENT WRITABLE cannot be mixed with code compiled with
NORENT NOWRITABLE if they share any external CONTROLLED variables. In
general, you should avoid mixing code compiled with WRITABLE with code
compiled with NOWRITABLE.
┌─┬───┬─────────┐
│ └─,─┘ │
│ ┌─NODEF─┐ │
──XINFO──(────┬─┴─DEF───┴─┬─┴──)───────────────────────────────────────────────
│ ┌─NOXML─┐ │
└─┴─XML───┴─┘
DEF
A definition side-deck file is created. This file lists, for the compilation unit, all:
Under batch, this file is written to the file specified by the SYSDEFSD DD
statement. Under Unix Systems Services, this file is written to the same
directory as the object deck and has the extension "def".
For instance, given the program:
defs: proc;
dcl (b,c) ext entry;
dcl x ext fixed bin(31) init(1729);
dcl y ext fixed bin(31) reserved;
call b(y);
fetch c;
call c;
end;
The following def file would be produced:
EXPORTS CODE
DEFS
EXPORTS DATA
X
IMPORTS
B
Y
FETCH
C
The def file can be used to be build a dependency graph or cross-reference
analysis of your application.
NODEF
No definition side-deck file is created.
XML
An XML side-file is created. This XML file includes:
Under batch, this file is written to the file specified by the SYSXMLSD DD
statement. Under Unix Systems Services, this file is written to the same
directory as the object deck and has the extension "xml".
The DTD file for the XML produced is:
<?xml encoding="UTF-8"?>
NOXML
No XML side-file is created.
XREF
The XREF option provides a cross-reference table of names used in the program
together with the numbers of the statements in which they are declared or
referenced in the compiler listing.
┌─NOXREF────────────────────────┐
──┴───XREF────┬─────────────────┬─┴────────────────────────────────────────────
│ ┌─FULL──┐ │
└─(──┴─SHORT─┴──)─┘
ABBREVIATIONS: X, NX
FULL
Includes all identifiers and attributes in the compiler listing.
SHORT
Omits unreferenced identifiers from the compiler listing.
The only names not included in the cross reference listing created when using the
XREF option are label references on END statements. For example, assume that
statement number 20 in the procedure PROC1 is END PROC1;. In this situation,
statement number 20 does not appear in the cross reference listing for PROC1.)
For a description of the format and content of the cross-reference table, see
“Cross-reference table” on page 57.
For more information about sorting identifiers and storage requirements with
DBCSOS, see “ATTRIBUTE and cross-reference table” on page 56.
The %PROCESS statement identifies the start of each external procedure and
allows compiler options to be specified for each compilation. The options you
specify in adjacent %PROCESS statements apply to the compilation of the source
statements to the end of input, or the next %PROCESS statement.
The number of characters is limited only by the length of the record. If you do not
wish to specify any options, code:
%PROCESS;
If you find it necessary to continue the %PROCESS statement onto the next record,
terminate the first part of the list after any delimiter, and continue on the next
record. You cannot split keywords or keyword arguments across records. You can
continue a %PROCESS statement on several lines, or start a new %PROCESS
statement. An example of multiple adjacent %PROCESS statements is as follows:
%PROCESS INT F(I) AG A(F) OP STG NEST X(F) SOURCE ;
%PROCESS LIST TEST ;
Compile-time options, their abbreviated syntax, and their IBM-supplied defaults are
shown in Table 3 on page 3.
It is not necessary to invoke the preprocessor if your source program, and any text
to be included, does not contain any macro statements.
//OPT4#9 JOB
//STEP3 EXEC IBMZCBG,PARM.PLI='INC,S,A,X,NEST'
//PLI.SYSLIB DD DSN=HPU8.NEWLIB,DISP=OLD
//PLI.SYSIN DD ]
TEST: PROC OPTIONS(MAIN) REORDER;
DCL ZIP PIC '99999'; /] ZIP CODE ]/
DCL EOF BIT INIT('K'B);
ON ENDFILE(SYSIN) EOF = '1'B;
GET EDIT(ZIP) (COL(1), P'99999');
DO WHILE(¬EOF);
PUT SKIP EDIT(ZIP, CITYFUN(ZIP)) (P'99999', A(16));
GET EDIT(ZIP) (COL(1), P'99999');
END;
%PAGE;
%INCLUDE FUN;
END; /] TEST ]/
//GO.SYSIN DD ]
95141
95K3K
941K1
//
Heading information
The first page of the listing is identified by the product number, the compiler version
number, and the date and the time compilation commenced. This page and
subsequent pages are numbered.
Near the end of the listing you will find either a statement that no errors or warning
conditions were detected during the compilation, or a message that one or more
errors were detected. The format of the messages is described under “Messages
and return codes” on page 60. The second to the last line of the listing shows the
CPU time taken for the compilation. The last line of the listing is END OF
COMPILATION OF xxxx. where xxxx is the external procedure name. If you
specify the NOSYNTAX compiler option, or the compiler aborts early in the
compilation, the external procedure name xxxx is not included and the line
truncates to END OF COMPILATION.
The following sections describe the optional parts of the listing in the order in which
they appear.
The OPTIONS listing will start with a line showing the initial install options (those
are the options set at install time and which are applied before any other options).
Under USS, the next line would show the options set via the IBM_OPTIONS
environment variable. Then the listing will show any *PROCESS or %PROCESS
lines in the source. Finally the will end with a line showing the final install options
(those are the options set at install time and which are applied after any other
options).
The rest of the OPTIONS listing will show the settings of all the options finally in
effect during the compilation. If the setting of an option differs from the default
setting after the initial install options were applied, then that line will be marked with
a+
Preprocessor input
If you specify both the MACRO and INSOURCE options, the compiler lists input to
the preprocessor, one record per line, each line numbered sequentially at the left.
If you specify the MACRO option, the source listing shows the included text in
place of the %INCLUDE statements in the primary input data set.
If you specify the XREF option, the compiler prints a cross-reference table
containing a list of the identifiers in the source program together with the file and
line numbers of the statements in which they appear.
If you specify both ATTRIBUTES and XREF, the two tables are combined. In these
tables, if you explicitly declare an identifier, the compiler will list file number and line
number of its DECLARE. Contextually declared variables are marked by +++++,
and other implicitly declared variables are marked by *****.
Attribute table
The compiler never includes the attributes INTERNAL and REAL. You can assume
them unless the respective conflicting attributes, EXTERNAL and COMPLEX,
appear.
For a file identifier, the attribute FILE always appears, and the attribute EXTERNAL
appears if it applies; otherwise, the compiler lists only explicitly declared attributes.
The compiler prints the dimension attribute for an array first. It prints the bounds as
in the array declaration, but expressions are replaced by asterisks unless they have
For a character string, a bit string, a graphic string, or an area variable, the
compiler prints the length, as in the declaration, but expressions are replaced by
asterisks unless they have been reduced by the compiler to a constant, in which
case the value of the constant is shown.
Cross-reference table
If you combine the cross-reference table with the attribute table, the list of attributes
for a name is identified by file number and line number. An identifier appears in the
Sets: part of the cross-reference table if it is:
The target of an assignment statement
Used as a loop control variable in DO loops
Used in the SET option of an ALLOCATE or LOCATE statement
Used in the REPLY option of a DISPLAY statement
If you specify ATTRIBUTES and XREF, the two tables are combined.
Please be careful when interpreting the data offsets indicated in the data length
table. An odd offset does not necessarily represent a data element without
halfword, fullword, or even double word alignment. If you specify or infer the
aligned attribute for a structure or its elements, the proper alignment requirements
are consistent with respect to other elements in the structure, even though the table
does not indicate the proper alignment relative to the beginning of the table.
In the example shown in Figure 2, the message indicates that the condition was
raised at offset +58 from the SUB1 entry. The compiler listing excerpt shows this
offset associated with line number 8. The run-time output from this erroneous
statement is shown if Figure 3 on page 59.
Compiler Source
Line.File
2.1 TheMain: proc options( main );
3.1 call sub1();
4.1 Sub1: proc;
5.1 dcl (i, j) fixed bin(31);
6.1
7.1 i = K;
8.1 j = j / i;
9.1 end Sub1;
1K.1 end TheMain;
. . .
. . .
. . .
. . .
Entry offsets given in dump and ON-unit SNAP error messages can be compared
with this table and the erroneous statement discovered. The statement is identified
by finding the section of the table that relates to the block named in the message
and then finding the largest offset less than or equal to the offset in the message.
The statement number associated with this offset is the one needed.
For an AUTOMATIC variable with adjustable extents, there will be two entries in
this table:
an entry with '_addr' prefixing the variable name - this entry gives the location
of the address of the variable
an entry with '_desc' prefixing the variable name - this entry gives the location
of the address of the variable's descriptor
For STATIC and CONTROLLED variables, the storage location will depend on the
RENT/NORENT compiler option, and if the the NORENT option is in effect, the
location of CONROLLED variables will also depend on the
WRITABLE/NOWRITABLE compiler option.
The first column in the Storage Offset Listing is labeled IDENTIFIER and holds the
name of the variable whose location appears in the fourth column.
The second column in the Storage Offset Listing is labeled DEFINITION and holds
a string in the format "B-F:N" where
B is the number of the block where the variable is declared
You can find the name of the block corresponding to this block number in the
Block Name List which will proceed the Storage Offset Listing (and the Pseudo
Assembly Listing, if any)
F is the number of the source file where the variable is declared
You can find the name of the file corresponding to this file number in the File
Reference Table which will appear very near the end of the entire compilation
listing.
The third column in the Storage Offset Listing is labeled ATTRIBUTES and
indicates the storage class of the variable.
The fourth column in the Storage Offset Listing is unlabeled and tells how to find
the location of the variable.
The first entry in the included-from column is blank because the first file listed is the
source file. Subsequent entries in this column show the line number of the include
statement followed by a period and the file number of the source file containing the
include.
If the file is a member of a PDS or PDSE, the file name lists the fully qualified
dataset name and the member name.
If the file is included via a subsystem (such as Librarian), then the file name will
have the form DD:ddname(member), where
ddname is the ddname specified on the %INCLUDE statement (or SYSLIB if no
ddname was specified)
member is the member name specified on the %INCLUDE statement.
For every compilation job or job step, the compiler generates a return code that
indicates to the operating system the degree of success or failure it achieved. For
OS/390, this code appears in the end-of-step message that follows the listing of the
job control statements and job scheduler messages for each step.
The compiler lists only messages that have a severity equal to or greater than that
specified by the FLAG option, as shown in Table 6.
The PL/I compiler allows you to select one or more of the integrated preprocessors
as required for use in your program. You can select the include preprocessor, the
macro preprocessor, the SQL preprocessor, or the CICS preprocessor and the
order in which you would like them to be called.
The include preprocessor processes special include directives and incorporates
external source files.
The macro preprocessor, based on %statements and macros, modifies your
source program.
The SQL preprocessor modifies your source program and translates EXEC
SQL statements into PL/I statements.
The CICS preprocessor modifies your source program and translates EXEC
CICS statements into PL/I statements.
The three compile-time options MDECK, INSOURCE, and SYNTAX are meaningful
only when you also specify the PP option. For more information about these
options, see MDECK on page 28, INSOURCE on page 22, and SYNTAX on
page 43.
Include preprocessor
The include preprocessor allows you to incorporate external source files into your
programs by using include directives other than the PL/I directive %INCLUDE.
The following syntax diagram illustrates the options supported by the INCLUDE
preprocessor:
──PP──(──INCLUDE──(──'──ID(<directive>)──'──)──)───────────────────────────────
ID Specifies the name of the include directive. Any line that starts with this
directive as the first set of nonblank characters is treated as an include
directive.
The specified directive must be followed by one or more blanks, an include
member name, and finally an optional semicolon. Syntax for
ddname(membername) is not supported.
In the following example, the first include directive is valid and the second one
is not:
++include payroll
++include syslib(payroll)
This first example causes all lines that start with -INC (and possibly preceding
blanks) to be treated as include directives:
pp( include( 'id(-inc)'))
This second example causes all lines that start with ++INCLUDE (and possibly
preceding blanks) to be treated as include directives:
pp( include( 'id(++include)'))
Macro preprocessor
Macros allow you to write commonly used PL/I code in a way that hides
implementation details and the data that is manipulated, and exposes only the
operations. In contrast with a generalized subroutine, macros allow generation of
only the code that is needed for each individual use.
The macro preprocessing facilities of the compiler are described in the PL/I
Language Reference.
──PP──(──MACRO──(──'──┬──────────────────────────┬──┬───────────────────────┬───
│ ┌─DECIMAL─┐ │ │ ┌─UPPER─┐ │
└─FIXED──(──┴─BINARY──┴──)─┘ └─CASE──(──┴─ASIS──┴──)─┘
──'──)──)───────────────────────────────────────────────────────────────────────
SQL preprocessor
In general, the coding for you PL/I program will be the same whether or not you
want it to access a DB2 database. However, to retrieve, update, insert, and delete
DB2 data and use other DB2 services, you must use SQL statements. You can
use dynamic and static EXEC SQL statements in PL/I applications.
Before you can take advantage of EXEC SQL support, you must have authority to
access a DB2 system. Contact your local DB2 Database Administrator for your
authorization.
Note: The PL/I SQL Preprocessor currently does not support DBCS.
In addition, using the PL/I SQL Preprocessor lifts some of the DB2 precompiler's
restrictions on SQL programs. When you process SQL statements with the PL/I
SQL Preprocessor, you can now
use fully-qualified names for structured host variables
include SQL statements at any level of a nested PL/I program, instead of in
only the top-level source file
use nested SQL INCLUDE statements
Compiling with the PL/I SQL Preprocessor option generates a DB2 database
request module (DBRM) along with the usual PL/I compiler outputs such as object
module and listing. As input to the DB2 bind process, the DBRM data set contains
information about the SQL statements and host variables in the program.
The PL/I compiler listing includes the error diagnostics (such as syntax errors in the
SQL statements) that the PL/I SQL Preprocessor generates.
To use the PL/I SQL Preprocessor, you need to do the following things:
Specify the following option when you compile your program
PP(SQL('options'))
This compiler option indicates that you want the compiler to invoke the PL/I
SQL preprocessor. Specify a list of SQL processing options in the parenthesis
after the SQL keyword. The options can be separated by a comma or by a
space.
For example, PP(SQL('DATE(USA),TIME(USA)') tells the preprocessor to use the
USA format for both DATE and TIME data types.
In addition, for LOB support you must specify the option
LIMITS( FIXEDBIN(31,63) FIXEDDEC(31) )
Include DD statements for the following data sets in the JCL for your compile
step:
– DB2 load library (prefix.SDSNLOAD)
The PL/I SQL preprocessor calls DB2 modules to do the SQL statement
processing. You therefore need to include the name of the DB2 load
library data set in the STEPLIB concatenation for the compile step.
– Library for SQL INCLUDE statements
If your program contains SQL INCLUDE member-name statements that
specify secondary input to the source program, you need to include the
────PP────(────SQL────(──'──┬─────────────────────────┬──┬──────────────────┬───
│ ┌─TSO───┐ │ │ ┌─2─┐ │
└─ATTACH──(──┼───────┼──)─┘ └─CONNECT(─┼───┼─)─┘
├─CAF───┤ └─1─┘
└─RRSAF─┘
──┬───────────────────────┬──┬───────────────────┬──┬───────────────────────┬────
└─SQLFLAG──(──┬───────────────────────────────────┬──)─┘
├─STD─┬──────────────────────────┬──┤
│ └─(ssname─┬────────────┬─)─┘ │
│ └─,qualifier─┘ │
└─IBM───────────────────────────────┘
──┬───────────────────────┬──┬───────────────────────┬───────────────────────────
│ ┌─NO──┐ │ └─TIME──(──┬───────┬──)─┘
└─STDSQL──(──┼─────┼──)─┘ ├─ISO───┤
└─YES─┘ ├─USA───┤
├─EUR───┤
├─JIS───┤
└─LOCAL─┘
──┬────────────────────┬──┬─────────────────────────┬──'──)──)──────────────────
│ ┌─DB2─┐ │ └─VERSION──(──┬──────┬──)─┘
└─SQL──(──┼─────┼──)─┘ ├─aaaa─┤
└─ALL─┘ └─AUTO─┘
The table uses a vertical bar(|) to separate mutually exclusive options, and brackets
( ) to indicate that you can sometimes omit the enclosed option.
ATTACH(TSO|CAF|RRSAF)
Specifies the attachment facility that the application uses to access DB2. TSO,
CAF and RRSAF applications that load the attachment facility can use this
option to specify the correct attachment facility, instead of coding a dummy
DSNHLI entry point.
The default is ATTACH(TSO).
CONNECT(2|1)
Determines whether to apply type 1 or type 2 CONNECT statement rules.
DATE(ISO|USA|EUR|JIS|LOCAL)
Specifies that date output should always be returned in a particular format,
regardless of the format specified as the location default. For a description of
these formats, refer to the DB2 SQL Reference manual.
The default is in the field DATE FORMAT on the Application Programming
Defaults Panel 2 when DB2 is installed.
You cannot use the LOCAL option unless you have a date exit routine.
DEC(15|31)
Specifies the maximum precision for decimal arithmetic operations.
The default is in the field DECIMAL ARITHMETIC on the Application
Programming Defaults Panel 1 when DB2 is installed.
FLOAT(S390|IEEE)
Determines whether the contents of floating point host variables are in
System/390 hexadeciimal format or in IEEE format. An error message is
issued if this FLOAT option is different than the PL/I compiler's
DEFAULT(HEXADEC|IEEE) option.
The default setting is FLOAT(S390).
GRAPHIC
Indicates that the source code might use mixed data, and that X'0E' and X'0F'
are special control characters (shift-out and shift-in) for EBCDIC data.
GRAPHIC and NOGRAPHIC are mutually exclusive options. The default is in
the field MIXED DATA on the Application Programming Defaults Panel 1 when
DB2 is installed.
LEVEL(aaaa)
Defines the level of a module, where aaaa is any alphanumeric value of up to
seven characters. This option is not recommended for general use, and the
DSNH CLIST and the DB2I panels do not support it.
You can omit the suboption (aaaa). The resulting consistency token is blank.
The LEVEL option can be abbreviated to L.
NOFOR
In static SQL, NOFOR eliminates the need for the FOR UPDATE of FOR
UPDATE OF clause in DECLARE CURSOR statements. When you use
NOFOR, your program can make positioned updates to any columns that the
program has DB2 authority to update.
When you do not use NOFOR, if you want to make positioned updates to any
columns that the program has DB2 authority to update, you need to specify
NOGRAPHIC
Indicates the use of X'0E' and X'0F' in a string, but not as control characters.
GRAPHIC and NOGRAPHIC are mutually exclusive options. The default is in
the field MIXED DATA on the Application Programming Defaults Panel 1 when
DB2 is installed.
NOOPTIONS
Suppresses the SQL Preprocessor options listing.
The NOOPTIONS option can be abbreviated to NOOPTN.
ONEPASS
Processes in one pass, to avoid the additional processing time for making two
passes. Declarations must appear before SQL references if the ONEPASS
option is used.
ONEPASS and TWOPASS are mutually exclusive options.
The default is ONEPASS.
The ONEPASS option can be abbreviated to ON.
OPTIONS
Lists SQL Preprocessor options.
The default is OPTIONS.
The OPTIONS option can be abbreviated to OPTN.
SQL(ALL|DB2)
Indicates whether the source contains SQL statements other than those
recognized by DB2 for OS/390 and z/OS.
SQL(ALL) is recommended for application programs whose SQL statements
must execute on a server other than DB2 for OS/390 and z/OS using DRDA
access. SQL(ALL) indicates that the SQL statements in the program are not
necessarily for DB2 for OS/390 and z/OS. Accordingly, the SQL statement
processor then accepts statements that do not conform to the DB2 syntax
rules. The SQL statement processor interprets and processes SQL statements
according to distributed relational database architecture (DRDA) rules. The
SQL statement processor also issues an informational message if the program
attempts to use an IBM SQL reserved words as ordinary identifiers. SQL(ALL)
does not affect the limits of the SQL statement processor.
SQL(DB2), the default, means to interpret SQL statements and check syntax
for use by DB2 for OS/390 and z/OS. SQL(DB2) is recommended when the
database server is DB2 for OS/390 and z/OS.
SQLFLAG(IBM|STD(ssname,qualifier))
Specifies the standard used to check the syntax of SQL statements. When
statements deviate from the standard, the SQL statement processor writes
informational messages (flags) to the output listing. The SQLFLAG option is
independent of other SQL statement processor options, including SQL and
STDSQL.
IBM checks SQL statements against the syntax of IBM SQL Version 1.
STD checks SQL statements against the syntax of the entry level of the
ANSI/ISO SQL standard of 1992. You can also use 86 for option, as in
releases before Version 7.
ssname requests semantics checking, using the specified DB2 subsystem
name for catalog access. If you do not specify ssname, the SQL statement
processor checks only the syntax.
qualifier specifies the qualifier used for flagging. If you specify a qualifier, you
must always specify the ssname first. If qualifier is not specified, the default is
the authorization ID of the process that started the SQL statement processor.
STDSQL(NO|YES)
Indicates to which rules the output statements should conform.
STDSQL(YES) indicates that the precompiled SQL statements in the source
program conform to certain rules of the SQL standard. STDSQL(NO) indicates
conformance to DB2 rules.
The default is in the field STD SQL LANGUAGE on the Application
Programming Defaults Panel 2 when DB2 is installed.
STDSQL(YES) automatically implies the NOFOR option.
TIME(ISO|USA|EUR|JIS|LOCAL)
Specifies that time output should always be returned in a particular format,
regardless of the format specified as the location default. For a description of
these formats, refer to the DB2 SQL Reference manual.
The default is in the field TIME FORMAT on the Application Programming
Defaults Panel 2 when DB2 is installed.
You cannot use the LOCAL option unless you have a date exit routine.
TWOPASS
Processes in two passes, so that declarations need not precede references.
ONEPASS and TWOPASS are mutually exclusive options.
The default is ONEPASS.
The TWOPASS option can be abbreviated to TW.
VERSION(aaaa|AUTO)
Defines the version identifier of a package, program, and the resulting DBRM.
When you specify VERSION, the SQL statement processor creates a version
identifier in the program and DBRM. This affects the size of the load module
and DBRM. DB2 uses the version identifier when you bind the DBRM to a plan
or package.
If you do not specify a version at precompile time, then an empty string is the
default version identifier. If you specify AUTO, the SQL statement processor
uses the consistency token to generate the version identifier. If the consistency
token is a timestamp, the timestamp is converted into ISO character format and
used as the version identifier. The timestamp used is based on the
System/370 Store Clock value.
The SQLCA should be included by using the EXEC SQL INCLUDE statement:
exec sql include sqlca;
The SQLCA must not be defined within an SQL declare section. The scope of the
SQLCODE and SQLSTATE declaration must include the scope of all SQL
statements in the program.
Dcl
1 Sqlca,
2 sqlcaid char(8), /] Eyecatcher = 'SQLCA ' ]/
2 sqlcabc fixed binary(31), /] SQLCA size in bytes = 136 ]/
2 sqlcode fixed binary(31), /] SQL return code ]/
2 sqlerrmc char(7K) var, /] Error message tokens ]/
2 sqlerrp char(8), /] Diagnostic information ]/
2 sqlerrd(K:5) fixed binary(31), /] Diagnostic information ]/
2 sqlwarn, /] Warning flags ]/
3 sqlwarnK char(1),
3 sqlwarn1 char(1),
3 sqlwarn2 char(1),
3 sqlwarn3 char(1),
3 sqlwarn4 char(1),
3 sqlwarn5 char(1),
3 sqlwarn6 char(1),
3 sqlwarn7 char(1),
2 sqlext,
3 sqlwarn8 char(1),
3 sqlwarn9 char(1),
3 sqlwarna char(1),
3 sqlstate char(5); /] State corresponding to SQLCODE ]/
Dcl
1 Sqlda based(Sqldaptr),
2 sqldaid char(8), /] Eye catcher = 'SQLDA ' ]/
2 sqldabc fixed binary(31), /] SQLDA size in bytes=16+44]SQLN]/
2 sqln fixed binary(15), /] Number of SQLVAR elements]/
2 sqld fixed binary(15), /] # of used SQLVAR elements]/
2 sqlvar(Sqlsize refer(sqln)), /] Variable Description ]/
3 sqltype fixed binary(15), /] Variable data type ]/
3 sqllen fixed binary(15), /] Variable data length ]/
3 sqldata pointer, /] Pointer to variable data value]/
3 sqlind pointer, /] Pointer to Null indicator]/
3 sqlname char(3K) var ; /] Variable Name ]/
Dcl
1 Sqlda2 based(Sqldaptr),
2 sqldaid2 char(8), /] Eye catcher = 'SQLDA ' ]/
2 sqldabc2 fixed binary(31), /] SQLDA size in bytes=16+44]SQLN]/
2 sqln2 fixed binary(15), /] Number of SQLVAR elements]/
2 sqld2 fixed binary(15), /] # of used SQLVAR elements]/
2 sqlvar2(Sqlsize refer(sqln2)), /] Variable Description ]/
3 sqlbiglen,
4 sqllongl fixed binary(31),
4 sqlrsvdl fixed binary(31),
3 sqldatal pointer,
3 sqltname char(3K) var;
Continuation for SQL statements: The line continuation rules for SQL
statements are the same as those for other PL/I statements.
Including code: SQL statements or PL/I host variable declaration statements can
be included by placing the following SQL statement at the point in the source code
where the statements are to be embedded:
exec sql include member;
Names: Any valid PL/I variable name can be used for a host variable and is
subject to the following restriction: Do not use host variable names or external entry
names that begin with 'SQL', 'DSN', or 'IBM'. These names are reserved for
the database manager and PL/I. The length of a host variable name must not
exceed the value n specified in the LIMITS(NAME(n)) compiler option.
Statement labels: With the exception of the END DECLARE SECTION statement,
and the INCLUDE text-file-name statement, executable SQL statements, like PL/I
statements, can have a label prefix.
WHENEVER statement: The target for the GOTO clause in an SQL WHENEVER
statement must be a label in the PL/I source code and must be within the scope of
any SQL statements affected by the WHENEVER statement.
In addition:
All host variables within an SQL statement must be preceded by a colon (:).
The names of host variables must be unique within the program, even if the
host variables are in different blocks or procedures.
An SQL statement that uses a host variable must be within the scope of the
statement in which the variable was declared.
Host variables cannot be declared as an array, although an array of indicator
variables is allowed when the array is associated with a host structure.
Declaring host variables: Host variable declarations can be made at the same
place as regular PL/I variable declarations.
Only a subset of valid PL/I declarations are recognized as valid host variable
declarations. The preprocessor does not use the data attribute defaults specified in
the PL/I DEFAULT statement. If the declaration for a variable is not recognized,
any statement that references the variable might result in the message “The host
variable token ID is not valid”.
Only the names and data attributes of the variables are used by the preprocessor;
the alignment, scope, and storage attributes are ignored.
Numeric host variables: The following figure shows the syntax for valid numeric
host variable declarations.
──┬─DECLARE─┬──┬─variable-name───────┬──────────────────────────────────────────
└─DCL─────┘ │ ┌─,───────────┐ │
└─(──variable-name┴─)─┘
─────┬─────────┬──┬─FIXED──┬─────────────────────────┬─┬─────────────────────────
├─BINARY──┤ │ └─(precision─┬────────┬─)─┘ │
├─BIN─────┤ │ └─,scale─┘ │
├─DECIMAL─┤ └─FLOAT─┬─────────────────┬──────────┘
└─DEC─────┘ └─(──precision──)─┘
──┬───────────────────────────────────────┬── ; ────────────────────────────────
└─Alignment and/or Scope and/or Storage─┘
Notes
Character host variables: The following figure shows the syntax for valid character
host variables.
──┬─DECLARE─┬──┬─variable-name───────┬──────────────────────────────────────────
└─DCL─────┘ │ ┌─,───────────┐ │
└─(──variable-name┴─)─┘
──┬─CHARACTER─┬──┬──────────┬──┬─────────┬───────────────────────────────────────
Notes
Graphic host variables: The following figure shows the syntax for valid graphic
host variables.
──┬─DECLARE─┬──┬─variable-name───────┬──GRAPHIC──┬──────────┬──┬─────────┬──────
Notes
Result set locators: The following figure shows the syntax for valid result set
locator declarations.
──┬─DECLARE─┬──┬─variable-name───────┬──────────────────────────────────────────
└─DCL─────┘ │ ┌─,───────────┐ │
└─(──variable-name┴─)─┘
────SQL TYPE IS RESULT_SET_LOCATOR────┬─────────┬────────────────────────────────
├─VARYING─┤
└─VAR─────┘
──┬───────────────────────────────────────┬── ; ────────────────────────────────
└─Alignment and/or Scope and/or Storage─┘
Table locators: The following figure shows the syntax for valid table locators.
──┬─DECLARE─┬──┬─variable-name───────┬──────────────────────────────────────────
└─DCL─────┘ │ ┌─,───────────┐ │
└─(──variable-name┴─)─┘
────SQL TYPE IS TABLE LIKE table-name AS LOCATOR──── ; ─────────────────────────
LOB Variables and Locators: The following figure shows the syntax for
declarations of BLOB, CLOB, and DBCLOB host variables and locators.
ROWIDs: The following figure shows the syntax for valid declarations of ROWID
variables.
Table 7 (Page 1 of 2). SQL data types generated from PL/I declarations
SQLTYPE SQLLEN of SQL Data Type
of Host Host
PL/I Data Type Variable Variable
BIN FIXED(n), n < 16 500 2 SMALLINT
BIN FIXED(n), n ranges from 16 to 496 4 INTEGER
31
DEC FIXED(p,s) 484 p (byte 1) DECIMAL(p,s)
0<=p<=15 and s (byte 2)
0<=s<=p
BIN FLOAT(p), 480 4 REAL or FLOAT(n)
1 ≤ p ≤ 21 1<=n<=21
BIN FLOAT(p), 480 8 DOUBLE PRECISION or
22 ≤ p ≤ 53 FLOAT(n)
22<=n<=53
DEC FLOAT(m), 480 4 FLOAT (single precision)
1≤m≤6
DEC FLOAT(m), 480 8 FLOAT (double precision)
7 ≤ m ≤ 16
CHAR(n), 452 n CHAR(n)
CHAR(n) VARYING, 448 n VARCHAR(n)
1 ≤ n ≤ 255
Table 7 (Page 2 of 2). SQL data types generated from PL/I declarations
SQLTYPE SQLLEN of SQL Data Type
of Host Host
PL/I Data Type Variable Variable
CHAR(n) VARYING, n > 255 456 n VARCHAR(n)
GRAPHIC(n), 468 n GRAPHIC(n)
1 ≤ n ≤ 127
GRAPHIC(n) VARYING, 464 n VARGRAPHIC(n)
1 ≤ n ≤ 2000
GRAPHIC(n) VARYING, n > 2000 472 n LONG VARGRAPHIC
The following tables can be used to determine the PL/I data type that is equivalent
to a given SQL data type.
Example 1
DCL my_blob SQL TYPE IS BLOB(2KKK);
After transform:
DEFINE STRUCTURE
1 BLOB_2KKK,
2 LOB_VAR_LENGTH FIXED BIN(31),
2 LOB_VAR_DATA,
3 LOB_VAR_DATA1(1) CHAR(2KKK);
DCL my_blob TYPE BLOB_2KKK;
Example 2
DCL my_dbclob SQL TYPE IS DBCLOB(4KKKK);
After transform:
DEFINE STRUCTURE
1 DBCLOB_4KKKK,
2 LOB_VAR_LENGTH FIXED BIN(31),
2 LOB_VAR_DATA,
3 LOB_VAR_DATA1(25K) GRAPHIC(16383),
3 LOB_VAR_DATA2 GRAPHIC(25K);
DCL my_dbclob TYPE DBCLOB_4KKKK;
Example 3
DCL my_clob_locator SQL TYPE IS CLOB_LOCATOR;
After transform:
DEFINE ALIAS CLOB_LOCATOR FIXED BIN(31);
DCL my_clob_locator TYPE CLOB_LOCATOR;
In this example, B is the name of a host structure consisting of the scalars C1 and
C2.
Host structures are limited to two levels. A host structure can be thought of as a
named collection of host variables.
You must terminate the host structure variable by ending the declaration with a
semicolon. For example:
dcl 1 A,
2 B char,
2 (C, D) char;
dcl (E, F) char;
Host variable attributes can be specified in any order acceptable to PL/I. For
example, BIN FIXED(31), BINARY FIXED(31), BIN(31) FIXED, and FIXED BIN(31)
are all acceptable.
The following diagram shows the syntax for valid host structures.
──┬─DECLARE─┬──level──variable-name──┬──────────────────────┬──,───────────────────────────
Indicator variables are declared in the same way as host variables and the
declarations of the two can be mixed in any way that seems appropriate to the
programmer.
The following diagram shows the syntax for a valid indicator variable.
──┬─DECLARE─┬──variable-name──┬─BINARY─┬──FIXED(15)──;─────────────────────────
└─DCL─────┘ └─BIN────┘
The following diagram shows the syntax for a valid indicator array.
──┬─DECLARE─┬──┬─variable-name──(──dimension──)───────────┬──┬─BINARY─┬─────────
──FIXED(15)──;──────────────────────────────────────────────────────────────────
exec sql
fetch cursor_a
into :games.sunday.opponents:indicator(1),
:games.sunday.gtime:indicator(2),
:games.sunday.tv:indicator(3),
:games.sunday.comments:indicator(4);
exec sql
fetch cursor_a
into :games.sunday:indicator;
CICS Preprocessor
You can use EXEC CICS statements in PL/I applications that run as transactions
under CICS.
If you do not specify the PP(CICS) option, EXEC CICS statements are parsed and
variable references in them are validated. If they are correct, no messages are
issued as long as the NOCOMPILE option is in effect. Without invoking the CICS
translator, real code cannot be generated.
To use the CICS preprocessor, you must also specify the PP(CICS) compile-time
option.
If your CICS program is a MAIN procedure, you must also compile it with the
SYSTEM(CICS) option. NOEXECOPS is implied with this option and all
parameters passed to the MAIN procedure must be POINTERs. For a description
of the SYSTEM compile-time option, see “SYSTEM” on page 44.
If your CICS program includes any files or uses any macros that contain EXEC
CICS statements, you must also run the MACRO preprocessor before your code is
translated (in either of the ways described above). If you are using the CICS
preprocessor, you can specify this with one PP option as illustrated in the following
example:
pp (macro(...) cics(...) )
Finally, in order to use the CICS preprocessor, you must have the CICS
SDFHLOAD dataset as part of the STEPLIB DD for the PL/I compiler.
Continuation for CICS statements: Line continuation rules for CICS statements
are the same as those for other PL/I statements.
Margins: CICS statements must be coded within the columns specified in the
MARGINS compile-time option.
Statement labels: EXEC CICS statements, like PL/I statements, can have a label
prefix.
Although PUT FILE(SYSPRINT) is permitted under CICS, you should generally not
use it in production programs as it will degrade performance.
You can use cataloged procedures to save time and reduce Job Control Language
(JCL) errors. If the statements in a cataloged procedure do not match your
requirements exactly, you can easily modify them or add new statements for the
duration of a job. You should review these procedures and modify them to obtain
the most efficient use of the facilities available and to allow for your own
conventions.
Enterprise PL/I requires a minimum REGION size of 512K. Large programs require
more storage. If you do not specify REGION on the EXEC statement that invokes
the cataloged procedure you are running, the compiler uses the default REGION
If you ccompile your programs with optimization turned on, the REGION size (and
time) required may be much, much larger.
//COLEGO JOB
//STEP1 EXEC IBMZCBG, REGION.PLI=1M
//PLI.SYSIN DD ]
.
.
.
(insert PL/I program to be compiled here)
.
.
.
/]
The OBJECT compile-time option causes the compiler to place the object module,
in a syntax suitable for input to the linkage editor, in the standard data set defined
by the DD statement with the name SYSLIN. This statement defines a temporary
data set named &&LOADSET on a sequential device; if you want to retain the
object module after the end of your job, you must substitute a permanent name for
&&LOADSET (that is, a name that does not start with &&) and specify KEEP in the
appropriate DISP parameter for the last procedure step that used the data set. You
can do this by providing your own SYSLIN DD statement, as shown below. The
data set name and disposition parameters on this statement will override those on
the IBMZC procedure SYSLIN DD statement. In this example, the compile step is
the only step in the job.
//PLICOMP EXEC IBMZC
//PLI.SYSLIN DD DSN=MYPROG,DISP=(MOD,KEEP)
//PLI.SYSIN DD ...
The term MOD in the DISP parameter in Figure 8 on page 89 allows the compiler
to place more than one object module in the data set, and PASS ensures that the
data set is available to a later procedure step providing a corresponding DD
statement is included there.
Input data for the compilation procedure step requires the qualified ddname
PLI.SYSIN. The COND parameter in the EXEC statement BIND specifies that this
procedure step should be bypassed if the return code produced by the compiler is
greater than 8 (that is, if a severe or unrecoverable error occurs during
compilation).
The Program Management binder always places the program objects it creates in
the standard data set defined by the DD statement with the name SYSLMOD. This
statement in the cataloged procedure specifies a new temporary library &&GOSET,
in which the program object will be placed and given the member name GO. In
specifying a temporary library, the cataloged procedure assumes that you will run
the program object in the same job; if you want to retain the program object, you
must substitute your own statement for the DD statement with the name
SYSLMOD.
Input data for the compilation procedure step should be specified in a DD statement
with the name PLI.SYSIN, and for the GO step in a DD statement with the name
GO.SYSIN.
Input data for the compilation procedure step requires the qualified ddname
PLI.SYSIN. The COND parameter in the EXEC statement LKED specifies that this
procedure step should be bypassed if the return code produced by the compiler is
greater than 8 (that is, if a severe or unrecoverable error occurs during
compilation).
The linkage editor always places the load modules it creates in the standard data
set defined by the DD statement with the name SYSLMOD. This statement in the
cataloged procedure specifies a new temporary library &&GOSET, in which the
load module will be placed and given the member name GO. In specifying a
temporary library, the cataloged procedure assumes that you will run the load
module in the same job; if you want to retain the module, you must substitute your
own statement for the DD statement with the name SYSLMOD.
Input data for the compilation procedure step should be specified in a DD statement
with the name PLI.SYSIN, and for the GO step in a DD statement with the name
GO.SYSIN.
The use of the loader imposes certain restrictions on your PL/I program; before
using this cataloged procedure, see OS/390 Language Environment Programming
Guide, which explains how to use the loader.
If you include the parameter MSGLEVEL=1 in your JOB statement, the operating
system will include the original EXEC statement in its listing, and will add the
statements from the cataloged procedure. In the listing, cataloged procedure
statements are identified by XX or X/ as the first two characters; X/ signifies a
statement that was modified for the current invocation of the cataloged procedure.
You might be required to modify the statements of a cataloged procedure for the
duration of the job step in which it is invoked, either by adding DD statements or by
overriding one or more parameters in the EXEC or DD statements. For example,
cataloged procedures that invoke the compiler require the addition of a DD
statement with the name SYSIN to define the data set containing the source
statements. Also, whenever you use more than one standard link-edit procedure
step in a job, you must modify all but the first cataloged procedure that you invoke
if you want to run more than one of the load modules.
If you use the cataloged procedure IBMZCBG twice within the same job to compile,
bind, and run two PL/I programs, and do not name each of the two program objects
that the binder creates, the first program object runs twice, and the second one not
at all.
To assign a membername to the program object, you can use the linkage editor
NAME option with the DSNAME parameter on the SYSLMOD DD statement.
When you use this procedure, the membername must be identical to the name on
the NAME option if the EXEC statement that runs the program refers to the
SYSLMOD DD statement for the name of the module to be run.
Another option is to give each program a different name by using GOPGM on the
EXEC procedure statement. For example:
// EXEC IBMZCBG,GOPGM=GO2
EXEC statement
If a parameter of an EXEC statement that invokes a cataloged procedure has an
unqualified name, the parameter applies to all the EXEC statements in the
cataloged procedure. The effect on the cataloged procedure depends on the
parameters, as follows:
PARM applies to the first procedure step and nullifies any other PARM
parameters.
COND and ACCT apply to all the procedure steps.
TIME and REGION apply to all the procedure steps and override existing
values.
You can nullify all the options specified by a parameter by coding the keyword and
equal sign without a value. For example, to suppress the bulk of the linkage editor
listing when invoking the cataloged procedure IBMZCBG, code:
//stepname EXEC IBMZCBG,PARM.BIND=
DD statement
To add a DD statement to a cataloged procedure, or to modify one or more
parameters of an existing DD statement, you must include a DD statement with the
form procstepname.ddname in the appropriate position in the input stream. If ddname
is the name of a DD statement already present in the procedure step identified by
procstepname, the parameters in the new DD statement override the corresponding
parameters in the existing DD statement; otherwise, the new DD statement is
added to the procedure step. For example, the statement:
//PLI.SYSIN DD ]
Overriding DD statements must appear after the procedure invocation and in the
same order as they appear in the cataloged procedure. Additional DD statements
can appear after the overriding DD statements are specified for that step.
──pli──┬─────────────────────────────────────────┬─────────────────────────────
│ ┌──
─────────────────────┐ ┌──────────────┐ │
└───command_line_option─┴────input_file─┴─┘
command_line_option
You can specify a command_line_option in the following ways:
-qoption
Option flag (usually a single letter preceded by -)
If you choose to specify compile-time options on the command line, the format
differs from either setting them in your source file using %PROCESS
statements. See “Specifying compile-time options under OS/390 UNIX” on
page 102.
input_file
The OS/390 UNIX file specification for your program files. If you omit the
extension from your file specification, the compiler assumes an extension of
.pli. If you omit the complete path, the current directory is assumed.
Input files
The pli command compiles PL/I source files, links the resulting object files with any
object files and libraries specified on the command line in the order indicated, and
produces a single executable file.
Source files—.pli
All .pli files are source files for compilation. The pli command sends source
files to the compiler in the order they are listed. If the compiler cannot find a
specified source file, it produces an error message and the pli command
proceeds to the next file if one exists.
Object files—.o
All .o files are object files. The pli command sends all object files along with
library files to the linkage editor at link-edit time unless you specify the -c option.
After it compiles all the source files, the compiler invokes the linkage editor to
link-edit the resulting object files with any object files specified in the input file
list, and produces a single executable output file.
Library files—.a
The pli command sends all of the library files (.a files) to the linkage editor at
link-edit time.
When you specify options on the command line, they override the default settings
of the option. They are overridden by options set in the source file.
You can specify compile-time options on the command line in three ways:
-qoption_keyword (compiler-specific)
Single and multiletter flags
-q@/u/myopts.txt
-qoption_keyword
You can specify options on the command line using the -qoption format.
──-q──option_keyword──┬─────────────────────────────────┬──────────────────────
│ ┌─:──────────────────────┐ │
└─ = ────┬─suboption──────────┬─┴─┘
└─suboption=argument─┘
You can have multiple -qoptions on the same command line, but they must be
separated by blanks. Option keywords can appear in either uppercase or
lowercase, but you must specify the -q in lowercase.
Some compile-time options allow you to specify suboptions. These suboptions are
indicated on the command line with an equal sign following the -qoption_keyword.
Multiple suboptions must be separated with a colon(:) and no intervening blanks.
The LIMITS option (“LIMITS” on page 24) is slightly more complex since each of its
suboptions also has an argument. You would specify
LIMITS(EXTNAME(31),FIXEDDEC(15)) on the command line as shown in the
following example:
-qlimits=extname=31:fixeddec=15
Some flag options have arguments that form part of the flag, for example:
pli samp.pli -I/home/test3/include
In this case, /home/test3/include is an include directory to be searched for
INCLUDE files.
You can specify flags that do not take arguments in one string:
pli -Ogc samp1.pli
Specifying the flags in one string has the same effect as specifying the same
options separately.
pli -O -g -c samp1.pli
Both examples compile the PL/I source file samp1.pli with optimization (-O) and
produce symbolic information used by the debugger (-g), but do not invoke the
linkage editor (-c).
You can specify one flag option that takes arguments as part of a single string, but
it must be the last option specified. For example, you can use the -I flag (to specify
the name of an include directory to be searched for INCLUDE files) together with
the other flags, only if the -I flag and its argument are specified last:
pli -OgI/home/test3/include
The string of flags in the preceding example is equivalent to the following:
pli -O -g -I/home/test3/include
Table 11. Compile-time option flags supported by Enterprise PL/I under OS/390 UNIX
Option Description
-c Compile only.
-e Create names and entries for a FETCHable load module.
-g Produce symbolic information used by the debugger. This option is equivalent to
-qGN.
-I<dir>* Add path <dir> to the directories to be searched for INCLUDE files. -I must be
followed by a path and only a single path is allowed per -I option. To add
multiple paths, use multiple -I options. There shouldn't be any spaces between
-I and the path name.
-O, -O2 Optimize generated code. This option is equivalent to -qOPT=2.
-q<option>* Pass it to the compiler. <option> is a compile-time option. Each option should
be delimited by a comma and each suboption should be delimited by an equal
sign or colon. There shouldn't be any spaces between -q and <option>.
-v Display compile and link steps and execute them.
-# Display compile and link steps, but do not execute them.
Note: *You must specify an argument where indicated; otherwise, the results are unpredictable.
So-called "batch compilation", whereby one compilation produced more than one
object deck, is not supported.
The following section describes the JCL needed for compilation. The IBM-supplied
cataloged procedures described in “IBM-supplied cataloged procedures” on page
87 contain these statements. You need to code them yourself only if you are not
using the cataloged procedures.
EXEC statement
The basic EXEC statement is:
//stepname EXEC PGM
512K is required for the REGION parameter of this statement.
If you compile your programs with optimization turned on, the REGION size (and
time) required may be much, much larger.
The PARM parameter of the EXEC statement can be used to specify one or more
of the optional facilities provided by the compiler. These facilities are described
under “Specifying options in the EXEC statement” on page 107. See Chapter 1,
“Using compiler options and facilities” on page 3 for a description of the options.
You can store any of the standard data sets on a direct-access device, but you
must include the SPACE parameter in the DD statement. This parameter defines
the data set to specify the amount of auxiliary storage required. The amount of
auxiliary storage allocated in the IBM-supplied cataloged procedures should suffice
for most applications.
Input (SYSIN)
Input to the compiler must be a data set defined by a DD statement with the name
SYSIN. This data set must have CONSECUTIVE organization. The input must be
one or more external PL/I procedures. If you want to compile more than one
external procedure in a single job or job step, precede each procedure, except
possibly the first, with a %PROCESS statement.
80-byte records are commonly used as the input medium for PL/I source programs.
The input data set can be on a direct-access device or some other sequential
media. The input data set can contain either fixed-length records (blocked or
unblocked), variable-length records (coded or uncoded), or undefined-length
records. The maximum record size is 100 bytes.
When data sets are concatenated for input to the compiler, the concatenated data
sets must have similar characteristics (for example, block size and record format).
The object module is always in the form of 80-byte fixed-length records, blocked or
unblocked. If the BLKSIZE is specified for SYSLIN and is something other than 80,
then the LRECL must be specified as 80.
The spill file is used as a logical extension to main storage and is used by the
compiler and by the preprocessor to contain text and dictionary information. The
LRECL and BLKSIZE for SYSUT1 is chosen by the compiler based on the amount
of storage available for spill file pages.
The DD statements given in this publication and in the cataloged procedures for
SYSUT1 request a space allocation in blocks of 1024 bytes. This is to insure that
adequate secondary allocations of direct-access storage space are acquired.
Listing (SYSPRINT)
The compiler generates a listing that includes all the source statements that it
processed, information relating to the object module, and, when necessary,
messages. Most of the information included in the listing is optional, and you can
specify those parts that you require by including the appropriate compile-time
options. The information that can appear, and the associated compile-time options,
are described under “Using the compiler listing” on page 55.
You must define the data set, in which you wish the compiler to store its listing, in a
DD statement with the name SYSPRINT. This data set must have CONSECUTIVE
organization. Although the listing is usually printed, it can be stored on any
sequential or direct-access device. For printed output, the following statement will
suffice if your installation follows the convention that output class A refers to a
printer:
//SYSPRINT DD SYSOUT=A
If the statements are included from a SYSLIB, they must have a form that is similar
to the %INCLUDE statement. For example, they must have the same record
format (fixed, variable, undefined), the same logical record length, and matching left
and right margins.
The BLOCKSIZE of the library must be less than or equal to 32,760 bytes.
An option specified in the PARM parameter overrides the default value, and an
option specified in a %PROCESS statement overrides both that specified in the
PARM parameter and the default value.
Note: When conflicting attributes are specified either explicitly or implicitly by the
specification of other options, the latest implied or explicit option is
accepted. No diagnostic message is issued to indicate that any options are
overridden in this way.
Any option that has quotation marks, for example MARGINI('c'), must have the
quotation marks duplicated. The length of the option list must not exceed 100
characters, including the separating commas. However, many of the options have
an abbreviated syntax that you can use to save space. If you need to continue the
statement onto another line, you must enclose the list of options in parentheses
(instead of in quotation marks) enclose the options list on each line in quotation
marks, and ensure that the last comma on each line except the last line is outside
of the quotation marks. An example covering all the above points is as follows:
//STEP1 EXEC PGM=IBMZPLI,PARM=('AG,A',
// 'C,F(I)',
// 'M,MI(''X''),NEST,STG,X')
If you are using a cataloged procedure, and want to specify options explicitly, you
must include the PARM parameter in the EXEC statement that invokes it, qualifying
the keyword PARM with the name of the procedure step that invokes the compiler.
For example:
//STEP1 EXEC nnnnnnn,PARM.PLI='A,LIST'
The MARGINS option does not apply to options files: the data in column 1 will be
read as part of the options. Also, if the file is F-format, any data after column 72 will
be ignored.
The options in the PROJECT file would have precedence over options in the
GROUP file.
Also, in this case, the LIST option might be turned off by a NOLIST option specified
in either of the options files. To insure that the LIST option is on, you could specify
PARM='+DD:GROUP +DD:PROJECT LIST'
Options files may also be used under USS. For example, in USS, to compile
sample.pli with options from the file /u/pli/group.opt, you would specify
pli -q+/u/pli/group.opt sample.pli
Earlier releases of the compiler used the character '@' as the trigger character that
preceded the options file specification. This character is not part of the invariant
set of ebcdic code points, and for that reason the character '+', which is invariant, is
preferred. However, the '@' character may be still be used as long as it is
specified with the hex value '7C'x.
If your CICS program is a MAIN procedure, you must also compile it with the
SYSTEM(CICS) option. NOEXECOPS is implied with this option and all
parameters passed to the MAIN procedure must be POINTERs. For a description
of the SYSTEM compile-time option, see “SYSTEM” on page 44.
After you compile your PL/I program, the next step is to link and run your program
with test data to verify that it produces the results you expect. When using
Enterprise PL/I we recommend you select the method of linking without the
prelinker (as described in Item 2 above).
Language Environment provides the run-time environment and services you need
to execute your program. For instructions on linking and running PL/I and all other
Language Environment-conforming language programs, refer to OS/390 Language
Environment Programming Guide. For information about migrating your existing
PL/I programs to Language Environment, see Enterprise PL/I for z/OS and OS/390
Compiler and Run-Time Migration Guide.
Link-edit considerations
If you compile with the option RENT or the option LIMITS(EXTNAME(n)) with n > 8,
then you must use the prelinker or use a PDSE for your linker output.
When linking a DLL, you must specify any needed definition side-decks during the
bind step.
You can use the binder in place of the prelinker and linkage-editor, with the
following exceptions:
CICS Prior to CICS 1.3, PDSEs are not supported. From CICS Transaction
Server 1.3 onwards, there is support in CICS for PDSEs. Please refer to the
CICS Transaction Server for OS/390 Release Guide, GC34-5701, where there
are several references to PDSEs, and a list of prerequisite APAR fixes.
MTF MTF does not support PDSEs. If your program targets MTF, you cannot
use the binder.
For instance, if A and B are separately compiled programs and A statically calls B,
then you cannot prelink A and B separately and then later link them together.
Instead. you must link A and B together in one prelink job.
Run-time considerations
You can specify run-time options as parameters passed to the program initialization
routine. You can also specify run-time options in the PLIXOPT variable. It might
also prove beneficial, from a performance standpoint, if you alter your existing
programs by using the PLIXOPT variable to specify your run-time options and
recompiling your programs. For a description of using PLIXOPT, see Language
Environment Programming Guide.
To simplify input/output at the terminal, various conventions have been adopted for
stream files that are assigned to the terminal. Three areas are affected:
1. Formatting of PRINT files
2. The automatic prompting feature
3. Spacing and punctuation rules for input.
Note: No prompting or other facilities are provided for record I/O at the terminal,
so you are strongly advised to use stream I/O for any transmission to or from a
terminal.
Figure 14. Declaration of PLITABS. This declaration gives the standard page size, line size
and tabulating positions
┌─────────────────────────────┐ ─┐
│ │ │
┌─ │ ─────────────────────── │ │
│ │ ─────────────────────── │ │
│ │ ─────────────────────── │ │
│ │ ─────────────────────── │ │
│ │ ─────────────────────── │ │
│ │ ─────────────────────── │ │
PAGESIZE ─┤ │ ─────────────────────── │ ├─ PAGELENGTH
│ │ ─────────────────────── │ │
│ │ ─────────────────────── │ │
│ │ ─────────────────────── │ │
│ │ ─────────────────────── │ │
│ │ ─────────────────────── │ │
└─ │ ─────────────────────── │ │
│ │ │
│ ──────────19 │ │
└─────────────────────────────┘ ─┘
Figure 15. PAGELENGTH and PAGESIZE. PAGELENGTH defines the size of your paper,
PAGESIZE the number of lines in the main printing area.
Automatic prompting
When the program requires input from a file that is associated with a terminal, it
issues a prompt. This takes the form of printing a colon on the next line and then
skipping to column 1 on the line following the colon. This gives you a full line to
enter your input, as follows:
:
(space for entry of your data)
This type of prompt is referred to as a primary prompt.
This rule also applies when entering character-string data. Therefore, a character
string must transmit as one logical line. Otherwise, commas are placed at the
break points. For example, if you enter:
:'COMMAS SHOULD NOT BREAK
+:UP A CLAUSE.'
the resulting string is: “COMMAS SHOULD NOT BREAK, UP A CLAUSE.” The
comma is not added if a hyphen was used as a line continuation character.
Automatic padding for GET EDIT: For a GET EDIT statement, there is no need
to enter blanks at the end of the line. The data will be padded to the specified
length. Thus, for the PL/I statement:
GET EDIT (NAME) (A(15));
Use of SKIP for terminal input: All uses of SKIP for input are interpreted as
SKIP(1) when the file is allocated to the terminal. SKIP(1) is treated as an
instruction to ignore all unused data on the currently available logical line.
ENDFILE
The end-of-file can be entered at the terminal by keying in a logical line that
consists of the two characters “/*”. Any further attempts to use the file without
closing it result in the ENDFILE condition being raised.
SYSPRINT considerations
The PL/I standard SYSPRINT file is shared by multiple enclaves within an
application. You can issue I/O requests, for example STREAM PUT, from the
same or different enclaves. These requests are handled using the standard PL/I
SYSPRINT file as a file which is common to the entire application. The SYSPRINT
file is implicitly closed only when the application terminates, not at the termination
of the enclave.
The standard PL/I SYSPRINT file contains user-initiated output only, such as
STREAM PUTs. Run-time library messages and other similar diagnostic output are
directed to the Language Environment MSGFILE. See the OS/390 V2R10
Language Environment Programming Guide for details on redirecting SYSPRINT
file output to the Language Environment MSGFILE.
There exists only one standard PL/I SYSPRINT FILE within an application and this
file is shared by all enclaves within the application. For example, the SYSPRINT
file can be shared by multiple nested enclaves within an application or by a series
of enclaves that are created and terminated within an application by the Language
Environment preinitialization function. To be shared by an enclave within an
application, the PL/I SYSPRINT file must be declared in that enclave. The
standard SYSPRINT file cannot be shared by passing it as a file argument between
enclaves. The declared attributes of the standard SYSPRINT file should be the
same throughout the application, as with any EXTERNALly declared constant. PL/I
does not enforce this rule. Both the TITLE option and the MSGFILE(SYSPRINT)
option attempt to route SYSPRINT to another data set. As such, if the two options
were used together, there will be a conflict and the TITLE option will be ignored.
The SYSPRINT file is opened (implicitly or explicitly) when first referenced within an
enclave of the application. When the SYSPRINT file is CLOSEd, the file resources
are released (as though the file had never been opened) and all enclaves are
updated to reflect the closed status.
When opened, the TITLE option can be used to associate the standard SYSPRINT
file with different operating system data sets. This association is retained across
enclaves for the duration of the open.
PL/I condition handling associated with the standard PL/I SYSPRINT file retains its
current semantics and scope. For example, an ENDPAGE condition raised within a
child enclave will only invoke an established ON-unit within that child enclave. It
does not cause invocation of an ON-unit within the parent enclave.
The tabs for the standard PL/I SYSPRINT file can vary when PUTs are done from
different enclaves, if the enclaves contain a user PLITABS table.
If the PL/I SYSPRINT file is utilized as a RECORD file or as a STREAM INPUT file,
PL/I supports it at an individual enclave or task level, but not as a shareble file
among enclaves. If the PL/I SYSPRINT file is open at the same time with different
file attributes (e.g. RECORD and STREAM) in different enclaves of the same
application, results are unpredictable.
First note that the compiler user exit must be compiled with the RENT option since
the compiler expects it to be a DLL.
In accordance with Item 1 above, the DECLARE in the compiler for this routine
looks like:
dcl ibmuexit ext entry( pointer byvalue, pointer byvalue );
In accordance with Item 2 above, the PROCEDURE statement for this routine looks
like:
ibmuexit:
proc ( addr_Userexit_Interface_Block,
addr_Request_Area )
options( fetchable );
In accordance with Item 3 above, the linker option DYNAM=DLL must be specified
when linking the user exit into a DLL. The DLL must be linked either into a PDSE
or into a temporary dataset (in which case DSNTYPE=LIBRARY must be specified
on the SYSLMOD DD statement).
All the JCL to compile, link, and invoke the user exit is given in the JCL below in
Figure 16 on page 116. The one significant difference between the sample below
and the code excerpts above is that, in the code below, the FETCHed user exit
does not receive two BYVALUE pointers to structures, but instead it receives the
two structures BYADDR. In order to make this change work, the code specifies
OPTIONS(NODESCRIPTOR) on each of its PROCEDURE statements.
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/] ]/
/] NAME - IBMUEXIT.PLI ]/
/] ]/
/] DESCRIPTION ]/
/] User-exit sample program. ]/
/] ]/
/] Licensed Materials - Property of IBM ]/
/] 5639-A83, 5639-A24 (C) Copyright IBM Corp. 1992,2KK1. ]/
/] All Rights Reserved. ]/
/] US Government Users Restricted Rights-- Use, duplication or ]/
/] disclosure restricted by GSA ADP Schedule Contract with ]/
/] IBM Corp. ]/
/] ]/
/] DISCLAIMER OF WARRANTIES ]/
/] The following "enclosed" code is sample code created by IBM ]/
/] Corporation. This sample code is not part of any standard ]/
/] IBM product and is provided to you solely for the purpose of ]/
/] assisting you in the development of your applications. The ]/
/] code is provided "AS IS", without warranty of any kind. ]/
/] IBM shall not be liable for any damages arising out of your ]/
/] use of the sample code, even if IBM has been advised of the ]/
/] possibility of such damages. ]/
/] ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/] ]/
/] During initialization, IBMUEXIT is called. It reads ]/
/] information about the messages being screened from a text ]/
/] file and stores the information in a hash table. IBMUEXIT ]/
/] also sets up the entry points for the message filter service ]/
/] and termination service. ]/
/] ]/
/] For each message generated by the compiler, the compiler ]/
/] calls the message filter registered by IBMUEXIT. The filter ]/
/] looks the message up in the hash table previously created. ]/
/] ]/
/] The termination service is called at the end of the compile ]/
/] but does nothing. It could be enhanced to generates reports ]/
/] or do other cleanup work. ]/
/] ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
Figure 16 (Part 1 of 7). Sample JCL to compile, link, and invoke the user exit
Dcl
1 Uex_UIB native Based( null() ),
2 Uex_UIB_Length fixed bin(31),
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/] ]/
/] Request Area for Initialization exit ]/
/] ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/] ]/
/] Request Area for Message_Filter exit ]/
/] ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/] ]/
/] Request Area for Terminate exit ]/
/] ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
Figure 16 (Part 2 of 7). Sample JCL to compile, link, and invoke the user exit
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/] ]/
/] Return Codes ]/
/] ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/] ]/
/] Reason Codes ]/
/] ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
ibmuexit:
proc ( ue, ia )
options( fetchable nodescriptor);
ue.uex_Uib_Message_Filter = message_Filter;
ue.uex_Uib_Termination = exitterm;
end;
Figure 16 (Part 3 of 7). Sample JCL to compile, link, and invoke the user exit
ue.uex_Uib_Message_Filter = message_Filter;
ue.uex_Uib_Termination = exitterm;
on undefinedfile(sysuexit)
begin;
put edit (']] User exit unable to open exit file ')
(A) skip;
put skip;
signal error;
end;
if ue.uex_Uib_User_Char_Len = K then
do;
open file(sysuexit);
end;
else
do;
title_Str
= substr( ue.uex_Uib_User_Char_Str->based_Chars,
1, ue.uex_Uib_User_Char_Len );
open file(sysuexit) title(title_Str);
end;
on error, endfile(sysuexit)
goto done;
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/] ]/
/] Skip header lines and read first data line ]/
/] ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
Figure 16 (Part 4 of 7). Sample JCL to compile, link, and invoke the user exit
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/] ]/
/] Put message information in hash table ]/
/] ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/] ]/
/] Read next data line ]/
/] ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
end;
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/] ]/
/] Clean up ]/
/] ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
done:
free p->message_Item;
close file(sysuexit);
end;
dcl p pointer;
dcl bucket fixed bin(15);
ue.uex_Uib_Reason_Code = uex_Reason_Output;
ue.uex_Uib_Return_Code = K;
mf.uex_Mfa_New_Severity = mf.uex_Mfa_Severity;
Figure 16 (Part 5 of 7). Sample JCL to compile, link, and invoke the user exit
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/] ]/
/] Search bucket for error message ]/
/] ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
if p = null() then;
else
do;
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/] ]/
/] Filter error based on information in has table ]/
/] ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
ue.uex_Uib_Reason_Code = p->reason;
if p->newsev < K then;
else
mf.uex_Mfa_New_Severity = p->newsev;
end;
end;
ue.uex_Uib_return_Code = K;
ue.uex_Uib_reason_Code = K;
end;
end pack;
Figure 16 (Part 6 of 7). Sample JCL to compile, link, and invoke the user exit
Figure 16 (Part 7 of 7). Sample JCL to compile, link, and invoke the user exit
However, under USS, if you compile a MAIN program with the SYSTEM(OS)
option, the program will be passed 7 parameters as specified in the USS manuals.
These 7 parameters include:
the argument count (which includes the name of the executable as the first
"argument"
the address of an array of addresses of the lengths of the arguments
the address of an array of addresses of the arguments as null-terminated
character strings
the count of environment variables set
the address of an array of addresses of the lengths of the environment
variables
the address of an array of addresses of the environment variables as
null-terminated character strings
The program in Figure 17 uses the SYSTEM(OS) interface to address and display
the individual arguments and environment variables.
sayargs:
proc(argc, pArgLen, pArgStr, envc, pEnvLen, pEnvStr, pParmSelf)
options( main, noexecops );
end;
Figure 17. Sample program to display USS args and environment variables
Your PL/I program recognizes and processes information in a data set by using a
symbolic or logical representation of the data set called a file. This chapter
describes how to associate data sets with the files known within your program. It
introduces the five major types of data sets, how they are organized and accessed,
and some of the file and data set characteristics you need to know how to specify.
Note: INDEXED is supported only under batch.
The operating system needs a way to recognize which physical data set is referred
to by your program, so you must write a data definition or DD statement, external to
your program, that associates the PL/I file name with a dsname. For example, if
you have the following file declaration in your program:
DCL STOCK FILE STREAM INPUT;
you should create a DD statement with a data definition name (ddname) that
matches the name of the PL/I file. The DD statement specifies a physical data set
name (dsname) and gives its characteristics:
//GO.STOCK DD DSN=PARTS.INSTOCK, . . .
You'll find some guidance in writing DD statements in this manual, but for more
detail refer to the job control language (JCL) manuals for your system.
There is more than one way to associate a data set with a PL/I file. You associate
a data set with a PL/I file by ensuring that the ddname of the DD statement that
defines the data set is the same as one of the following:
The declared PL/I file name
The character-string value of the expression specified in the TITLE option of
the associated OPEN statement.
You must choose your PL/I file names so that the corresponding ddnames conform
to the following restrictions:
If a file is opened implicitly, or if no TITLE option is included in the OPEN
statement that explicitly opens the file, the ddname defaults to the file name. If
the file name is longer than 8 characters, the default ddname is composed of
the first 8 characters of the file name.
The character set of the JCL does not contain the break character (_).
Consequently, this character cannot appear in ddnames. Do not use break
Since external names are limited to 7 characters, an external file name of more
than 7 characters is shortened into a concatenation of the first 4 and the last 3
characters of the file name. Such a shortened name is not, however, the name
used as the ddname in the associated DD statement.
When statement number 1 is run, the file name MASTER is taken to be the same
as the ddname of a DD statement in the current job step. When statement number
2 is run, the name OLDMASTE is taken to be the same as the ddname of a DD
statement in the current job step. (The first 8 characters of a file name form the
ddname. If OLDMASTER is an external name, it will be shortened by the compiler
to OLDMTER for use within the program.) If statement number 3 causes implicit
opening of the file DETAIL, the name DETAIL is taken to be the same as the
ddname of a DD statement in the current job step.
In each of the above cases, a corresponding DD statement must appear in the job
stream; otherwise, the UNDEFINEDFILE condition is raised. The three DD
statements could start as follows:
1. //MASTER DD ...
2. //OLDMASTE DD ...
3. //DETAIL DD ...
If the file reference in the statement which explicitly or implicitly opens the file is not
a file constant, the DD statement name must be the same as the value of the file
reference. The following example illustrates how a DD statement should be
associated with the value of a file variable:
DCL PRICES FILE VARIABLE,
RPRICE FILE;
PRICES = RPRICE;
OPEN FILE(PRICES);
The DD statement should associate the data set with the file constant RPRICE,
which is the value of the file variable PRICES, thus:
//RPRICE DD DSNAME=...
Use of a file variable also allows you to manipulate a number of files at various
times by a single statement. For example:
The READ statement reads the three files A, B, and C, each of which can be
associated with a different data set. The files A, B, and C remain open after the
READ statement is executed in each instance.
In this example, when MASTER is opened during the first iteration of the do-group,
the associated ddname is taken to be MASTER1A. After processing, the file is
closed, dissociating the file name and the ddname. During the second iteration of
the do-group, MASTER is opened again. This time, MASTER is associated with
the ddname MASTER1B. Similarly, during the final iteration of the do-group,
MASTER is associated with the ddname MASTER1C.
When read from a PL/I program, the concatenated data sets need not be on the
same volume. You cannot process concatenated data sets backward.
For example, to access the HFS file /u/USER/sample.txt via the DD HFS, you
would code the DD statement as follows:
//HFS DD PATH='/u/USER/sample.txt',PATHOPTS=ORDONLY,DSNTYPE=HFS
To access the same file by using the TITLE option of the OPEN statement, you
would code:
OPEN FILE(HFS) TITLE('//u/USER/sample.txt');
Note the two forward slashes in the TITLE option: the first indicates that what
follows is a file name (rather than a DD name), and the second is the start of the
fully qualified HFS file name (and fully qualified names have to be used when HFS
files are referenced under batch since there is no "current directory" that could be
used to complete a file specification).
PL/I needs a way to recognize the data set(s) to which the PL/I files in your
program refer, so you must provide an identification of the data set to be used, or
allow PL/I to use a default identification.
You can identify the data set explicitly using either an environment variable or the
TITLE option of the OPEN statement.
These environment variable names have the form DD_DDNAME where the
DDNAME is the name of a PL/I file constant (or an alternate DDNAME, as defined
below). For example:
declare MyFile stream output;
export DD_MYFILE=/datapath/mydata.dat
If you are familiar with the IBM mainframe environment, you can think of the
environment variable much like you do the:
DD statement in OS/390
ALLOCATE statement in TSO
For more about the syntax and options you can use with the DD_DDNAME
environment variable, see “Specifying characteristics using DD_DDNAME
environment variables” on page 133.
──TITLE──(──expression──)──────────────────────────────────────────────
The expression must yield a character string with the following syntax:
──┬─alternate_ddname────────────────┬──────────────────────────────────
│ ┌──
──────────────────┐ │
┬────────────────┬┴──┘
└─/filespec──
└──,──dd_option──┘
alternate_ddname
The name of an alternate DD_DDNAME environment variable. An alternate
DD_DDNAME environment variable is one not named after a file constant. For
example, if you had a file named INVENTRY in your program, and you
filespec
Any valid file specification on the system you are using.
dd_option
One or more options allowed in a DD_DDNAME environment variable.
For more about options of the DD_DDNAME environment variable, see “Specifying
characteristics using DD_DDNAME environment variables.”
With this form, PL/I obtains all DD information either from the TITLE expression or
from the ENVIRONMENT attribute of a file declaration - a DD_DDNAME
environment variable is not referenced.
──DD_DDNAME=filespec──
└──,──option──┘
Blanks are acceptable within the syntax. In addition, the syntax of the statement is
not checked at the time the command is entered. It is verified when the data set is
opened. If the syntax is wrong, UNDEFINEDFILE is raised with the oncode 96.
DD_DDNAME
Specifies the name of the environment variable. The DDNAME must be in
upper case and can be either the name of a file constant or an alternate
DDNAME that you specify in the TITLE option of your OPEN statement. The
TITLE option is described in “Using the TITLE option of the OPEN statement”
on page 132.
If you use an alternate DDNAME, and it is longer than 31 characters, only the
first 31 characters are used in forming the environment variable name.
filespec
Specifies a file or the name of a device to be associated with the PL/I file.
option
The options you can specify as DD information.
The options that you can specify as DD information are described in the pages that
follow, beginning with “APPEND” and ending with “TYPE” on page 138.
APPEND
The APPEND option specifies whether an existing data set is to be extended or
recreated.
┌─Y─┐
──APPEND──(──┴─N─┴──)──────────────────────────────────────────────────────────
Y Specifies that new records are to be added to the end of a sequential data set,
or inserted in a relative or indexed data set.
The APPEND option applies only to OUTPUT files. APPEND is ignored if:
The file does not exist
The file does not have the OUTPUT attribute
The organization is REGIONAL(1)
ASA
The ASA option applies to printer-destined files. This option specifies when the
ANS control character in each record is to be interpreted.
┌─N─┐
──ASA──(──┴─Y─┴──)─────────────────────────────────────────────────────────────
N Specifies that the ANS print control characters are to be translated to IBM
Proprinter control characters as records are written to the data set.
Y Specifies that the ANS print control characters are not to be translated; instead
they are to be left as is for subsequent translation by a process you determine.
BUFSIZE
The BUFSIZE option specifies the number of bytes for a buffer.
──BUFSIZE──(──n──)─────────────────────────────────────────────────────────────
RECORD output is buffered by default and has a default value for BUFSIZE of 64k.
STREAM output is buffered, but not by default, and has a default value for
BUFSIZE of zero.
If the value of zero is given to BUFSIZE, the number of bytes for buffering is equal
to the value specified in the RECSIZE or LRECL option.
The BUFSIZE option is valid only for a consecutive binary file. If the file is used for
terminal input, you should assign the value of zero to BUFSIZE for increased
efficiency.
┌─ASIS───┐
──CHARSET──(──┼─EBCDIC─┼──)────────────────────────────────────────────────────
└─ASCII──┘
Choose a suboption of CHARSET based on what form the file has (input) or what
form you want the file have (output).
┌─EBCDIC─┐
──CHARSET──(──┴─ASCII──┴──)────────────────────────────────────────────────────
Choose a suboption of CHARSET based on what form the file has (input) or what
form you want the file to have (output).
DELAY
The DELAY option specifies the number of milliseconds to delay before retrying an
operation that fails when a file or record lock cannot be obtained by the system.
┌─#─┐
──DELAY──(──┴─n─┴──)───────────────────────────────────────────────────────────
DELIMIT
The DELIMIT option specifies whether the input file contains field delimiters or not.
A field delimiter is a blank or a user-defined character that separates the fields in a
record. This is applicable for sort input files only.
┌─N─┐
──DELIMIT──(──┴─Y─┴──)─────────────────────────────────────────────────────────
The sort utility distinguishes text files from binary files with the presence of field
delimiters. Input files that contain field delimiters are processed as text files;
otherwise, they are considered to be binary files. The library needs this information
in order to pass the correct parameters to the sort utility.
LRECL
The LRECL option is the same as the RECSIZE option.
──LRECL──(──n──)───────────────────────────────────────────────────────────────
If LRECL is not specified and not implied by a LINESIZE value (except for
TYPE(FIXED) files, the default is 1024.
LRMSKIP
The LRMSKIP option allows output to commence on the nth (n refers to the value
specified with the SKIP option of the PUT or GET statement) line of the first page
for the first SKIP format item to be executed after a file is opened.
┌─N─┐
──LRMSKIP──(──┴─Y─┴──)─────────────────────────────────────────────────────────
PROMPT
The PROMPT option specifies whether or not colons should be visible as prompts
for stream input from the terminal.
┌─N─┐
──PROMPT──(──┴─Y─┴──)──────────────────────────────────────────────────────────
PUTPAGE
The PUTPAGE option specifies whether or not the form feed character should be
followed by a carriage return character. This option applies only to printer-destined
files. Printer-destined files are stream output files declared with the PRINT
attribute, or record output files declared with the CTLASA environment option.
┌─NOCR─┐
──PUTPAGE──(──┴─CR───┴──)──────────────────────────────────────────────────────
NOCR
Indicates that the form feed character ('0C'x) is not followed by a carriage
return character ('0D'x).
CR
Indicates that the carriage return character is appended to the form feed
character. This option should be specified if output is sent to non-IBM printers.
RECCOUNT
The RECCOUNT option specifies the maximum number of records that can be
loaded into a relative or regional data set that is created during the PL/I file opening
process.
──RECCOUNT──(──n──)────────────────────────────────────────────────────────────
The RECCOUNT option is ignored if PL/I does not create, or recreate, the data set.
RECSIZE
The RECSIZE option specifies the length, n, of records in the data set.
┌─512─┐
──RECSIZE──(──┴─n───┴──)───────────────────────────────────────────────────────
For regional and fixed-length data sets, RECSIZE specifies the length of each
record in the data set; for all other data set types, RECSIZE specifies the maximum
length records may have.
SAMELINE
The SAMELINE option specifies whether the system prompt occurs on the same
line as the statement that prompts for input.
┌─N─┐
──SAMELINE──(──┴─Y─┴──)────────────────────────────────────────────────────────
The following examples show the results of certain combinations of the PROMPT
and SAMELINE options:
Example 1
Given the statement PUT SKIP LIST('ENTER:');, output is as follows:
Example 2
Given the statement PUT SKIP LIST('ENTER');, output is as follows:
SKIP0
The SKIP0 option specifies where the line cursor moves when SKIP(0) statement is
coded in the source program. SKIP0 applies to terminal files that are not linked as
PM applications.
┌─N─┐
──SKIPK──(──┴─Y─┴──)───────────────────────────────────────────────────────────
SKIP0(N)
Specifies that the cursor is to be moved to the beginning of the next line.
SKIP0(Y)
Specifies that the cursor to be moved to the beginning of the current line.
The following example shows how you could make the output to the terminal skip
zero lines so that the cursor moves to the beginning of the current output line:
export DD_SYSPRINT='stdout:,SKIPK(Y)'
TYPE
The TYPE option specifies the format of records in a native file.
┌─LF──────┐
──TYPE──(──┼─CRLF────┼──)──────────────────────────────────────────────────────
├─TEXT────┤
├─FIXED───┤
├─CRLFEOF─┤
└─U───────┘
CRLF
Specifies that records are delimited by the CR - LF character combination.
('CR' and 'LF' represent the ASCII values of carriage return and line feed,
'0D'x and '0A'x, respectively. For an output file, PL/I places the characters at
the end of each record; for an input file, PL/I discards the characters. For both
input and output, the characters are not counted in consideration for RECSIZE.
The data set must not contain any record that is longer than the value
determined for the record length of the data set.
TEXT
Equivalent to LF.
FIXED
Specifies that each record in the data set has the same length. The length
determined for records in the data set is used to recognize record boundaries.
All characters in a TYPE(FIXED) file are considered as data, including control
characters if they exist. Make sure the record length you specify reflects the
CRLFEOF
Except for output files, this suboption specifies the same information as CRLF.
When one of these files is closed for output, an end-of-file marker is appended
to the last record.
The TYPE option applies only to CONSECUTIVE files, except that it is ignored for
printer-destined files with ASA(N) applied.
If your program attempts to access an existing data set with TYPE(FIXED) in effect
and the length of the data set is not a multiple of the logical record length you
specify, PL/I raises the UNDEFINEDFILE condition.
When using nonprint files with the TYPE(FIXED) attribute, SKIP is replaced by
trailing blanks to the end of the line. If TYPE(LF) is being used, SKIP is replaced
by LF with no trailing blanks.
You do not always need to describe your data both within the program and outside
it; often one description will serve for both data sets and their associated PL/I files.
There are, in fact, advantages to describing your data's characteristics in only one
place. These are described later in this chapter and in following chapters.
To effectively describe your program data and the data sets you will be using, you
need to understand something of how the operating system moves and stores data.
A block is the unit of data transmitted to and from a data set. Each block contains
one record, part of a record, or several records. You can specify the block size in
the BLKSIZE parameter of the DD statement or in the BLKSIZE option of the
ENVIRONMENT attribute.
A record is the unit of data transmitted to and from a program. You can specify the
record length in the LRECL parameter of the DD statement, in the TITLE option of
the OPEN statement, or in the RECSIZE option of the ENVIRONMENT attribute.
Each character in the ASCII code is represented by a 7-bit pattern and there are
128 such patterns. The ASCII set includes a substitute character (the SUB control
character) that is used to represent EBCDIC characters having no valid ASCII
code. The ASCII substitute character is translated to the EBCDIC SUB character,
which has the bit pattern 00111111.
Record formats
The records in a data set have one of the following formats:
Fixed-length
Variable-length
Undefined-length.
Records can be blocked if required. The operating system will deblock fixed-length
and variable-length records, but you must provide code in your program to deblock
undefined-length records.
You specify the record format in the RECFM parameter of the DD statement, in the
TITLE option of the OPEN statement, or as an option of the ENVIRONMENT
attribute.
Fixed-length records
You can specify the following formats for fixed-length records:
F Fixed-length, unblocked
FB Fixed-length, blocked
FS Fixed-length, unblocked, standard
FBS Fixed-length, blocked, standard.
In a data set with fixed-length records, as shown in Figure 18 on page 141, all
records have the same length. If the records are blocked, each block usually
contains an equal number of fixed-length records (although a block can be
truncated). If the records are unblocked, each record constitutes a block.
┌───────────Block──────────┐
┌────────┬────────┬────────┐ ┌────────┬────────┬────────┐
│ Record │ Record │ Record │ IBG │ Record │ Record │ Record │ ...
└────────┴────────┴────────┘ └────────┴────────┴────────┘
Variable-length records
You can specify the following formats for variable-length records:
V Variable-length, unblocked
VB Variable-length, blocked
VS Variable-length, unblocked, spanned
VBS Variable-length, blocked, spanned
VS-format is similar to V-format. Each block contains only one record or segment of
a record. The first 4 bytes of the block contain block control information, and the
next 4 contain record or segment control information (including an indication of
whether the record is complete or is a first, intermediate, or last segment).
VBS-format differs from VS-format in that each block contains as many complete
records or segments as it can accommodate; each block is, therefore,
approximately the same size (although there can be a variation of up to 4 bytes,
since each segment must contain at least 1 byte of data).
PL/I also provides support for three types of VSAM data organization: ESDS,
KSDS, and RRDS. For more information about VSAM data sets, see Chapter 10,
“Defining and using VSAM data sets” on page 197.
A direct (or REGIONAL) data set must reside on a direct-access volume. The data
set is divided into regions, each of which contains one or more records. A key that
specifies the region number allows direct-access to any record; sequential
processing is also possible.
1 Do not confuse the terms “sequential” and “direct” with the PL/I file attributes SEQUENTIAL and DIRECT. The attributes refer to
how the file is to be processed, and not to the way the corresponding data set is organized.
IBM standard labels have two parts: the initial volume label and header labels.
The initial volume label identifies a volume and its owner; the header labels
precede and follow each data set on the volume. Header labels contain system
information, device-dependent information (for example, recording technique), and
data-set characteristics.
Your OS/390 JCL User's Guide describes the syntax of job control statements.
The operand field of the DD statement can contain keyword parameters that
describe the location of the data set (for example, volume serial number and
identification of the unit on which the volume will be mounted) and the attributes of
the data itself (for example, record format).
The DD statement enables you to write PL/I source programs that are independent
of the data sets and input/output devices they will use. You can modify the
parameters of a data set or process different data sets without recompiling your
program.
You can specify BLKSIZE, LRECL, KEYLEN, and RECFM (or their equivalents) in
the ENVIRONMENT attribute of a file declaration in your PL/I program instead of in
the DCB parameter.
You cannot use the DCB parameter to override information already established for
the data set in your PL/I program (by the file attributes declared and the other
attributes that are implied by them). DCB subparameters that attempt to change
information already supplied are ignored.
──TITLE──(──expression──)──────────────────────────────────────────────────────
The expression must yield a character string with the following syntax:
──┬─alternate_ddname────────────────────┬──────────────────────────────────────
│ ┌──
─────────────────────────────────┐ │
└───/filespec──┬───┬──┬───────────┬─┴─┘
└─,─┘ └─dd_option─┘
alternate_ddname
The name of an alternate DD_DDNAME environment variable. An alternate
DD_DDNAME environment variable is one not named after a file constant.
For example, if you had a file named INVENTRY in your program, and you
filespec
Any valid OS/390 UNIX or OS/390 PDS file specification.
dd_option
One or more options allowed in a DD_DDNAME environment variable.
For more information about options of the DD_DDNAME variable, see “Specifying
characteristics using DD_DDNAME environment variables” on page 133.
Subroutines of the PL/I library create a skeleton data control block for the data set.
They use the file attributes from the DECLARE and OPEN statements and any
attributes implied by the declared attributes, to complete the data control block as
far as possible. (See Figure 19 on page 146.) They then issue an OPEN macro
instruction, which calls the data management routines to check that the correct
volume is mounted and to complete the data control block.
The data management routines examine the data control block to see what
information is still needed and then look for this information, first in the DD
statement, and finally, if the data set exists and has standard labels, in the data set
labels. For new data sets, the data management routines begin to create the
labels (if they are required) and to fill them with information from the data control
block.
Neither the DD statement nor the data set label can override information provided
by the PL/I program; nor can the data set label override information provided by the
DD statement.
When the DCB fields are filled in from these sources, control returns to the PL/I
library subroutines. If any fields still are not filled in, the PL/I OPEN subroutine
provides default information for some of them. For example, if LRECL is not
specified, it is provided from the value given for BLKSIZE.
Note: Information from the PL/I program overrides that from the DD statement and the data set label.
Information from the DD statement overrides that from the data set label.
Closing a file: The execution of a PL/I CLOSE statement dissociates a file from
the data set with which it was associated. The PL/I library subroutines first issue a
CLOSE macro instruction and, when control returns from the data management
routines, release the data control block that was created when the file was opened.
The data management routines complete the writing of labels for new data sets and
update the labels of existing data sets.
──ENVIRONMENT──(──option-list──)───────────────────────────────────────────────
Abbreviation: ENV
You can specify the options in any order, separated by blanks or commas.
The following example illustrates the syntax of the ENVIRONMENT attribute in the
context of a complete file declaration (the options specified are for VSAM and are
discussed in Chapter 10, “Defining and using VSAM data sets” on page 197).
Notes:
1. A file with the INPUT attribute cannot have the PRINT attribute.
2. Keyed is required for INDEXED and REGIONAL output.
Data set organization options: The options that specify data set organization
are:
──┬─CONSECUTIVE───────┬────────────────────────────────────────────────────────
├─INDEXED───────────┤
├─REGIONAL──(──1──)─┤
└─VSAM──────────────┘
Each option is described in the discussion of the data set organization to which it
applies.
Other ENVIRONMENT options: You can use a constant or variable with those
ENVIRONMENT options that require integer arguments, such as block sizes and
record lengths. The variable must not be subscripted or qualified, and must have
attributes FIXED BINARY(31,0) and STATIC.
The list of equivalents for ENVIRONMENT options and DCB parameters are:
ENVIRONMENT option DCB subparameter
──┬─F───┬──────────────────────────────────────────────────────────────────────
├─FS──┤
├─FB──┤
├─FBS─┤
├─V───┤
├─VS──┤
├─VB──┤
├─VBS─┤
└─U───┘
Fixed-length F unblocked
FB blocked
FS unblocked, standard
FBS blocked, standard
Variable-length V unblocked
VB blocked
VS spanned
VBS blocked, spanned
Undefined-length U (cannot be blocked)
When U-format records are read into a varying-length string, PL/I sets the length of
the string to the block length of the retrieved data.
These record format options do not apply to VSAM data sets. If you specify a
record format option for a file associated with a VSAM data set, the option is
ignored.
You can only specify VS-format records for data sets with consecutive organization.
──RECSIZE──(──record-length──)─────────────────────────────────────────────────
For files associated with VSAM data sets, record-length is the sum of:
1. The length required for data. For variable-length and undefined-length records,
this is the maximum length.
2. Any control bytes required. Variable-length records require 4 (for the
record-length prefix); fixed-length and undefined-length records do not require
any.
For VSAM data sets, the maximum and average lengths of the records are
specified to the Access Method Services utility when the data set is defined. If you
include the RECSIZE option in the file declaration for checking purposes, you
should specify the maximum record size. If you specify RECSIZE and it conflicts
with the values defined for the data set, the UNDEFINEDFILE condition is raised.
BLKSIZE option: The BLKSIZE option specifies the maximum block size on the
data set.
──BLKSIZE──(──block-size──)────────────────────────────────────────────────────
The relationship of block size to record length depends on the record format:
FB-format or FBS-format
The block size must be a multiple of the record length.
VB-format:
The block size must be equal to or greater than the sum of:
VS-format or VBS-format:
The block size can be less than, equal to, or greater than the record length.
1. The maximum length of any record
2. Four control bytes.
Notes:
Use the BLKSIZE option with unblocked (F- or V-format) records in either of the
following ways:
Record format, BLKSIZE, and RECSIZE defaults: If you do not specify either
the record format, block size, or record length for a non-VSAM data set, the
following default action is taken:
Record format:
A search is made in the associated DD statement or data set label. If the
search does not provide a value, the UNDEFINEDFILE condition is raised,
except for files associated with dummy data sets or the foreground terminal, in
which case the record format is set to U.
Block size or record length:
If one of these is specified, a search is made for the other in the associated
DD statement or data set label. If the search provides a value, and if this
value is incompatible with the value in the specified option, the
UNDEFINEDFILE condition is raised. If the search is unsuccessful, a value is
derived from the specified option (with the addition or subtraction of any control
or prefix bytes).
If neither is specified, the UNDEFINEDFILE condition is raised, except for files
associated with dummy data sets, in which case BLKSIZE is set to 121 for
F-format or U-format records and to 129 for V-format records. For files
associated with the foreground terminal, RECSIZE is set to 120.
If you are using OS/390 with the Data Facility Product system-determined
block size, DFP determines the optimum block size for the device type
assigned. If you specify BLKSIZE(0) in either the DD assignment or the
ENVIRONMENT statement, DFP calculates BLKSIZE using the record length,
record format, and device type.
──GENKEY───────────────────────────────────────────────────────────────────────
A generic key is a character string that identifies a class of keys; all keys that begin
with the string are members of that class. For example, the recorded keys “ABCD”,
“ABCE”, and “ABDF” are all members of the classes identified by the generic keys
“A” and “AB”, and the first two are also members of the class “ABC”; and the three
recorded keys can be considered to be unique members of the classes “ABCD”,
“ABCE”, and “ABDF”, respectively.
Although you can retrieve the first record having a key in a particular class by using
a READ with the KEY option, you cannot obtain the actual key unless the records
have embedded keys, since the KEYTO option cannot be used in the same
statement as the KEY option.
The first READ statement causes the first nondummy record in the data set whose
key begins with “ABC” to be read into INFIELD; each time the second READ
statement is executed, the nondummy record with the next higher key is retrieved.
Repeated execution of the second READ statement could result in reading records
from higher key classes, since no indication is given when the end of a key class is
reached. It is your responsibility to check each key if you do not wish to read
beyond the key class. Any subsequent execution of the first READ statement
would reposition the file to the first record of the key class “ABC”.
If the data set contains no records with keys in the specified class, or if all the
records with keys in the specified class are dummy records, the KEY condition is
raised. The data set is then positioned either at the next record that has a higher
key or at the end of the file.
The presence or absence of the GENKEY option affects the execution of a READ
statement which supplies a source key that is shorter than the key length specified
in the KEYLEN subparameter. This KEYLEN subparameter is found in the DD
statement that defines the indexed data set. If you specify the GENKEY option, it
causes the source key to be interpreted as a generic key, and the data set is
positioned to the first nondummy record in the data set whose key begins with the
source key. If you do not specify the GENKEY option, a READ statement's short
source key is padded on the right with blanks to the specified key length, and the
data set is positioned to the record that has this padded key (if such a record
exists). For a WRITE statement, a short source key is always padded with blanks.
──SCALARVARYING────────────────────────────────────────────────────────────────
When storage is allocated for a varying-length string, the compiler includes a 2-byte
prefix that specifies the current length of the string. For an element varying-length
string, this prefix is included on output, or recognized on input, only if
SCALARVARYING is specified for the file.
When you use locate mode statements (LOCATE and READ SET) to create and
read a data set with element varying-length strings, you must specify
SCALARVARYING to indicate that a length prefix is present, since the pointer that
locates the buffer is always assumed to point to the start of the length prefix.
A data set created using SCALARVARYING should be accessed only by a file that
also specifies SCALARVARYING.
You must not specify SCALARVARYING and CTLASA/CTL360 for the same file, as
this causes the first data byte to be ambiguous.
KEYLENGTH option: Use the KEYLENGTH option to specify the length of the
recorded key for KEYED files where n is the length. You can specify KEYLENGTH
for INDEXED files.
──KEYLENGTH──(──n──)───────────────────────────────────────────────────────────
If you include the KEYLENGTH option in a VSAM file declaration for checking
purposes, and the key length you specify in the option conflicts with the value
defined for the data set, the UNDEFINEDFILE condition is raised.
┌─CONSECUTIVE─┐
──ORGANIZATION──(──┼─INDEXED─────┼──)──────────────────────────────────────────
└─RELATIVE────┘
CONSECUTIVE
Specifies that the files is associated with a consecutive data set. A
consecutive file can be either a native data set or a VSAM, ESDS, RRDS, or
KSDS data set.
Table 14 shows the facilities that are available with the various types of data sets
that can be used with PL/I Record I/O.
Table 14. A comparison of data set types available to PL/I record I/O
VSAM VSAM VSAM REGIONAL
KSDS ESDS RRDS INDEXED CONSECUTIVE (1)
SEQUENCE Key Entry Num- Key Entry By
order order bered order order region
DEVICES DASD DASD DASD DASD DASD, DASD
card, etc.
ACCESS
1 By key
2 Sequential 123 123 123 12 2 12
Alternate
index 123 123 No No No No
access
as above
How With At In With At In
extended new end empty new end empty
keys slots keys slots
DELETION
1 Space reusable Yes, 1 No Yes, 1 Yes, 2 No Yes, 2
2 Space not
reusable
The following chapters describe how to use Record I/O data sets for different types
of data sets:
Chapter 8, “Defining and using consecutive data sets” on page 162
Chapter 9, “Defining and using regional data sets” on page 186
Chapter 10, “Defining and using VSAM data sets” on page 197
To set the environment variables system wide so all users have access to them,
add the lines suggested in the subsections to the file /etc/profile. To set them
You can use the ECHO command to determine the current setting of an
environment variable. To define the value of BYPASS, you can use either of the
following two examples:
echo $LANG
echo $LIBPATH
After compiling and linking the program, you could invoke it from the command line
by entering:
hello2 > hello2.out
If you want to combine stdout and stderr in a single file, enter the following
command:
hello2 > hello2.out 2>&1
As is true with display statements, the greater than sign redirects the output to the
file that is specified after it, in this case hello2.out. This means that the word
'Hello' is written in the file hello2.out. Note also that the output includes printer
control characters since the PRINT attribute is applied to SYSPRINT by default.
READ statements can access data from stdin; however, the record into which the
data is to be put must have an LRECL equal to 1.
You can create members individually until there is insufficient space left for a new
entry in the directory, or until there is insufficient space for the member itself. You
can access members individually by specifying the member name.
You can delete members by means of the IBM utility program IEHPROGM. This
deletes the member name from the directory so that the member can no longer be
accessed, but you cannot use the space occupied by the member itself again
unless you recreate the library or compress the unused space using, for example,
the IBM utility program IEBCOPY. If you attempt to delete a member by using the
DISP parameter of a DD statement, it causes the whole data set to be deleted.
Types of libraries
You can use the following types of libraries with a PL/I program:
The system program library SYS1.LINKLIB or its equivalent. This can contain
all system processing programs such as compilers and the linkage editor.
Private program libraries. These usually contain user-written programs. It is
often convenient to create a temporary private library to store the load module
output from the linkage editor until it is executed by a later job step in the same
job. The temporary library will be deleted at the end of the job. Private
libraries are also used for automatic library call by the linkage editor and the
loader.
The system procedure library SYS1.PROCLIB or its equivalent. This contains
the job control procedures that have been cataloged for your installation.
If you are accessing a member of a library, its directory entry can be found by the
operating system from the member name that you specify as part of the data set
name.
Creating a library
To create a library include in your job step a DD statement containing the
information given in Table 15. The information required is similar to that for a
consecutively organized data set (see “Defining files using record I/O” on
page 178) except for the SPACE parameter.
SPACE parameter
The SPACE parameter in a DD statement that defines a library must always be of
the form:
SPACE=(units,(quantity,increment,directory))
Although you can omit the third term (increment), indicating its absence by a
comma, the last term, specifying the number of directory blocks to be allocated,
must always be present.
The amount of auxiliary storage required for a library depends on the number and
sizes of the members to be stored in it and on how often members will be added or
replaced. (Space occupied by deleted members is not released.) The number of
directory blocks required depends on the number of members and the number of
aliases. You can specify an incremental quantity in the SPACE parameter that
allows the operating system to obtain more space for the data set, if such is
necessary at the time of creation or at the time a new member is added; the
number of directory blocks, however, is fixed at the time of creation and cannot be
increased.
When creating a library and a member at the same time, your DD statement must
include all the parameters listed under “Creating a library” on page 157 (although
you can omit the DISP parameter if the data set is to be temporary). The DSNAME
parameter must include the member name in parentheses. For example,
DSNAME=ALIB(MEM1) names the member MEM1 in the data set ALIB. If the
member is placed in the library by the linkage editor, you can use the linkage editor
NAME statement or the NAME compile-time option instead of including the member
name in the DSNAME parameter. You must also describe the characteristics of the
member (record format, etc.) either in the DCB parameter or in your PL/I program.
These characteristics will also apply to other members added to the data set.
When creating a member to be added to an existing library, you do not need the
SPACE parameter. The original space allocation applies to the whole of the library
and not to an individual member. Furthermore, you do not need to describe the
characteristics of the member, since these are already recorded in the DSCB for
the library.
To add two more members to a library in one job step, you must include a DD
statement for each member, and you must close one file that refers to the library
before you open another.
Examples
The use of the cataloged procedure IBMZC to compile a simple PL/I program and
place the object module in a new library named EXLIB is shown in Figure 20 on
page 159. The DD statement that defines the new library and names the object
module overrides the DD statement SYSLIN in the cataloged procedure. (The PL/I
program is a function procedure that, given two values in the form of the character
string produced by the TIME built-in function, returns the difference in milliseconds.)
The use of the cataloged procedure IBMZCL to compile and link-edit a PL/I
program and place the load module in the existing library HPU8.CCLM is shown in
Figure 21 on page 159.
//OPT1K#2 JOB
//TRLE EXEC IBMZCL
//PLI.SYSIN DD ]
MNAME: PROC OPTIONS(MAIN);
.
.
.
program
.
.
.
END MNAME;
/]
//LKED.SYSLMOD DD DSNAME=HPU8.CCLM(DIRLIST),DISP=OLD
To use a PL/I program to add or delete one or more records within a member of a
library, you must rewrite the entire member in another part of the library. This is
rarely an economic proposition, since the space originally occupied by the member
cannot be used again. You must use two files in your PL/I program, but both can
be associated with the same DD statement. The program shown in Figure 23 on
page 160 updates the member created by the program in Figure 22 on page 160.
It copies all the records of the original member except those that contain only
blanks.
//OPT1K#4 JOB
//TREX EXEC IBMZCBG
//PLI.SYSIN DD ]
UPDTM: PROC OPTIONS(MAIN);
DCL (OLD,NEW) FILE RECORD SEQUENTIAL,
EOF BIT(1) INIT('K'B),
DATA CHAR(8K);
ON ENDFILE(OLD) EOF = '1'B;
OPEN FILE(OLD) INPUT,FILE(NEW) OUTPUT TITLE('OLD');
READ FILE(OLD) INTO(DATA);
DO WHILE (¬EOF);
PUT FILE(SYSPRINT) SKIP EDIT (DATA) (A);
IF DATA=' ' THEN ;
ELSE WRITE FILE(NEW) FROM(DATA);
READ FILE(OLD) INTO(DATA);
END;
CLOSE FILE(OLD),FILE(NEW);
END UPDTM;
/]
//GO.OLD DD DSNAME=HPU8.ALIB(NMEM),DISP=(OLD,KEEP)
User data is information inserted by the program that created the member. An
entry that refers to a member (load module) written by the linkage editor includes
user data in a standard format, described in the systems manuals.
In a data set with consecutive organization, records are organized solely on the
basis of their successive physical positions; when the data set is created, records
are written consecutively in the order in which they are presented. You can retrieve
the records only in the order in which they were written. See Table 13 on
page 147 for valid file attributes and ENVIRONMENT options for consecutive data
sets.
Data sets with the STREAM attribute are processed by stream-oriented data
transmission, which allows your PL/I program to ignore block and record
boundaries and treat a data set as a continuous stream of data values in character
or graphic form.
You create and access data sets for stream-oriented data transmission using the
list-, data-, and edit-directed input and output statements described in the PL/I
Language Reference.
For output, PL/I converts the data items from program variables into character form
if necessary, and builds the stream of characters or graphics into records for
transmission to the data set.
For input, PL/I takes records from the data set and separates them into the data
items requested by your program, converting them into the appropriate form for
assignment to program variables.
You can use stream-oriented data transmission to read or write graphic data.
There are terminals, printers, and data-entry devices that, with the appropriate
programming support, can display, print, and enter graphics. You must be sure
that your data is in a format acceptable for the intended device, or for a print utility
program.
CONSECUTIVE
STREAM files must have CONSECUTIVE data set organization; however, it is not
necessary to specify this in the ENVIRONMENT options since CONSECUTIVE is
the default data set organization. The CONSECUTIVE option for STREAM files is
the same as that described in “Data set organization” on page 142.
──CONSECUTIVE──────────────────────────────────────────────────────────────────
Having specified the record format, you need not concern yourself with records and
blocks as long as you use stream-oriented data transmission. You can consider
your data set a series of characters or graphics arranged in lines, and you can use
the SKIP option or format item (and, for a PRINT file, the PAGE and LINE options
and format items) to select a new line.
──┬─F───┬──────────────────────────────────────────────────────────────────────
├─FS──┤
├─FB──┤
├─FBS─┤
├─V───┤
├─VS──┤
├─VB──┤
├─VBS─┤
└─U───┘
Records can have one of the following formats, which are described in “Record
formats” on page 140.
RECSIZE
RECSIZE for stream-oriented data transmission is the same as that described in
“Specifying characteristics in the ENVIRONMENT attribute” on page 146.
Additionally, a value specified by the LINESIZE option of the OPEN statement
overrides a value specified in the RECSIZE option. LINESIZE is discussed in the
PL/I Language Reference.
Output files:
Record format
Set to VB-format
Record length
The specified or default LINESIZE value is used:
PRINT files:
F, FB, FBS, or U: line size + 1
V or VB: line size + 5
Non-PRINT files:
F, FB, FBS, or U: linesize
V or VB: linesize + 4
Block size:
F, FB, or FBS: record length
V or VB: record length + 4
──GRAPHIC──────────────────────────────────────────────────────────────────────
The ERROR condition is raised for list- and data-directed I/O if you have graphics
in input or output data and do not specify the GRAPHIC option.
For edit-directed I/O, the GRAPHIC option specifies that left and right delimiters are
added to DBCS variables and constants on output, and that input graphics will have
left and right delimiters. If you do not specify the GRAPHIC option, left and right
delimiters are not added to output data, and input graphics do not require left and
right delimiters. When you do specify the GRAPHIC option, the ERROR condition
is raised if left and right delimiters are missing from the input data.
For information on the graphic data type, and on the G-format item for edit-directed
I/O, see the PL/I Language Reference.
Essential information
When your application creates a STREAM file, it must supply a line-size value for
that file from one of the following sources:
LINESIZE option of the OPEN statement
If you choose the LINESIZE option, it overrides all other sources.
RECSIZE option of the ENVIRONMENT attribute
The RECSIZE option of the ENVIRONMENT attribute overrides the other
RECSIZE options.
RECSIZE option of the TITLE option of the OPEN statement
RECSIZE specified in the TITLE option of the OPEN statement has precedence
over the RECSIZE option of the DD_DDNAME environment variable.
RECSIZE option of the DD_DDNAME environment variable
PL/I-supplied default value
the PL/I default is used when you do not supply any value.
If LINESIZE is not supplied, but a RECSIZE value is, PL/I derives the line-size
value from RECSIZE as follows:
A PRINT file with the ASA(N) option applied has a RECSIZE value of 4
A PRINT file with the ASA(Y) option applied has a RECSIZE value of 1
In all other cases, the value of RECSIZE is assigned to the line-size value.
PL/I always derives the record length of the data set from the line-size value. A
record-length value is derived from the line-size value as follows:
For a PRINT file with the ASA(N) option applied, the value is line size + 4
For a PRINT file with the ASA(Y) option applied, the value is line size + 1
In all other cases, the line-size value is assigned to the record-length value
Examples
The use of edit-directed stream-oriented data transmission to create a data set on a
direct access storage device is shown in Figure 24. The data read from the input
stream by the file SYSIN includes a field VREC that contains five unnamed
7-character subfields; the field NUM defines the number of these subfields that
contain information. The output file WORK transmits to the data set the whole of
the field FREC and only those subfields of VREC that contain information.
//EX7#2 JOB
//STEP1 EXEC IBMZCBG
//PLI.SYSIN DD ]
PEOPLE: PROC OPTIONS(MAIN);
DCL WORK FILE STREAM OUTPUT,
1 REC,
2 FREC,
3 NAME CHAR(19),
3 NUM CHAR(1),
3 PAD CHAR(25),
2 VREC CHAR(35),
EOF BIT(1) INIT('K'B),
IN CHAR(8K) DEF REC;
ON ENDFILE(SYSIN) EOF='1'B;
OPEN FILE(WORK) LINESIZE(4KK);
GET FILE(SYSIN) EDIT(IN)(A(8K));
DO WHILE (¬EOF);
PUT FILE(WORK) EDIT(IN)(A(45+7]NUM));
GET FILE(SYSIN) EDIT(IN)(A(8K));
END;
CLOSE FILE(WORK);
END PEOPLE;
/]
//GO.WORK DD DSN=HPU8.PEOPLE,DISP=(NEW,CATLG),UNIT=SYSDA,
// SPACE=(TRK,(1,1))
//GO.SYSIN DD ]
R.C.ANDERSON K 2K2848 DOCTOR
B.F.BENNETT 2 771239 PLUMBER VICTOR HAZEL
R.E.COLE 5 698635 COOK ELLEN VICTOR JOAN ANN OTTO
J.F.COOPER 5 418915 LAWYER FRANK CAROL DONALD NORMAN BRENDA
A.J.CORNELL 3 237837 BARBER ALBERT ERIC JANET
E.F.FERRIS 4 158636 CARPENTER GERALD ANNA MARY HAROLD
/]
//EX7#3 JOB
//STEP1 EXEC IBMZCBG
//PLI.SYSIN DD ]
% PROCESS GRAPHIC;
XAMPLE1: PROC OPTIONS(MAIN);
DCL INFILE FILE INPUT RECORD,
OUTFILE FILE OUTPUT STREAM ENV(GRAPHIC);
/] GRAPHIC OPTION MEANS DELIMITERS WILL BE INSERTED ON OUTPUT FILES. ]/
DCL
1 IN,
3 EMPNO CHAR(6),
3 SHIFT1 CHAR(1),
3 NAME,
5 LAST G(7),
5 FIRST G(7),
3 SHIFT2 CHAR(1),
3 ADDRESS,
5 ZIP CHAR(6),
5 SHIFT3 CHAR(1),
5 DISTRICT G(5),
5 CITY G(5),
5 OTHER G(8),
5 SHIFT4 CHAR(1);
DCL EOF BIT(1) INIT('K'B);
DCL ADDRWK G(2K);
ON ENDFILE (INFILE) EOF = '1'B;
READ FILE(INFILE) INTO(IN);
DO WHILE(¬EOF);
DO;
IF SUBSTR(ZIP,1,3)¬='3KK'
THEN LEAVE;
L=K;
ADDRWK=DISTRICT;
DO I=1 TO 5;
IF SUBSTR(DISTRICT,I,1)= < >
THEN LEAVE; /] SUBSTR BIF PICKS 3P ]/
END; /] THE ITH GRAPHIC CHAR ]/
L=L+I+1; /] IN DISTRICT ]/
SUBSTR(ADDRWK,L,5)=CITY;
DO I=1 TO 5;
IF SUBSTR(CITY,I,1)= < >
THEN LEAVE;
END;
L=L+I;
SUBSTR(ADDRWK,L,8)=OTHER;
PUT FILE(OUTFILE) SKIP /] THIS DATA SET ]/
EDIT(EMPNO,IN.LAST,FIRST,ADDRWK) /] REQUIRES UTILITY ]/
(A(8),G(7),G(7),X(4),G(2K)); /] TO PRINT GRAPHIC ]/
/] DATA ]/
END; /] END OF NON-ITERATIVE DO ]/
READ FILE(INFILE) INTO (IN);
END; /] END OF DO WHILE(¬EOF) ]/
END XAMPLE1;
/]
//GO.OUTFILE DD SYSOUT=A,DCB=(RECFM=VB,LRECL=121,BLKSIZE=129)
//GO.INFILE DD ]
ABCDEF< >3KKK99< 3 3 3 3 3 3 3 >
ABCD < >3KKK11< 3 3 3 3 >
/]
To access a data set, you must use one of the following to identify it:
ENVIRONMENT attribute
DD_DDNAME environment variable
TITLE option of the OPEN statement
The following paragraphs describe the essential information you must include in the
DD statement, and discuss some of the optional information you can supply. The
discussions do not apply to data sets in the input stream.
Essential information
When your application accesses an existing STREAM file, PL/I must obtain a
record-length value for that file. The value can come from one of the following
sources:
The LINESIZE option of the OPEN statement
The RECSIZE option of the ENVIRONMENT attribute
The RECSIZE option of the DD_DDNAME environment variable
The RECSIZE option of the TITLE option of the OPEN statement
PL/I-supplied default value
If you are using an existing OUTPUT file, or if you supply a RECSIZE value, PL/I
determines the record-length value as described in “Creating a data set with stream
I/O” on page 165.
Record format
When using stream-oriented data transmission to access a data set, you do not
need to know the record format of the data set (except when you must specify a
block size); each GET statement transfers a discrete number of characters or
graphics to your program from the data stream.
//EX7#5 JOB
//STEP1 EXEC IBMZCBG
//PLI.SYSIN DD ]
PEOPLE: PROC OPTIONS(MAIN);
DCL WORK FILE STREAM INPUT,
1 REC,
2 FREC,
3 NAME CHAR(19),
3 NUM CHAR(1),
3 SERNO CHAR(7),
3 PROF CHAR(18),
2 VREC CHAR(35),
IN CHAR(8K) DEF REC,
EOF BIT(1) INIT('K'B);
ON ENDFILE(WORK) EOF='1'B;
OPEN FILE(WORK);
GET FILE(WORK) EDIT(IN,VREC)(A(45),A(7]NUM));
DO WHILE (¬EOF);
PUT FILE(SYSPRINT) SKIP EDIT(IN)(A);
GET FILE(WORK) EDIT(IN,VREC)(A(45),A(7]NUM));
END;
CLOSE FILE(WORK);
END PEOPLE;
/]
//GO.WORK DD DSN=HPU8.PEOPLE,DISP=(OLD,DELETE)
You can apply the PRINT attribute to any STREAM OUTPUT file, even if you do
not intend to print the associated data set directly. When a PRINT file is
associated with a direct-access data set, the print control characters have no effect
on the layout of the data set, but appear as part of the data in the records.
A PRINT file uses only the following five print control characters:
Character Action
Space 1 line before printing (blank character)
0 Space 2 lines before printing
− Space 3 lines before printing
+ No space before printing
1 Start new page
The compiler handles the PAGE, SKIP, and LINE options or format items by
padding the remainder of the current record with blanks and inserting the
appropriate control character in the next record. If SKIP or LINE specifies more
than a 3-line space, the compiler inserts sufficient blank records with appropriate
control characters to accomplish the required spacing. In the absence of a print
control option or format item, when a record is full the compiler inserts a blank
character (single line space) in the first byte of the next record.
If a PRINT file is being transmitted to a terminal, the PAGE, SKIP, and LINE
options will never cause more than 3 lines to be skipped, unless formatted output is
specified.
The blocking of records has no effect on the appearance of the output produced by
a PRINT file, but it does result in more efficient use of auxiliary storage when the
file is associated with a data set on a direct-access device. If you use the
LINESIZE option, ensure that your line size is compatible with your block size. For
F-format records, block size must be an exact multiple of (line size+1); for V-format
records, block size must be at least 9 bytes greater than line size.
Although you can vary the line size for a PRINT file during execution by closing the
file and opening it again with a new line size, you must do so with caution if you
are using the PRINT file to create a data set on a direct-access device. You
cannot change the record format that is established for the data set when the file is
first opened. If the line size you specify in an OPEN statement conflicts with the
record format already established, the UNDEFINEDFILE condition is raised. To
prevent this, either specify V-format records with a block size at least 9 bytes
greater than the maximum line size you intend to use, or ensure that the first OPEN
statement specifies the maximum line size. (Output destined for the printer can be
stored temporarily on a direct-access device, unless you specify a printer by using
UNIT=, even if you intend it to be fed directly to the printer.)
Example: Figure 27 on page 172 illustrates the use of a PRINT file and the
printing options of stream-oriented data transmission statements to format a table
and write it onto a direct-access device for printing on a later occasion. The table
comprises the natural sines of the angles from 0° to 359° 54' in steps of 6'.
The statements in the ENDPAGE ON-unit insert a page number at the bottom of
each page, and set up the headings for the following page.
The DD statement defining the data set created by this program includes no
record-format information. The compiler infers the following from the file declaration
and the line size specified in the statement that opens the file TABLE:
Record format = V
(the default for a PRINT file).
Record size = 98
(line size + 1 byte for print control character + 4 bytes for
record control field).
Block size = 102
(record length + 4 bytes for block control field).
ON ERROR
BEGIN;
ON ERROR SYSTEM;
DISPLAY ('ONCODE = '|| ONCODE);
END;
ON ENDPAGE(TABLE)
BEGIN;
DCL I;
IF PGNO ¬= K THEN
PUT FILE(TABLE) EDIT ('PAGE',PGNO)
(LINE(55),COL(8K),A,F(3));
IF DEG ¬= 36K THEN
DO;
PUT FILE(TABLE) PAGE EDIT ('NATURAL SINES') (A);
IF PGNO ¬= K THEN
PUT FILE(TABLE) EDIT ((I DO I = K TO 54 BY 6))
(SKIP(3),1K F(9));
PGNO = PGNO + 1;
END;
ELSE
PUT FILE(TABLE) PAGE;
END;
Figure 27. Creating a print file via stream data transmission. The example in Figure 32 on
page 185 will print the resultant file.
You can override the default PL/I tab settings for your program by causing the
linkage editor to resolve an external reference to PLITABS. To cause the reference
to be resolved, supply a table with the name PLITABS, in the format described
above.
To supply this tab table, include a PL/I structure in your source program with the
name PLITABS, which you must declare to be STATIC EXTERNAL in your MAIN
proc. An example of the PL/I structure is shown in Figure 28. This example
creates three tab settings, in positions 30, 60, and 90, and uses the defaults for
page size and line size. Note that TAB1 identifies the position of the second item
printed on a line; the first item on a line always starts at the left margin. The first
item in the structure is the offset to the NO_OF_TABS field; FILL1, FILL2, and
FILL3 can be omitted by adjusting the offset value by –6.
Figure 28. PL/I structure PLITABS for modifying the preset tab settings
If you do not declare SYSPRINT, the compiler gives the file the attribute PRINT in
addition to the normal default attributes; the complete set of attributes will be:
FILE STREAM OUTPUT PRINT EXTERNAL
Since SYSPRINT is a PRINT file, the compiler also supplies a default line size of
120 characters and a V-format record. You need give only a minimum of
information in the corresponding DD statement; if your installation uses the usual
You can override the attributes given to SYSPRINT by the compiler by explicitly
declaring or opening the file. For more information about the interaction between
SYSPRINT and the Language Environment for OS/390 & VM message file option,
see the OS/390 Language Environment Programming Guide.
The compiler does not supply any special attributes for the input file SYSIN; if you
do not declare it, it receives only the default attributes. The data set associated
with SYSIN is usually in the input stream; if it is not in the input stream, you must
supply full DD information.
You are prompted for input to stream files by a colon (:). You will see the colon
each time a GET statement is executed in the program. The GET statement
causes the system to go to the next line. You can then enter the required data. If
you enter a line that does not contain enough data to complete execution of the
GET statement, a further prompt, which is a plus sign followed by a colon (+:), is
displayed.
By adding a hyphen to the end of any line that is to continue, you can delay
transmission of the data to your program until you enter two or more lines.
If you include output statements that prompt you for input in your program, you can
inhibit the initial system prompt by ending your own prompt with a colon. For
example, the GET statement could be preceded by a PUT statement such as:
PUT SKIP LIST('ENTER NEXT ITEM:');
To inhibit the system prompt for the next GET statement, your own prompt must
meet the following conditions:
1. It must be either list-directed or edit-directed, and if list-directed, must be to a
PRINT file.
2. The file transmitting the prompt must be allocated to the terminal. If you are
merely copying the file at the terminal, the system prompt is not inhibited.
End-of-file
The characters /* in positions one and two of a line that contains no other
characters are treated as an end-of-file mark, that is, they raise the ENDFILE
condition.
The standard print file SYSPRINT generally meets both these conditions.
You can cause a PRINT file to be formatted into pages by inserting a tab control
table in your program. The table must be called PLITABS, and its contents are
explained in “Overriding the tab control table” on page 172. You must initialize the
element PAGELENGTH to the length of page you require—that is, the length of the
sheet of paper on which each page is to be printed, expressed as the maximum
number of lines that could be printed on it. You must initialize the element
PAGESIZE to the actual number of lines to be printed on each page. After the
number of lines in PAGESIZE has been printed on a page, ENDPAGE is raised, for
which standard system action is to skip the number of lines equal to
PAGELENGTH minus PAGESIZE, and then start printing the next page. For other
than standard layout, you must initialize the other elements in PLITABS to the
values shown in Figure 14 on page 111. You can also use PLITABS to alter the
tabulating positions of list-directed and data-directed output. You can use PLITABS
for SYSPRINT when you need to format page breaks in ILC applications. Set
PAGESIZE to 32767 and use the PUT PAGE statement to control page breaks.
Table 16 lists the statements and options that you can use to create and access a
consecutive data set using record-oriented data transmission.
Table 16 (Page 1 of 2). Statements and options allowed for creating and accessing
consecutive data sets
File declaration1 Valid statements,2 with Other options you
Options you must specify can specify
SEQUENTIAL OUTPUT WRITE FILE(file-reference)
BUFFERED FROM(reference);
READ FILE(file-reference)
SET(pointer-reference);
READ FILE(file-reference)
IGNORE(expression);
SEQUENTIAL INPUT READ FILE(file-reference)
INTO(reference);
READ FILE(file-reference)
IGNORE(expression);
SEQUENTIAL UPDATE READ FILE(file-reference)
BUFFERED INTO(reference);
READ FILE(file-reference)
SET(pointer-reference);
READ FILE(file-reference)
IGNORE(expression);
READ FILE(file-reference)
IGNORE(expression);
REWRITE FILE(file-reference)
FROM(reference);
Notes:
1. The complete file declaration would include the attributes FILE, RECORD and ENVIRONMENT.
2. The statement READ FILE (file-reference); is a valid statement and is equivalent to READ
FILE(file-reference) IGNORE (1);
CONSECUTIVE or ORGANIZATION(CONSECUTIVE)
DEBLOCK
CTLASA|CTL36K
The options above the blank line are described in “Specifying characteristics in the
ENVIRONMENT attribute” on page 146, and those below the blank line are
described below.
See Table 13 on page 147 to find which options you must specify, which are
optional, and which are defaults.
CONSECUTIVE
The CONSECUTIVE option defines a file with consecutive data set organization,
which is described in this chapter and in “Data set organization” on page 142.
──CONSECUTIVE──────────────────────────────────────────────────────────────────
ORGANIZATION(CONSECUTIVE)
Specifies that the file is associated with a consecutive data set. The
ORGANIZATION option is described in “ORGANIZATION option” on page 153.
The file can be either a native data set or a VSAM data set.
DEBLOCK
The DEBLOCK option indicates that a program will do its own deblocking of
records.
This option is valid only for record input files that are not spanned or concatenated
and is valid only under batch mode.
If DEBLOCK is not specified, the PL/I library will perform deblocking of the dataset
as necessary.
CTLASA|CTL360
The printer control options CTLASA and CTL360 apply only to OUTPUT files
associated with consecutive data sets. They specify that the first character of a
record is to be interpreted as a control character.
──┬─CTLASA─┬───────────────────────────────────────────────────────────────────
└─CTL36K─┘
The American National Standard control characters, listed in Figure 29, cause the
specified action to occur before the associated record is printed or punched.
The machine code control characters differ according to the type of device. The
IBM machine code control characters for printers are listed in Figure 30.
Code Action
Space 1 line before printing (blank code)
0 Space 2 lines before printing
− Space 3 lines before printing
+ Suppress space before printing
1 Skip to channel 1
2 Skip to channel 2
3 Skip to channel 3
4 Skip to channel 4
5 Skip to channel 5
6 Skip to channel 6
7 Skip to channel 7
8 Skip to channel 8
9 Skip to channel 9
A Skip to channel 10
B Skip to channel 11
C Skip to channel 12
V Select stacker 1
W Select stacker 2
Figure 29. American National Standard print and card punch control characters (CTLASA)
When creating a data set, you must identify it to the operating system in a DD
statement. The following paragraphs, summarized in Table 17, tell what essential
information you must include in the DD statement and discuss some of the optional
information you can supply.
Table 17. Creating a consecutive data set with record I/O: essential parameters of the DD statement
When required
Storage device What you must state Parameters
All Always Output device UNIT= or SYSOUT= or
VOLUME=REF=
Essential information
When you create a consecutive data set you must specify:
The name of data set to be associated with your PL/I file. A data set with
consecutive organization can exist on any type of device.
The record length. You can specify the record length using the RECSIZE
option of the ENVIRONMENT attribute, of the DD_DDNAME environment
variable, or of the TITLE option of the OPEN statement.
For files associated with the terminal device (stdout: or stderr:), PL/I uses a
default record length of 120 when the RECSIZE option is not specified.
The REWRITE statement updates the record that was read by the second READ
statement. The record that was read by the first statement cannot be rewritten
after the second READ statement has been executed.
Table 18. Accessing a consecutive data set with record I/O: essential parameters of the DD
statement
Parameters What you must state When required
DSNAME= Name of data set Always
The following paragraphs indicate the essential information you must include in the
DD statement, and discuss some of the optional information you can supply. The
discussions do not apply to data sets in the input stream.
Essential information
If the data set is cataloged, you need to supply only the following information in the
DD statement:
The name of the data set (DSNAME parameter). The operating system will
locate the information describing the data set in the system catalog, and, if
necessary, will request the operator to mount the volume containing it.
Confirmation that the data set exists (DISP parameter). If you open the data
set for output with the intention of extending it by adding records at the end,
code DISP=MOD; otherwise, opening the data set for output will result in it
being overwritten.
//EXAMPLE JOB
//STEP1 EXEC IBMZCBG
//PLI.SYSIN DD ]
%PROCESS INT F(I) AG A(F) OP STG NEST X(F) SOURCE ;
%PROCESS LIST;
Figure 31 (Part 1 of 2). Merge Sort—creating and accessing a consecutive data set
END MERGE;
/]
//GO.INPUT1 DD ]
AAAAAA
CCCCCC
EEEEEE
GGGGGG
IIIIII
/]
//GO.INPUT2 DD ]
BBBBBB
DDDDDD
FFFFFF
HHHHHH
JJJJJJ
KKKKKK
/]
//GO.OUT DD DSN=&&TEMP,DISP=(NEW,DELETE),UNIT=SYSDA,
// DCB=(RECFM=FB,BLKSIZE=15K,LRECL=15),SPACE=(TRK,(1,1))
Figure 31 (Part 2 of 2). Merge Sort—creating and accessing a consecutive data set
OPEN FILE(TABLE),
FILE(PRINTER);
CLOSE FILE(TABLE),
FILE(PRINTER);
END PRT;
A data set with regional organization is divided into regions, each of which is
identified by a region number, and each of which can contain one record or more
than one record, depending on the type of regional organization. The regions are
numbered in succession, beginning with zero, and a record can be accessed by
specifying its region number, and perhaps a key, in a data transmission statement.
Regional organization of a data set allows you to control the physical placement of
records in the data set, and to optimize the access time for a particular application.
Such optimization is not available with consecutive or indexed organization, in
which successive records are written either in strict physical sequence or in logical
sequence depending on ascending key values; neither of these methods takes full
advantage of the characteristics of direct-access storage devices.
You can create a regional data set in a manner similar to a consecutive or indexed
data set, presenting records in the order of ascending region numbers; alternatively,
you can use direct-access, in which you present records in random sequence and
insert them directly into preformatted regions. Once you create a regional data set,
you can access it by using a file with the attributes SEQUENTIAL or DIRECT as
well as INPUT or UPDATE. You do not need to specify either a region number or
a key if the data set is associated with a SEQUENTIAL INPUT or SEQUENTIAL
UPDATE file. When the file has the DIRECT attribute, you can retrieve, add,
delete, and replace records at random.
Records within a regional data set are either actual records containing valid data or
dummy records.
The major advantage of regional organization over other types of data set
organization is that it allows you to control the relative placement of records; by
judicious programming, you can optimize record access in terms of device
capabilities and the requirements of particular applications.
Direct access of regional data sets is quicker than that of indexed data sets, but
regional data sets have the disadvantage that sequential processing can present
records in random sequence; the order of sequential retrieval is not necessarily that
in which the records were presented, nor need it be related to the relative key
values.
Table 19 on page 187 lists the data transmission statements and options that you
can use to create and access a regional data set.
READ FILE(file-reference)
IGNORE(expression);
SEQUENTIAL INPUT READ FILE(file-reference) KEYTO(reference)
INTO(reference);
READ FILE(file-reference)
IGNORE(expression);
SEQUENTIAL UPDATE3 READ FILE(file-reference) KEYTO(reference)
BUFFERED INTO(reference);
READ FILE(file-reference)
IGNORE(expression);
READ FILE(file-reference)
IGNORE(expression);
REWRITE FILE(file-reference)
FROM(reference);
DIRECT OUTPUT WRITE FILE(file-reference)
FROM(reference)
KEYFROM(expression);
DIRECT INPUT READ FILE(file-reference)
INTO(reference)
KEY(expression);
REWRITE FILE(file-reference)
FROM(reference)
KEY(expression);
WRITE FILE(file-reference)
FROM(reference)
KEYFROM(expression);
DELETE FILE(file-reference)
KEY(expression);
DIRECT UPDATE READ FILE(file-reference)
INTO(reference)
KEY(expression);
REWRITE FILE(file-reference)
FROM(reference)
KEY(expression);
WRITE FILE(file-reference)
FROM(reference)
KEYFROM(expression);
DELETE FILE(file-reference)
KEY(expression);
UNLOCK FILE(file-reference)
KEY(expression);
Notes:
1. The complete file declaration would include the attributes FILE, RECORD, and ENVIRONMENT; if
you use any of the options KEY, KEYFROM, or KEYTO, you must also include the attribute KEYED.
2. The statement READ FILE(file-reference); is equivalent to the statement READ FILE(file-reference)
IGNORE(1);
3. The file must not have the UPDATE attribute when creating new data sets.
REGIONAL option
Use the REGIONAL option to define a file with regional organization.
──REGIONAL──(──1──)────────────────────────────────────────────────────────────
1 specifies REGIONAL(1)
REGIONAL(1)
specifies that the data set contains F-format records that do not have recorded
keys. Each region in the data set contains only one record; therefore, each
region number corresponds to a relative record within the data set (that is,
region numbers start with 0 at the beginning of the data set).
Although REGIONAL(1) data sets have no recorded keys, you can use
REGIONAL(1) DIRECT INPUT or UPDATE files to process data sets that do
have recorded keys.
You specify the length of the recorded keys in a regional data set with the
KEYLENGTH option of the ENVIRONMENT attribute, or the KEYLEN subparameter
on the DD statement. Unlike the keys for indexed data sets, recorded keys in a
regional data set are never embedded within the record.
Dummy Records
Records in a REGIONAL(1) data set are either actual records containing valid data
or dummy records. A dummy record in a REGIONAL(1) data set is identified by
the constant (8)'1'B in its first byte. Although such dummy records are inserted in
the data set either when it is created or when a record is deleted, they are not
ignored when the data set is read; your PL/I program must be prepared to
recognize them. You can replace dummy records with valid data. Note that if you
insert (8)'1'B in the first byte, the record can be lost if you copy the file onto a data
set that has dummy records that are not retrieved.
When you use a SEQUENTIAL OUTPUT file to create the data set, the opening of
the file causes all tracks on the data set to be cleared, and a capacity record to be
written at the beginning of each track to record the amount of space available on
that track. You must present records in ascending order of region numbers; any
region you omit from the sequence is filled with a dummy record. If there is an
error in the sequence, or if you present a duplicate key, the KEY condition is
raised. When the file is closed, any space remaining at the end of the current
extent is filled with dummy records.
If you create a data set using a buffered file, and the last WRITE or LOCATE
statement before the file is closed attempts to transmit a record beyond the limits of
the data set, the CLOSE statement might raise the ERROR condition.
If you use a DIRECT OUTPUT file to create the data set, the whole primary extent
allocated to the data set is filled with dummy records when the file is opened. You
can present records in random order; if you present a duplicate, the existing record
will be overwritten.
For sequential creation, the data set can have up to 15 extents, which can be on
more than one volume. For direct creation, the data set can have only one extent,
and can therefore reside on only one volume.
//EX9 JOB
//STEP1 EXEC IBMZCBG,PARM.PLI='NOP,MAR(1,72)',PARM.BIND='LIST'
//PLI.SYSIN DD ]
CRR1: PROC OPTIONS(MAIN);
/] CREATING A REGIONAL(1) DATA SET - PHONE DIRECTORY ]/
DO WHILE(SYSIN_REC);
IOFIELD = NAME;
WRITE FILE(NOS) FROM(IOFIELD) KEYFROM(NUMBER);
PUT FILE(SYSPRINT) SKIP EDIT (CARD) (A);
READ FILE(SYSIN) INTO(CARD);
END;
CLOSE FILE(NOS);
END CRR1;
/]
//GO.SYSLMOD DD DSN=&&GOSET,DISP=(OLD,DELETE)
//GO.NOS DD DSN=NOS,UNIT=SYSDA,SPACE=(2K,1KK),
// DCB=(RECFM=F,BLKSIZE=2K,DSORG=DA),DISP=(NEW,KEEP)
//GO.SYSIN DD ]
ACTION,G. 12
BAKER,R. 13
BRAMLEY,O.H. 28
CHEESNAME,L. 11
CORY,G. 36
ELLIOTT,D. 85
FIGGINS,E.S. 43
HARVEY,C.D.W. 25
HASTINGS,G.M. 31
KENDALL,J.G. 24
LANCASTER,W.R. 64
MILES,R. 23
NEWMAN,M.W. 4K
PITT,W.H. 55
ROLF,D.E. 14
SHEERS,C.D. 21
SURCLIFFE,M. 42
TAYLOR,G.C. 47
WILTON,L.W. 44
WINSTONE,E.M. 37
/]
Sequential access
To open a SEQUENTIAL file that is used to process a REGIONAL(1) data set, use
either the INPUT or UPDATE attribute. You must not include the KEY option in
data transmission statements, but the file can have the KEYED attribute, since you
can use the KEYTO option. If the target character string referenced in the KEYTO
option has more than 8 characters, the value returned (the 8-character region
number) is padded on the left with blanks. If the target string has fewer than 8
characters, the value returned is truncated on the left.
Sequential access is in the order of ascending region numbers. All records are
retrieved, whether dummy or actual, and you must ensure that your PL/I program
recognizes dummy records.
Using sequential input with a REGIONAL(1) data set, you can read all the records
in ascending region-number sequence, and in sequential update you can read and
rewrite each record in turn.
The rules governing the relationship between READ and REWRITE statements for
a SEQUENTIAL UPDATE file that accesses a REGIONAL(1) data set are identical
to those for a consecutive data set. Consecutive data sets are discussed in detail
in Chapter 8, “Defining and using consecutive data sets” on page 162.
Direct access
To open a DIRECT file that is used to process a REGIONAL(1) data set you can
use either the INPUT or the UPDATE attribute. All data transmission statements
must include source keys; the DIRECT attribute implies the KEYED attribute.
Example
Updating a REGIONAL(1) data set is illustrated in Figure 34 on page 194. This
program updates the data set and lists its contents. Before each new or updated
record is written, the existing record in the region is tested to ensure that it is a
dummy; this is necessary because a WRITE statement can overwrite an existing
record in a REGIONAL(1) data set even if it is not a dummy. Similarly, during the
DO WHILE(SYSIN_REC);
SELECT(CODE);
WHEN('A','C') DO;
IF CODE = 'C' THEN
DELETE FILE(NOS) KEY(OLDNO);
READ FILE(NOS) KEY(NEWNO) INTO(IOFIELD);
IF UNSPEC(BYTE) = (8)'1'B
THEN WRITE FILE(NOS) KEYFROM(NEWNO) FROM(NAME);
ELSE PUT FILE(SYSPRINT) SKIP LIST ('DUPLICATE:',NAME);
END;
WHEN('D') DELETE FILE(NOS) KEY(OLDNO);
OTHERWISE PUT FILE(SYSPRINT) SKIP LIST ('INVALID CODE:',NAME);
END;
READ FILE(SYSIN) INTO(CARD);
END;
CLOSE FILE(SYSIN),FILE(NOS);
PUT FILE(SYSPRINT) PAGE;
OPEN FILE(NOS) SEQUENTIAL INPUT;
ON ENDFILE(NOS) NOS_REC = 'K'B;
READ FILE(NOS) INTO(IOFIELD) KEYTO(NEWNO);
DO WHILE(NOS_REC);
IF UNSPEC(BYTE) ¬= (8)'1'B
THEN PUT FILE(SYSPRINT) SKIP EDIT (NEWNO,IOFIELD)(A(2),X(3),A);
PUT FILE(SYSPRINT) SKIP EDIT (IOFIELD) (A);
READ FILE(NOS) INTO(IOFIELD) KEYTO(NEWNO);
END;
CLOSE FILE(NOS);
END ACR1;
/]
//GO.NOS DD DSN=J44PLI.NOS,DISP=(OLD,DELETE),UNIT=SYSDA,VOL=SER=nnnnnn
//GO.SYSIN DD ]
NEWMAN,M.W. 564K C
GOODFELLOW,D.T. 89 A
MILES,R. 23 D
HARVEY,C.D.W. 29 A
BARTLETT,S.G. 13 A
CORY,G. 36 D
READ,K.M. K1 A
PITT,W.H. 55
ROLF,D.F. 14 D
ELLIOTT,D. 4285 C
HASTINGS,G.M. 31 D
BRAMLEY,O.H. 4928 C
/]
You must supply the following information when creating a regional data set:
Device that will write your data set (UNIT or VOLUME parameter of DD
statement).
Block size: You can specify the block size either in your PL/I program (in the
BLKSIZE option of the ENVIRONMENT attribute) or in the DD statement
(BLKSIZE subparameter). If you do not specify a record length, unblocked
records are the default and the record length is determined from the block size.
If you want to keep a data set (that is, you do not want the operating system to
delete it at the end of your job), the DD statement must name the data set and
indicate how it is to be disposed of (DSNAME and DISP parameters). The DISP
parameter alone will suffice if you want to use the data set in a later step but do not
need it after the end of your job.
If you want your data set stored on a particular direct-access device, you must
indicate the volume serial number in the DD statement (SER or REF subparameter
of VOLUME parameter). If you do not supply a serial number for a data set that
you want to keep, the operating system allocates one, informs the operator, and
prints the number on your program listing. All the essential parameters required in
a DD statement for the creation of a regional data set are summarized in Table 20;
and Table 21 on page 196 lists the DCB subparameters needed. See your
OS/390 JCL User's Guide for a description of the DCB subparameters.
You cannot place a regional data set on a system output (SYSOUT) device.
In the DCB parameter, you must always specify the data set organization as direct
by coding DSORG=DA. You cannot specify the DUMMY or DSN=NULLFILE
parameters in a DD statement for a regional data set.
Table 20 (Page 1 of 2). Creating a regional data set: essential parameters of the DD
statement
Parameters What you must state When required
UNIT= or Output device1 Always
VOLUME=REF=
2For sequential access, the data set can have up to 15 extents, which can be on more than one volume.
For creation with DIRECT access, the data set can have only one extent.
To access a regional data set, you must identify it to the operating system in a DD
statement. The following paragraphs indicate the minimum information you must
include in the DD statement; this information is summarized in Table 22.
If the data set is cataloged, you need to supply only the following information in
your DD statement:
The name of the data set (DSNAME parameter). The operating system locates
the information that describes the data set in the system catalog and, if
necessary, requests the operator to mount the volume that contains it.
Confirmation that the data set exists (DISP parameter).
If the data set is not cataloged, you must, in addition, specify the device that will
read the data set and give the serial number of the volume that contains the data
set (UNIT and VOLUME parameters).
When opening a multiple-volume regional data set for sequential update, the
ENDFILE condition is raised at the end of the first volume.
Table 22. Accessing a regional data set: essential parameters of the DD statement
Parameters What you must state When required
DSNAME= Name of data set Always
For additional information about the facilities of VSAM, the structure of VSAM data
sets and indexes, the way in which they are defined by Access Method Services,
and the required JCL statements, see the VSAM publications for your system.
Then you can write the required DD statement to access the data set:
//filename DD DSNAME=dsname,DISP=OLD|SHR
For example, if your file is named PL1FILE, your data set named VSAMDS, and
you want exclusive control of the data set, enter:
//PL1FILE DD DSNAME=VSAMDS,DISP=OLD
Given a PL/I file called PL1FILE and the alternate index path called PERSALPH,
the DD statement required would be:
//PL1FILE DD DSNAME=PERSALPH,DISP=OLD
These correspond roughly to PL/I indexed, consecutive, and regional data set
organizations, respectively. They are all ordered, and they can all have keys
associated with their records. Both sequential and keyed access are possible with
all three types.
Although only key-sequenced data sets have keys as part of their logical records,
keyed access is also possible for entry-sequenced data sets (using relative-byte
addresses) and relative record data sets (using relative record numbers).
All VSAM data sets are held on direct-access storage devices, and a virtual storage
operating system is required to use them.
The physical organization of VSAM data sets differs from those used by other
access methods. VSAM does not use the concept of blocking, and, except for
relative record data sets, records need not be of a fixed length. In data sets with
VSAM organization, the data items are arranged in control intervals, which are in
turn arranged in control areas. For processing purposes, the data items within a
control interval are arranged in logical records. A control interval can contain one
or more logical records, and a logical record can span two or more control intervals.
Concern about blocking factors and record length is largely removed by VSAM,
although records cannot exceed the maximum specified size. VSAM allows access
to the control intervals, but this type of access is not supported by PL/I.
VSAM data sets can have two types of indexes—prime and alternate. A prime
index is the index to a KSDS that is established when you define a data set; it
always exists and can be the only index for a KSDS. You can have one or more
alternate indexes on a KSDS or an ESDS. Defining an alternate index for an ESDS
enables you to treat the ESDS, in general, as a KSDS. An alternate index on a
KSDS enables a field in the logical record different from that in the prime index to
be used as the key field. Alternate indexes can be either nonunique, in which
duplicate keys are allowed, or unique, in which they are not. The prime index can
never have duplicate keys.
Any change in a data set that has alternate indexes must be reflected in all the
indexes if they are to remain useful. This activity is known as index upgrade, and is
done by VSAM for any index in the index upgrade set of the data set. (For a KSDS,
the prime index is always a member of the index upgrade set.) However, you must
avoid making changes in the data set that would cause duplicate keys in the prime
index or in a unique alternate index.
Before using a VSAM data set for the first time, you need to define it to the system
with the DEFINE command of Access Method Services, which you can use to
completely define the type, structure, and required space of the data set. This
command also defines the data set's indexes (together with their key lengths and
locations) and the index upgrade set if the data set is a KSDS or has one or more
alternate indexes. A VSAM data set is thus “created” by Access Method Services.
Use the three different types of data sets according to the following purposes:
Use entry-sequenced data sets for data that you primarily access in the order
in which it was created (or the reverse order).
Use key-sequenced data sets when you normally access records through keys
within the records (for example, a stock-control file where the part number is
used to access a record).
Use relative record data sets for data in which each item has a particular
number, and you normally access the relevant record by that number (for
example, a telephone system with a record associated with each number).
You can access records in all types of VSAM data sets either directly by means of
a key, or sequentially (backward or forward). You can also use a combination of
the two ways: Select a starting point with a key and then read forward or backward
from that point.
You can create alternate indexes for key-sequenced and entry-sequenced data
sets. You can then access your data in many sequences or by one of many keys.
For example, you could take a data set held or indexed in order of employee
number and index it by name in an alternate index. Then you could access it in
alphabetic order, in reverse alphabetic order, or directly using the name as a key.
You could also access it in the same kind of combinations by employee number.
Table 23 shows how the same data could be held in the three different types of
VSAM data sets and illustrates their respective advantages and disadvantages.
The ways you can reference the keys in the KEY, KEYFROM, and KEYTO options
are as described under “KEY(expression) Option,” “KEYFROM(expression) Option,”
and “KEYTO(reference) Option” in Chapter 12 of the PL/I Language Reference.
You can obtain the RBA for a record by using the KEYTO option, either on a
WRITE statement when you are loading or extending the data set, or on a READ
statement when the data set is being read. You can subsequently use an RBA
obtained in either of these ways in the KEY option of a READ or REWRITE
statement.
VSAM allows use of the relative byte address as a key to a KSDS, but this use is
not supported by PL/I.
Keys used as relative record numbers are character strings of length 8. The
character value of a source key you use in the KEY or KEYFROM option must
represent an unsigned integer. If the source key is not 8 characters long, it is
truncated or padded with blanks (interpreted as zeros) on the left. The value
returned by the KEYTO option is a character string of length 8, with leading zeros
suppressed.
The comparison of all eight types of data sets given in Table 14 on page 154 is
helpful; however, many factors in the choice of data set type for a large installation
are beyond the scope of this book.
When choosing between the VSAM data set types, you should base your choice on
the most common sequence in which you will require your data. The following is a
suggested procedure that you can use to help ensure a combination of data sets
and indexes that provide the function you require.
1. Determine the type of data and how it will be accessed.
a. Primarily sequentially — favors ESDS.
b. Primarily by key — favors KSDS.
c. Primarily by number — favors RRDS.
2. Determine how you will load the data set. Note that you must load a KSDS in
key sequence; thus an ESDS with an alternate index path can be a more
practical alternative for some applications.
3. Determine whether you require access through an alternate index path. These
are only supported on KSDS and ESDS. If you require an alternate index path,
determine whether the alternate index will have unique or nonunique keys. Use
of nonunique keys can limit key processing. However, it might also be
impractical to assume that you will use unique keys for all future records; if you
attempt to insert a record with a nonunique key in an index that you have
created for unique keys, it will cause an error.
4. When you have determined the data sets and paths that you require, ensure
that the operations you have in mind are supported. Figure 35 on page 202
might be helpful.
Do not try to access a dummy VSAM data set, because you will receive an error
message indicating that you have an undefined file.
Table 13 on page 147 shows the default attributes. The file attributes are
described in the PL/I Language Reference. Options of the ENVIRONMENT
attribute are discussed below.
GENKEY and SCALARVARYING options have the same effect as they do when
you use them for non-VSAM data sets.
The options that are checked for a VSAM data set are RECSIZE and, for a
key-sequenced data set, KEYLENGTH and KEYLOC. Table 13 on page 147
shows which options are ignored for VSAM. Table 13 on page 147 also shows the
required and default options.
For VSAM data sets, you specify the maximum and average lengths of the records
to the Access Method Services utility when you define the data set. If you include
the RECSIZE option in the file declaration for checking purposes, specify the
maximum record size. If you specify RECSIZE and it conflicts with the values
defined for the data set, the UNDEFINEDFILE condition is raised.
BKWD option
Use the BKWD option to specify backward processing for a SEQUENTIAL INPUT
or SEQUENTIAL UPDATE file associated with a VSAM data set.
──BKWD─────────────────────────────────────────────────────────────────────────
Sequential reads (that is, reads without the KEY option) retrieve the previous record
in sequence. For indexed data sets, the previous record is, in general, the record
When a file with the BKWD option is opened, the data set is positioned at the last
record. ENDFILE is raised in the normal way when the start of the data set is
reached.
Do not specify the BKWD option with either the REUSE option or the GENKEY
option. Also, the WRITE statement is not allowed for files declared with the BKWD
option.
GENKEY option
For the description of this option, see “GENKEY option — key classification” on
page 151.
REUSE option
Use the REUSE option to specify that an OUTPUT file associated with a VSAM
data set is to be used as a work file.
──REUSE────────────────────────────────────────────────────────────────────────
The data set is treated as an empty data set each time the file is opened. Any
secondary allocations for the data set are released, and the data set is treated
exactly as if it were being opened for the first time.
Do not associate a file that has the REUSE option with a data set that has alternate
indexes or the BKWD option, and do not open it for INPUT or UPDATE.
The REUSE option takes effect only if you specify REUSE in the Access Method
Services DEFINE CLUSTER command.
VSAM option
Specify the VSAM option for VSAM data sets.
──VSAM─────────────────────────────────────────────────────────────────────────
Performance options
You can specify the buffer options in the AMP parameter of the DD statement; they
are explained in your Access Method Services manual.
When an alternate index has been built, you actually access the data set through a
third object known as an alternate index path that acts as a connection between the
alternate index and the data set.
Two types of alternate indexes are allowed—unique key and nonunique key. For a
unique key alternate index, each record must have a different alternate key. For a
nonunique key alternate index, any number of records can have the same alternate
key. In the example suggested above, the alternate index using the names could
be a unique key alternate index (provided each person had a different name). The
alternate index using the department number would be a nonunique key alternate
index because more than one person would be in each department.
In most respects, you can treat a data set accessed through a unique key alternate
index path like a KSDS accessed through its prime index. You can access the
records by key or sequentially, you can update records, and you can add new
records. If the data set is a KSDS, you can delete records, and alter the length of
updated records. Restrictions and allowed processing are shown in Table 24 on
page 202. When you add or delete records, all indexes associated with the data
set are by default altered to reflect the new situation.
In data sets accessed through a nonunique key alternate index path, the record
accessed is determined by the key and the sequence. The key can be used to
establish positioning so that sequential access can follow. The use of the key
accesses the first record with that key. When the data set is read backwards, only
the order of the keys is reversed. The order of the records with the same key
remains the same whichever way the data set is read.
When you have the information, you are in a position to code the DEFINE
command and then define and catalog the data set using Access Method Services.
Table 25. Statements and options allowed for loading and accessing VSAM
entry-sequenced data sets
File Valid statements, with options Other options you can
declaration1 you must include also include
SEQUENTIAL OUTPUT WRITE FILE(file-reference) KEYTO(reference)
BUFFERED FROM(reference);
LOCATE based-variable
SET(pointer-reference)
FILE(file-reference);
SEQUENTIAL INPUT READ FILE(file-reference) KEYTO(reference) or
BUFFERED INTO(reference); KEY(expression)3
READ FILE(file-reference) KEYTO(reference) or
SET(pointer-reference); KEY(expression)3
READ FILE(file-reference); IGNORE(expression)
SEQUENTIAL UPDATE READ FILE(file-reference) KEYTO(reference) or
BUFFERED INTO(reference); KEY(expression)3
READ FILE(file-reference) KEYTO(reference) or
SET(pointer-reference); KEY(expression)3
READ FILE(file-reference)2 IGNORE(expression)
WRITE FILE(file-reference) KEYTO(reference)
FROM(reference);
REWRITE FILE(file-reference);
FROM(reference)
and/or
KEY(expression)3
Notes:
1. The complete file declaration would include the attributes FILE, RECORD, and ENVIRONMENT; if
you use either of the options KEY or KEYTO, it must also include the attribute KEYED.
2. The statement “READ FILE(file-reference);” is equivalent to the statement “READ
FILE(file-reference) IGNORE (1);.”
3. The expression used in the KEY option must be a relative byte address, previously obtained by
means of the KEYTO option.
Loading an ESDS
When an ESDS is being loaded, the associated file must be opened for
SEQUENTIAL OUTPUT. The records are retained in the order in which they are
presented.
You can use the KEYTO option to obtain the relative byte address of each record
as it is written. You can subsequently use these keys to achieve keyed access to
the data set.
Sequential access is in the order that the records were originally loaded into the
data set. You can use the KEYTO option on the READ statements to recover the
RBAs of the records that are read. If you use the KEY option, the record that is
recovered is the one with the RBA you specify. Subsequent sequential access
continues from the new position in the data set.
For an UPDATE file, the WRITE statement adds a new record at the end of the
data set. With a REWRITE statement, the record rewritten is the one with the
specified RBA if you use the KEY option; otherwise, it is the record accessed on
the previous READ. You must not attempt to change the length of the record that
is being replaced with a REWRITE statement.
The PL/I program writes the data set using a SEQUENTIAL OUTPUT file and a
WRITE FROM statement. The DD statement for the file contains the DSNAME of
the data set given in the NAME parameter of the DEFINE CLUSTER command.
The RBA of the records could have been obtained during the writing for subsequent
use as keys in a KEYED file. To do this, a suitable variable would have to be
declared to hold the key and the WRITE...KEYTO statement used. For example:
DCL CHARS CHAR(4);
WRITE FILE(FAMFILE) FROM (STRING)
KEYTO(CHARS);
Note that the keys would not normally be printable, but could be retained for
subsequent use.
The cataloged procedure IBMZCBG is used. Because the same program (in
Figure 36 on page 208) can be used for adding records to the data set, it is
retained in a library. This procedure is shown in the next example.
DCL
FAMFILE FILE SEQUENTIAL OUTPUT ENV(VSAM),
IN FILE RECORD INPUT,
STRING CHAR(8K),
EOF BIT(1) INIT('K'B);
ON ENDFILE(IN) EOF='1'B;
Updating an ESDS
Figure 37 shows the addition of a new record on the end of an ESDS. This is
done by executing again the program shown in Figure 36. A SEQUENTIAL
OUTPUT file is used and the data set associated with it by use of the DSNAME
parameter specifying the name PLIVSAM.AJC1.BASE specified in the DEFINE
command shown in Figure 36.
//OPT9#8 JOB
//STEP1 EXEC PGM=PGMA
//STEPLIB DD DSN=HPU8.MYDS(PGMA),DISP=(OLD,KEEP)
// DD DSN=CEE.SCEERUN,DISP=SHR
//SYSPRINT DD SYSOUT=A
//FAMFILE DD DSN=PLIVSAM.AJC1.BASE,DISP=SHR
//IN DD ]
JANE 75 F
//
You can rewrite existing records in an ESDS, provided that the length of the record
is not changed. You can use a SEQUENTIAL or KEYED SEQUENTIAL update file
Table 26 (Page 1 of 2). Statements and options allowed for loading and accessing VSAM
indexed data sets
File Valid statements, with options Other options you can
declaration1 you must include also include
SEQUENTIAL OUTPUT WRITE FILE(file-reference)
BUFFERED FROM(reference)
KEYFROM(expression);
WRITE FILE(file-reference)
FROM(reference)
KEYFROM(expression);
READ FILE(file-reference)
SET(pointer-reference)
KEY(expression);
DIRECT OUTPUT WRITE FILE(file-reference)
BUFFERED FROM(reference)
KEYFROM(expression);
READ FILE(file-reference)
SET(pointer-reference)
KEY(expression);
REWRITE FILE(file-reference)
FROM(reference)
KEY(expression);
DELETE FILE(file-reference)
KEY(expression);
WRITE FILE(file-reference)
FROM(reference)
KEYFROM(expression);
Notes:
1. The complete file declaration would include the attributes FILE and RECORD. If you use any of the
options KEY, KEYFROM, or KEYTO, you must also include the attribute KEYED in the declaration.
2. The statement READ FILE(file-reference); is equivalent to the statement READ FILE(file-reference)
IGNORE(1);
3. Do not associate a SEQUENTIAL OUTPUT file with a data set accessed via an alternate index.
4. Do not associate a DIRECT file with a data set accessed via a nonunique alternate index.
5. DELETE statements are not allowed for a file associated with an ESDS accessed via an alternate
index.
If a KSDS already contains some records, and you open the associated file with the
SEQUENTIAL and OUTPUT attributes, you can add only records at the end of the
data set. The rules given in the previous paragraph apply; in particular, the first
record you present must have a key greater than the highest key present on the
data set.
Figure 38 on page 211 shows the DEFINE command used to define a KSDS. The
data set is given the name PLIVSAM.AJC2.BASE and defined as a KSDS because
of the use of the INDEXED operand. The position of the keys within the record is
defined in the KEYS operand.
Within the PL/I program, a KEYED SEQUENTIAL OUTPUT file is used with a
WRITE...FROM...KEYFROM statement. The data is presented in ascending key
order. A KSDS must be loaded in this manner.
The file is associated with the data set by a DD statement which uses the name
given in the DEFINE command as the DSNAME parameter.
ON ENDFILE(SYSIN) EOF='1'B;
CLOSE FILE(DIREC);
END TELNOS;
/]
//GO.DIREC DD DSNAME=PLIVSAM.AJC2.BASE,DISP=OLD
//GO.SYSIN DD ]
ACTION,G. 162
BAKER,R. 152
BRAMLEY,O.H. 248
CHEESEMAN,D. 141
CORY,G. 336
ELLIOTT,D. 875
FIGGINS,S. 413
HARVEY,C.D.W. 2K5
HASTINGS,G.M. 391
KENDALL,J.G. 294
LANCASTER,W.R. 624
MILES,R. 233
NEWMAN,M.W. 45K
PITT,W.H. 515
ROLF,D.E. 114
SHEERS,C.D. 241
SUTCLIFFE,M. 472
TAYLOR,G.C. 4K7
WILTON,L.W. 4K4
WINSTONE,E.M. 3K7
//
For READ statements without the KEY option, the records are recovered in
ascending key order (or in descending key order if the BKWD option is used). You
can obtain the key of a record recovered in this way by means of the KEYTO
option.
If you use the KEY option, the record recovered by a READ statement is the one
with the specified key. Such a READ statement positions the data set at the
specified record; subsequent sequential reads will recover the following records in
sequence.
WRITE statements with the KEYFROM option are allowed for KEYED
SEQUENTIAL UPDATE files. You can make insertions anywhere in the data set,
without respect to the position of any previous access. If you are accessing the
data set via a unique index, the KEY condition is raised if an attempt is made to
insert a record with the same key as a record that already exists on the data set.
For a nonunique index, subsequent retrieval of records with the same key is in the
order that they were added to the data set.
REWRITE statements with or without the KEY option are allowed for UPDATE files.
If you use the KEY option, the record that is rewritten is the first record with the
specified key; otherwise, it is the record that was accessed by the previous READ
statement. When you rewrite a record using an alternate index, do not change the
prime key of the record.
If you use a DIRECT OUTPUT file to add records to the data set, and if an attempt
is made to insert a record with the same key as a record that already exists, the
KEY condition is raised.
If you use a DIRECT INPUT or DIRECT UPDATE file, you can read, write, rewrite,
or delete records in the same way as for a KEYED SEQUENTIAL file.
Figure 39 on page 213 shows one method by which a KSDS can be updated
using the prime index.
ON ENDFILE(SYSIN) EOF='1'B;
ON KEY(DIREC) BEGIN;
IF ONCODE=51 THEN PUT FILE(SYSPRINT) SKIP EDIT
('NOT FOUND: ',NAME)(A(15),A);
IF ONCODE=52 THEN PUT FILE(SYSPRINT) SKIP EDIT
('DUPLICATE: ',NAME)(A(15),A);
END;
EOF='K'B;
ON ENDFILE(DIREC) EOF='1'B;
A DIRECT update file is used and the data is altered according to a code that is
passed in the records in the file SYSIN:
A Add a new record
C Change the number of an existing name
D Delete a record
At the label NEXT, the name, number, and code are read in and action taken
according to the value of the code. A KEY ON-unit is used to handle any incorrect
keys. When the updating is finished (at the label PRINT), the file DIREC is closed
and reopened with the attributes SEQUENTIAL INPUT. The file is then read
sequentially and printed.
The file is associated with the data set by a DD statement that uses the DSNAME
PLIVSAM.AJC2.BASE defined in the Access Method Services DEFINE CLUSTER
command in Figure 38 on page 211.
The PL/I input/output routines detect that the keys are in sequence and make the
correct requests to VSAM. If the keys are not in sequence, this too is detected and
no error occurs, although the performance advantage is lost.
BLDINDEX: places the pointers to the relevant records in the alternate index.
DEFINE PATH: defines an entity that can be associated with a PL/I file in a DD
statement.
DD statements are required for the INFILE and OUTFILE operands of BLDINDEX
and for the sort files. Care should be taken that the correct names are specified at
the various points.
//OPT9#9 JOB
//STEP1 EXEC PGM=IDCAMS,REGION=512K
//SYSPRINT DD SYSOUT=A
//SYSIN DD ]
DEFINE ALTERNATEINDEX -
(NAME(PLIVSAM.AJC1.ALPHIND) -
VOLUMES(nnnnnn) -
TRACKS(4 1) -
KEYS(15 K) -
RECORDSIZE(2K 4K) -
UNIQUEKEY -
RELATE(PLIVSAM.AJC1.BASE))
/]
//STEP2 EXEC PGM=IDCAMS,REGION=512K
//DD1 DD DSNAME=PLIVSAM.AJC1.BASE,DISP=SHR
//DD2 DD DSNAME=PLIVSAM.AJC1.ALPHIND,DISP=SHR
//SYSPRINT DD SYSOUT=A
//SYSIN DD ]
BLDINDEX INFILE(DD1) OUTFILE(DD2)
DEFINE PATH -
(NAME(PLIVSAM.AJC1.ALPHPATH) -
PATHENTRY(PLIVSAM.AJC1.ALPHIND))
//
Figure 40. Creating a Unique Key Alternate Index Path for an ESDS
BLDINDEX: places the pointers to the relevant records in the alternate index.
DEFINE PATH: defines an entity that can be associated with a PL/I file in a DD
statement.
DD statements are required for the INFILE and OUTFILE operands of BLDINDEX
and for the sort files. Care should be taken that the correct names are specified at
the various points.
The fact that the index has nonunique keys is specified by the use of the
NONUNIQUEKEY operand. When creating an index with nonunique keys, be
careful to ensure that the RECORDSIZE you specify is large enough. In a
nonunique alternate index, each alternate index record contains pointers to all the
records that have the associated index key. The pointer takes the form of an RBA
for an ESDS and the prime key for a KSDS. When a large number of records might
have the same key, a large record is required.
//OPT9#1K JOB
//STEP1 EXEC PGM=IDCAMS,REGION=512K
//SYSPRINT DD SYSOUT=A
//SYSIN DD ]
/] care must be taken with recordsize ]/
DEFINE ALTERNATEINDEX -
(NAME(PLIVSAM.AJC1.SEXIND) -
VOLUMES(nnnnnn) -
TRACKS(4 1) -
KEYS(1 37) -
RECORDSIZE(2K 4KK) -
NONUNIQUEKEY -
RELATE(PLIVSAM.AJC1.BASE))
/]
//STEP2 EXEC PGM=IDCAMS,REGION=512K
//DD1 DD DSNAME=PLIVSAM.AJC1.BASE,DISP=SHR
//DD2 DD DSNAME=PLIVSAM.AJC1.SEXIND,DISP=SHR
//SYSPRINT DD SYSOUT=A
//SYSIN DD ]
BLDINDEX INFILE(DD1) OUTFILE(DD2)
DEFINE PATH -
(NAME(PLIVSAM.AJC1.SEXPATH) -
PATHENTRY(PLIVSAM.AJC1.SEXIND))
//
Figure 41. Creating a Nonunique Key Alternate Index Path for an ESDS
Figure 42 on page 217 shows the creation of a unique key alternate index path for
a KSDS. The data set is indexed by the telephone number, enabling the number to
be used as a key to discover the name of the person on that extension. The fact
that keys are to be unique is specified by UNIQUEKEY. Also, the data set will be
able to be listed in numerical order to show which numbers are not used. The three
Access Method Services commands used are:
BLDINDEX: places the pointer to the relevant records in the alternate index.
DEFINE PATH: defines the entity that can be associated with a PL/I file in a DD
statement.
DD statements are required for the INFILE and OUTFILE of BLDINDEX and for the
sort files. Be careful not to confuse the names involved.
//OPT9#14 JOB
//STEP1 EXEC PGM=IDCAMS,REGION=512K
//SYSPRINT DD SYSOUT=A
//SYSIN DD ]
DEFINE ALTERNATEINDEX -
(NAME(PLIVSAM.AJC2.NUMIND) -
VOLUMES(nnnnnn) -
TRACKS(4 4) -
KEYS(3 2K) -
RECORDSIZE(24 48) -
UNIQUEKEY -
RELATE(PLIVSAM.AJC2.BASE))
/]
//STEP2 EXEC PGM=IDCAMS,REGION=512K
//DD1 DD DSNAME=PLIVSAM.AJC2.BASE,DISP=SHR
//DD2 DD DSNAME=PLIVSAM.AJC2.NUMIND,DISP=SHR
//SYSPRINT DD SYSOUT=A
//SYSIN DD ]
BLDINDEX INFILE(DD1) OUTFILE(DD2)
DEFINE PATH -
(NAME(PLIVSAM.AJC2.NUMPATH) -
PATHENTRY(PLIVSAM.AJC2.NUMIND))
//
Figure 42. Creating a unique Key Alternate Index Path for a KSDS
When creating an alternate index with a unique key, you should ensure that no
further records could be included with the same alternate key. In practice, a unique
key alternate index would not be entirely satisfactory for a telephone directory as it
would not allow two people to have the same number. Similarly, the prime key
would prevent one person having two numbers. A solution would be to have an
ESDS with two nonunique key alternate indexes, or to restructure the data format
to allow more than one number per person and to have a nonunique key alternate
index for the numbers.
BASEFLE
BACKFLE
ALPHFLE
SEXFILE
is the alternate index path that corresponds to the sex of the children.
There are DD statements for all the files. They connect BASEFLE and BACKFLE to
the base data set by specifying the name of the base data set in the DSNAME
parameter, and connect ALPHFLE and SEXFLE by specifying the names of the
paths given in Figure 40 on page 215 and Figure 41 on page 216.
The program uses SEQUENTIAL files to access the data and print it first in the
normal order, then in the reverse order. At the label AGEQUERY, a DIRECT file is
used to read the data associated with an alternate index key in the unique alternate
index.
Finally, at the label SPRINT, a KEYED SEQUENTIAL file is used to print a list of
the females in the family, using the nonunique key alternate index path. The
SAMEKEY built-in function is used to read all the records with the same key. The
names of the females will be accessed in the order in which they were originally
entered. This will happen whether the file is read forward or backward. For a
nonunique key path, the BKWD option only affects the order in which the keys are
read; the order of items with the same key remains the same as it is when the file
is read forward.
Deletion: At the end of the example, the Access Method Services DELETE
command is used to delete the base data set. When this is done, the associated
alternate indexes and paths will also be deleted.
The alternate index path is associated with the PL/I file by a DD statement that
specifies the name of the path (PLIVSAM.AJC2.NUMPATH, given in the DEFINE
PATH command in Figure 42 on page 217) as the DSNAME.
In the first section of the program, a DIRECT OUTPUT file is used to insert a new
record using the alternate index key. Note that any alteration made with an
In the second section of the program (at the label PRINTIT), the data set is read in
the order of the alternate index keys using a SEQUENTIAL INPUT file. It is then
printed onto SYSPRINT.
//OPT9#15 JOB
//STEP1 EXEC IBMZCLG
//PLI.SYSIN DD ]
READIT: PROC OPTIONS(MAIN);
DCL BASEFLE FILE SEQUENTIAL INPUT ENV(VSAM),
/]File to read base data set forward ]/
BACKFLE FILE SEQUENTIAL INPUT ENV(VSAM BKWD),
/]File to read base data set backward ]/
ALPHFLE FILE DIRECT INPUT ENV(VSAM),
/]File to access via unique alternate index path ]/
SEXFILE FILE KEYED SEQUENTIAL INPUT ENV(VSAM),
/]File to access via nonunique alternate index path ]/
STRING CHAR(8K), /]String to be read into ]/
1 STRUC DEF (STRING),
2 NAME CHAR(25),
2 DATE_OF_BIRTH CHAR(2),
2 FILL CHAR(1K),
2 SEX CHAR(1);
DCL NAMEHOLD CHAR(25),SAMEKEY BUILTIN;
DCL EOF BIT(1) INIT('K'B);
ON ENDFILE(BASEFLE) EOF='1'B;
PUT EDIT('FAMILY ELDEST FIRST')(A);
READ FILE(BASEFLE) INTO (STRING);
DO WHILE(¬EOF);
PUT SKIP EDIT(STRING)(A);
READ FILE(BASEFLE) INTO (STRING);
END;
CLOSE FILE(BASEFLE);
PUT SKIP(2);
/]Close before using data set from other file not
necessary but good practice to prevent potential
problems]/
EOF='K'B;
ON ENDFILE(BACKFLE) EOF='1'B;
PUT SKIP(3) EDIT('FAMILY YOUNGEST FIRST')(A);
READ FILE(BACKFLE) INTO(STRING);
DO WHILE(¬EOF);
PUT SKIP EDIT(STRING)(A);
READ FILE(BACKFLE) INTO (STRING);
END;
CLOSE FILE(BACKFLE);
PUT SKIP(2);
Figure 43 (Part 1 of 2). Alternate Index Paths and Backward Reading with an ESDS
/]Use the alternate index to print out all the females in the
family]/
ON ENDFILE(SEXFILE) GOTO FINITO;
PUT SKIP(2) EDIT('ALL THE FEMALES')(A);
READ FILE(SEXFILE) INTO (STRING) KEY('F');
PUT SKIP EDIT(STRING)(A);
DO WHILE(SAMEKEY(SEXFILE));
READ FILE(SEXFILE) INTO (STRING);
PUT SKIP EDIT(STRING)(A);
END;
FINITO:
END;
/]
//GO.BASEFLE DD DSN=PLIVSAM.AJC1.BASE,DISP=SHR
//GO.BACKFLE DD DSN=PLIVSAM.AJC1.BASE,DISP=SHR
//GO.ALPHFLE DD DSN=PLIVSAM.AJC1.ALPHPATH,DISP=SHR
//GO.SEXFILE DD DSN=PLIVSAM.AJC1.SEXPATH,DISP=SHR
//GO.SYSIN DD ]
ANDY
/]
//STEP2 EXEC PGM=IDCAMS,REGION=512K
//SYSPRINT DD SYSOUT=A
//SYSIN DD ]
DELETE -
PLIVSAM.AJC1.BASE
//
Figure 43 (Part 2 of 2). Alternate Index Paths and Backward Reading with an ESDS
ON ENDFILE(IN) EOF='1'B;
CLOSE FILE(NUMFLE1);
EOF='K'B;
ON ENDFILE(NUMFLE2) EOF='1'B;
READ FILE(file-reference)
SET(pointer-reference)
KEY(expression);
READ FILE(file-reference)
SET(pointer-reference)
KEY(expression);
REWRITE FILE(file-reference)
FROM(reference)
KEY(expression);
DELETE FILE(file-reference)
KEY(expression);
WRITE FILE(file-reference)
FROM(reference)
KEYFROM(expression);
Notes:
1. The complete file declaration would include the attributes FILE and RECORD. If you use any of the
options KEY, KEYFROM, or KEYTO, your declaration must also include the attribute KEYED.
The UNLOCK statement for DIRECT UPDATE files is ignored if you use it for files associated with a
VSAM RRDS.
2. The statement READ FILE(file-reference); is equivalent to the statement READ FILE(file-reference)
IGNORE(1);
Loading an RRDS
When an RRDS is being loaded, you must open the associated file for OUTPUT.
Use either a DIRECT or a SEQUENTIAL file.
For a DIRECT OUTPUT file, each record is placed in the position specified by the
relative record number (or key) in the KEYFROM option of the WRITE statement
(see “Keys for VSAM data sets” on page 200).
For a SEQUENTIAL OUTPUT file, use WRITE statements with or without the
KEYFROM option. If you specify the KEYFROM option, the record is placed in the
specified slot; if you omit it, the record is placed in the slot following the current
position. There is no requirement for the records to be presented in ascending
relative record number order. If you omit the KEYFROM option, you can obtain the
relative record number of the written record by means of the KEYTO option.
If you want to load an RRDS sequentially, without use of the KEYFROM or KEYTO
options, your file is not required to have the KEYED attribute.
In Figure 45 on page 224, the data set is defined with a DEFINE CLUSTER
command and given the name PLIVSAM.AJC3.BASE. The fact that it is an RRDS
is determined by the NUMBERED keyword. In the PL/I program, it is loaded with a
DIRECT OUTPUT file and a WRITE...FROM...KEYFROM statement is used.
The PL/I file is associated with the data set by the DD statement, which uses as
the DSNAME the name given in the DEFINE CLUSTER command.
//OPT9#17 JOB
//STEP1 EXEC PGM=IDCAMS,REGION=512K
//SYSPRINT DD SYSOUT=A
//SYSIN DD ]
DEFINE CLUSTER -
(NAME(PLIVSAM.AJC3.BASE) -
VOLUMES(nnnnnn) -
NUMBERED -
TRACKS(2 2) -
RECORDSIZE(2K 2K))
/]
//STEP2 EXEC IBMZCBG
//PLI.SYSIN DD ]
CRR1: PROC OPTIONS(MAIN);
DCL NOS FILE RECORD OUTPUT DIRECT KEYED ENV(VSAM),
CARD CHAR(8K),
NAME CHAR(2K) DEF CARD,
NUMBER CHAR(2) DEF CARD POS(21),
IOFIELD CHAR(2K),
EOF BIT(1) INIT('K'B);
ON ENDFILE (SYSIN) EOF='1'B;
OPEN FILE(NOS);
GET FILE(SYSIN) EDIT(CARD)(A(8K));
DO WHILE (¬EOF);
PUT FILE(SYSPRINT) SKIP EDIT (CARD) (A);
IOFIELD=NAME;
WRITE FILE(NOS) FROM(IOFIELD) KEYFROM(NUMBER);
GET FILE(SYSIN) EDIT(CARD)(A(8K));
END;
CLOSE FILE(NOS);
END CRR1;
Figure 45 (Part 1 of 2). Defining and loading a relative-record data set (RRDS)
Figure 45 (Part 2 of 2). Defining and loading a relative-record data set (RRDS)
For READ statements without the KEY option, the records are recovered in
ascending relative record number order. Any empty slots in the data set are
skipped.
If you use the KEY option, the record recovered by a READ statement is the one
with the relative record number you specify. Such a READ statement positions the
data set at the specified record; subsequent sequential reads will recover the
following records in sequence.
WRITE statements with or without the KEYFROM option are allowed for KEYED
SEQUENTIAL UPDATE files. You can make insertions anywhere in the data set,
regardless of the position of any previous access. For WRITE with the KEYFROM
option, the KEY condition is raised if an attempt is made to insert a record with the
same relative record number as a record that already exists on the data set. If you
omit the KEYFROM option, an attempt is made to write the record in the next slot,
relative to the current position. The ERROR condition is raised if this slot is not
empty.
You can use the KEYTO option to recover the key of a record that is added by
means of a WRITE statement without the KEYFROM option.
REWRITE statements, with or without the KEY option, are allowed for UPDATE
files. If you use the KEY option, the record that is rewritten is the record with the
DELETE statements, with or without the KEY option, can be used to delete records
from the dataset.
Figure 46 on page 227 shows an RRDS being updated. A DIRECT UPDATE file
is used and new records are written by key. There is no need to check for the
records being empty, because the empty records are not available under VSAM.
In the second half of the program, starting at the label PRINT, the updated file is
printed out. Again there is no need to check for the empty records as there is in
REGIONAL(1).
The PL/I file is associated with the data sets by a DD statement that specifies the
DSNAME PLIVSAM.AJC3.BASE, the name given in the DEFINE CLUSTER
command in Figure 46 on page 227.
At the end of the example, the DELETE command is used to delete the data set.
If you want to avoid details, the least complex way to improve the performance of
generated code is to specify the following (nondefault) compiler options:
OPT(2)
DFT(REORDER)
OPTIMIZE
You can specify the OPTIMIZE option to improve the speed of your program;
otherwise, the compiler makes only basic optimization efforts.
GONUMBER
Using this option results in a statement number table used for debugging. This
added information can be extremely helpful when debugging, but including
statement number tables increases the size of your executable file. Larger
executable files can take longer to load.
ARCH
Using ARCH(4) allows the compiler to select from the largest set of instructions
available under z/OS and OS/390 and thus permits it to generate the most optimal
code.
REDUCE
The REDUCE option specifies that the compiler is permitted to reduce an
assignment of a null string to a structure into a simple copy operation - even if that
means padding bytes might be overwritten.
The REDUCE option will cause less executable code to be generated for an
assignment of a null string to a structure, and that will usually mean your code will
run much faster. However, under the REDUCE option, any assignment of a null
string to a structure that is reduced to a simple copy will also cause any padding
bytes in that structure to be filled with '00'x.
For instance, in the following structure, there is one byte of padding between
field11 and field12. Under the NOREDUCE option, the assignment struc = ''; will
cause four assignments to be generated, but the padding byte will be unchanged.
However, under the REDUCE option, the assignment would be reduced to one
simple copy (a MVC), but the padding byte will be set to a '00'x.
dcl
1 struc,
5 field1K bin fixed(31),
5 field11 dec fixed(13)
5 field12 bin fixed(15),
5 field13 char(2);
RULES
Most of the RULES suboptions affect only the severity with which certain coding
practices, such as not declaring variables, are flagged and have no impact on
performance. However, these suboptions do have an impact on performance.
IBM/ANS
When you use the RULES(IBM) option, the compiler supports scaled FIXED
BINARY and, what is more important for performance, generates scaled FIXED
BINARY results in some operations. Under RULES(ANS), scaled FIXED BINARY
is not supported and scaled FIXED BINARY results are never generated. This
means that the code generated under RULES(ANS) always runs at least as fast as
the code generated under RULES(IBM), and sometimes runs faster.
Under RULES(ANS), the result of the division has the attributes FIXED BIN(15,0).
This means that a shift is not needed before the division, and no extra instructions
are needed to perform the assignment.
(NO)LAXCTL
Under RULES(LAXCTL), a CONTROLLED variable may be declared with constant
extents and yet allocated with different extents.
PREFIX
This option determines if selected PL/I conditions are enabled by default. The
default suboptions for PREFIX are set to conform to the PL/I language definition;
however, overriding the defaults can have a significant effect on the performance of
your program. The default suboptions are:
CONVERSION
INVALIDOP
FIXEDOVERFLOW
OVERFLOW
INVALIDOP
NOSIZE
NOSTRINGRANGE
NOSTRINGSIZE
NOSUBSCRIPTRANGE
UNDERFLOW
ZERODIVIDE
CONVERSION
When you disable the CONVERSION condition, some character-to-numeric
conversions are done inline and without checking the validity of the source;
therefore, specifying NOCONVERSION also affects program performance.
FIXEDOVERFLOW
On some platforms, the FIXEDOVERFLOW condition is raised by the hardware and
the compiler does not need to generate any extra code to detect it.
DEFAULT
Using the DEFAULT option, you can select attribute defaults. As is true with the
PREFIX option, the suboptions for DEFAULT are set to conform to the PL/I
language definition. Changing the defaults in some instances can affect
performance.
BYADDR or BYVALUE
When the DEFAULT(BYADDR) option is in effect, arguments are passed by
reference (as required by PL/I) unless an attribute in an entry declaration indicates
otherwise. As arguments are passed by reference, the address of the argument is
passed from one routine (calling routine) to another (called routine) as the variable
itself is passed. Any change made to the argument while in the called routine is
reflected in the calling routine when it resumes execution.
Consequently, you should pass parameters by value using the BYVALUE suboption
whenever your program logic allows. Even if you use the BYADDR attribute to
indicate that one parameter should be passed by reference, you can use the
DEFAULT(BYVALUE) option to ensure that all other parameters are passed by
value.
/] program logic ]/
end;
/] program logic ]/
return( parm1 );
end;
(NON)CONNECTED
The DEFAULT(NONCONNECTED) option indicates that the compiler assumes that
any aggregate parameters are NONCONNECTED. References to elements of
NONCONNECTED aggregate parameters require the compiler to generate code to
access the parameter's descriptor, even if the aggregate is declared with constant
extents.
The compiler does not generate these instructions if the aggregate parameter has
constant extents and is CONNECTED. Consequently, if your application never
passes nonconnected parameters, your code is more optimal if you use the
DEFAULT(CONNECTED) option.
(NO)DESCRIPTOR
The DEFAULT(DESCRIPTOR) option indicates that, by default, a descriptor is
passed for any string, area, or aggregate parameter; however, the descriptor is
used only if the parameter has nonconstant extents or if the parameter is an array
with the NONCONNECTED attribute. In this case, the instructions and space
required to pass the descriptor provide no benefit and incur substantial cost (the
size of a structure descriptor is often greater than size of the structure itself).
Consequently, by specifying DEFAULT(NODESCRIPTOR) and using
OPTIONS(DESCRIPTOR) only as needed on PROCEDURE statements and
ENTRY declarations, your code runs more optimally.
(NO)INLINE
The suboption NOINLINE indicates that procedures and begin blocks should not be
inlined.
Inlining user code eliminates the overhead of the function call and linkage, and also
exposes the function's code to the optimizer, resulting in faster code performance.
Inlining produces the best results when the overhead for the function is nontrivial,
for example, when functions are called within nested loops. Inlining is also
beneficial when the inlined function provides additional opportunities for
optimization, such as when constant arguments are used.
When you use inlining, you need more stack space. When a function is called, its
local storage is allocated at the time of the call and freed when it returns to the
calling function. If that same function is inlined, its storage is allocated when the
function that calls it is entered, and is not freed until that calling function ends.
Ensure that you have enough stack space for the local storage of the inlined
functions.
LINKAGE
This suboption tells the compiler the default linkage to use when the LINKAGE
suboption of the OPTIONS attribute or option for an entry has not been specified.
The compiler supports various linkages, each with its unique performance
characteristics. When you invoke an ENTRY provided by an external entity (such
as an operating system), you must use the linkage previously defined for that
ENTRY.
As you create your own applications, however, you can choose the linkage
convention. The OPTLINK linkage is strongly recommended because it provides
significantly better performance than other linkage conventions.
(RE)ORDER
The DEFAULT(ORDER) option indicates that the ORDER option is applied to every
block, meaning that variables in that block referenced in ON-units (or blocks
dynamically descendant from ON-units) have their latest values. This effectively
prohibits almost all optimization on such variables. Consequently, if your program
logic allows, use DEFAULT(REORDER) to generate superior code.
NOOVERLAP
The DEFAULT(NOOVERALP) option lets the compiler assume that the source and
target in an assignment do not overlap, and it can therefore generate smaller and
faster code.
However, if you this option, you must insure that the source and target in
assignment do not overlap. For example, under the DEFAULT( NOOVERLAP )
option, the assignment in this example would be invalid:
dcl c char(2K);
substr(c,2,5) = substr(c,1,5);
RETURNS(BYVALUE) or RETURNS(BYADDR)
When the DEFAULT(RETURNS(BYVALUE)) option is in effect, the BYVALUE
attribute is applied to all RETURNS description lists that do not specify BYADDR.
This means that these functions return values in registers, when possible, in order
to produce the most optimal code.
on error
begin;
on error system;
..
.
put data;
..
.
end;
In this case, the program would perform more optimally by including a list of
selected variables with the PUT DATA statement.
Input-only parameters
If a procedure has a BYADDR parameter which it uses as input only, it is best to
declare that parameter as NONASSIGNABLE (rather than letting it get the default
attribute of ASSIGNABLE). If that procedure is later called with a constant for that
parameter, the compiler can put that constant in static storage and pass the
address of that static area.
This practice is particularly useful for strings and other parameters that cannot be
passed in registers (input-only parameters that can be passed in registers are best
declared as BYVALUE).
If this function is invoked with the string 'IBM_OPTIONS', the compiler can pass the
address of that string rather than assigning it to a compiler-generated temporary
storage area and passing the address of that area.
GOTO statements
A GOTO statement that uses either a label in another block or a label variable
severely limits optimizations that the compiler might perform. If a label array is
initialized and declared AUTOMATIC, either implicitly or explicitly, any GOTO to an
element of that array will hinder optimization. However, if the array is declared as
STATIC, the compiler assumes the CONSTANT attribute for it and no optimization
is hindered.
String assignments
When one string is assigned to another, the compiler ensures that:
The target has the correct value even if the source and target overlap.
The source string is truncated if it is longer than the target.
This assurance comes at the price of some extra instructions. The compiler
attempts to generate these extra instructions only when necessary, but often you,
as the programmer, know they are not necessary when the compiler cannot be
sure. For instance, if the source and target are based character strings and you
know they cannot overlap, you could use the PLIMOVE built-in function to eliminate
the extra code the compiler would otherwise be forced to generate.
In the example which follows, faster code is generated for the second assignment
statement:
dcl based_Str char(64) based( null() );
dcl target_Addr pointer;
dcl source_Addr pointer;
target_Addr->based_Str = source_Addr->based_Str;
If you have any doubts about whether the source and target might overlap or
whether the target is big enough to hold the source, you should not use the
PLIMOVE built-in.
Performance also improves if loop control variables are not members of arrays,
structures, or unions. The compiler issues a warning message when they are.
Loop control variables that are AUTOMATIC and not used for any other purpose
give you the optimal code generation.
Performance is decreased if your program depends not only on the value of a loop
control variable, but also on its address. For example, if the ADDR built-in function
is applied to the variable or if the variable is passed BYADDR to another routine.
If procedure b in “Example with nested procedures” does not use any of the
variables declared in a, you can improve the performance of both procedures by
reorganizing them into the package illustrated in “Example with packaged
procedures.”
a: proc;
b: proc( px );
dcl px pointer;
display( px->ib );
end;
end p;
REDUCIBLE Functions
REDUCIBLE indicates that a procedure or entry need not be invoked multiple times
if the argument(s) stays unchanged, and that the invocation of the procedure has
no side effects.
In the following example, f is invoked only once since REDUCIBLE is part of the
declaration. If IRREDUCIBLE had been used in the declaration, f would be invoked
twice.
select;
when( f(x) < K )
..
.
when( f(x) > K )
..
.
otherwise
..
.
end;
DESCLOCATOR or DESCLIST
When the DEFAULT(DESCLOCATOR) option is in effect, the compiler passes
arguments requiring descriptors (such as strings and structures) via a descriptor
locator in much the same way that the old compiler did. More information on
descriptors and how they are passed is available in Chapter 20, “PL/I - Language
Environment descriptors” on page 357.
This option allows you to invoke an entry point that is not always passed all of the
arguments that it declares.
This option also allows you to continue the somewhat unwise programming practice
of passing a structure and receiving it as a pointer.
In the following example, the pair of variables b3 and b4 perform the same function
as b1 and b2, but the compiler generates more optimal code for the pair in the
union.
dcl b1 bit(31);
dcl b2 bit(16) def b1;
dcl
1 ] union,
2 b3 bit(32),
2 b4 bit(16);
Code that uses UNIONs instead of the DEFINED attribute is subject to less
misinterpretation. Variable declarations in unions are in a single location making it
easy to realize that when one member of the union changes, all of the others
change also. This dynamic change is less obvious in declarations that use
DEFINED variables since the declare statements can be several lines apart.
The compiler generates better code whenever expressions are evaluated during
compilation, so you can use named constants to produce efficient code with no loss
in readability. For example, identical object code is produced for the two usages of
the VERIFY built-in function in the following example:
dcl numeric char value('K123456789');
The following examples illustrate how you can use the VALUE attribute to get
optimal code without sacrificing readability.
select( x );
when( 'K1'b4 )
..
.
when( 'K2'b4 )
..
.
when( 'K3'b4 )
..
.
end;
select( x );
when( a1 )
..
.
when( a2 )
..
.
when( a3 )
..
.
end;
select( x );
when( a1 )
..
.
when( a2 )
..
.
when( a3 )
..
.
end;
For certain assignments, expressions, and built-in function references, the compiler
generates calls to library routines. If you avoid these calls, your code generally
runs faster.
To help you determine when the compiler generates such calls, the compiler
generates a message whenever a conversion is done using a library routine.
When used from PL/I, the Sort program sorts records of all normal lengths on a
large number of sorting fields. Data of most types can be sorted into ascending or
descending order. The source of the data to be sorted can be either a data set or
a user-written PL/I procedure that the Sort program will call each time a record is
required for the sort. Similarly, the destination of the sort can be a data set or a
PL/I procedure that handles the sorted records.
Using PL/I procedures allows processing to be done before or after the sort itself,
thus allowing a complete sorting operation to be handled completely by a call to the
sort interface. It is important to understand that the PL/I procedures handling input
or output are called from the Sort program itself and will effectively become part of
it.
PL/I can operate with DFSORT or a program with the same interface. DFSORT
is a release of the program product 5740-SM1. DFSORT has many built-in
features you can use to eliminate the need for writing program logic (for example,
INCLUDE, OMIT, OUTREC and SUM statement plus the many ICETOOL
operators). See DFSORT Application Programming Guide for details and Getting
Started with DFSORT for a tutorial.
The following material applies to DFSORT. Because you can use programs other
than DFSORT, the actual capabilities and restrictions vary. For these capabilities
and restrictions, see DFSORT Application Programming Guide, or the equivalent
publication for your sort product.
To use the Sort program you must include the correct PL/I statements in your
source program and specify the correct data sets in your JCL.
To determine the PLISRTx entry point that you will use, you must decide the
source of your unsorted data, and the destination of your sorted data. You must
choose between data sets and PL/I subroutines. Using data sets is simpler to
understand and gives faster performance. Using PL/I subroutines gives you more
flexibility and more function, enabling you to manipulate or print the data before it is
sorted, and to make immediate use of it in its sorted form. If you decide to use an
The entry points and the source and destination of data are as follows:
Having determined the entry point you are using, you must now determine the
following things about your data set:
The position of the sorting fields; these can be either the complete record or
any part or parts of it
The type of data these fields represent, for example, character or binary
Whether you want the sort on each field to be in ascending or descending
order
Whether you want equal records to be retained in the order of the input, or
whether their order can be altered during sorting
Specify these options on the SORT statement, which is the first argument to
PLISRTx. After you have determined these, you must determine two things about
the records to be sorted:
Whether the record format is fixed or varying
The length of the record, which is the maximum length for varying
Finally, you must decide on the amount of main and auxiliary storage you will allow
for the Sort program. For further details, see “Determining storage needed for Sort”
on page 251.
The sort interface routine builds an argument list for the Sort program from the
information supplied by the PLISRTx argument list and the choice of PLISRTx entry
┌──────────────┐
│ │
│ CALL PLISRTx │
│ │
└──┬──┬──┬──┬──┘
│ │ │ │
┌────────────────────────────┘ │ │ └────────────────────────────┐
│ ┌─────────┘ └─────────┐ │
PLISRTA PLISRTB PLISRTC PLISRTD
│ │ │ │
┌───────────┴─────────────────────┴──────────────────────┴─────────────────────┴───────────┐
│ SORT PROGRAM │
├───────────┬─────────────────────┬──────────────────────┬─────────────────────┬───────────┤
│ │
│ ┌─────────┴────────┐ ┌─────────┴─────────┐ ┌─────────┴────────┐ ┌─────────┴─────────┐ │
│ │ Get records from │ │ Call PL/I sub─ │ │ Get records from │ │ Call PL/I sub─ │ │
│ │ data set till │ │ routine receiving │ │ data set till │ │ routine receiving
│ │ end of file │ │ one record on │ │ end of file │ │ one record on │ │
│ │ │ │ each call │ │ │ │ each call │ │
│ └─────────┬────────┘ └─────────┬─────────┘ └─────────┬────────┘ └─────────┬─────────┘ │
│ │ │ │ │ │
│ │ └─────────┐ ┌─────────┘ │ │
│ └────────────────────────────┐ │ │ ┌────────────────────────────┘ │
│ │ │ │ │ │
│ │
│ ┌──┴──┴──┴──┴──┐ │
│ │ │ │
│ │ Sort records │ │
│ │ │ │
│ └──┬──┬──┬──┬──┘ │
│ │ │ │ │ │
│ ┌────────────────────────────┘ │ │ └────────────────────────────┐ │
│ │ ┌─────────┘ └─────────┐ │ │
│ │ │ │ │ │
│ │
│ ┌─────────┴────────┐ ┌─────────┴─────────┐ ┌─────────┴────────┐ ┌─────────┴─────────┐ │
│ │ Place sorted │ │ Place sorted │ │ Call PL/I sub─ │ │ Call PL/I sub─ │ │
│ │ records on │ │ records on │ │ routine passing │ │ routine passing │ │
│ │ data set │ │ data set │ │ one record on │ │ one record on │ │
│ │ │ │ │ │ each call │ │ each call │ │
│ └─────────┬────────┘ └─────────┬─────────┘ └─────────┬────────┘ └─────────┬─────────┘ │
│ │ │ │ │ │
│ │ └─────────┐ ┌─────────┘ │ │
│ └────────────────────────────┐ │ │ ┌────────────────────────────┘ │
│ │ │ │ │ │
│ │
│ ┌──────┴──┴──┴──┴──────┐ │
│ │ Set up return code │ │
│ │ to indicate success │ │
│ │ or failure of sort │ │
│ └──────────┬───────────┘ │
│ │ │
└────────────────────────────────────────────┼─────────────────────────────────────────────┘
│
┌───────┴───────┐
│ Continue with │
│ PL/I program │
└───────────────┘
The important points to remember about Sort are: (1) it is a self-contained program
that handles the complete sort operation, and (2) it communicates with the caller,
and with the user exits that it calls, by means of return codes.
The remainder of this chapter gives detailed information on how to use Sort from
PL/I. First the required PL/I statements are described, and then the data set
requirements. The chapter finishes with a series of examples showing the use of
the four entry points of the sort interface routine.
For example:
' SORT FIELDS=(1,1K,CH,A) '
b represents one or more blanks. Blanks shown are mandatory. No other blanks
are allowed.
start,length,form,seq
defines a sorting field. You can specify any number of sorting fields, but there
is a limit on the total length of the fields. If more than one field is to be sorted
on, the records are sorted first according to the first field, and then those that
are of equal value are sorted according to the second field, and so on. If all
the sorting values are equal, the order of equal records will be arbitrary unless
you use the EQUALS option. (See later in this definition list.) Fields can
overlay each other.
For DFSORT (5740-SM1), the maximum total length of the sorting fields is
restricted to 4092 bytes and all sorting fields must be within 4092 bytes of the
start of the record. Other sort products might have different restrictions.
start is the starting position within the record. Give the value in bytes except
for binary data where you can use a “byte.bit” notation. The first byte in
a string is considered to be byte 1, the first bit is bit 0. (Thus the
second bit in byte 2 is referred to as 2.1.) For varying length records
you must include the 4-byte length prefix, making 5 the first byte of
data.
length is the length of the sorting field. Give the value in bytes except for
binary where you can use “byte.bit” notation. The length of sorting
fields is restricted according to their data type.
other options
You can specify a number of other options, depending on your Sort program.
You must separate them from the FIELDS operand and from each other by
commas. Do not place blanks between operands.
FILSZ=y
specifies the number of records in the sort and allows for optimization by
Sort. If y is only approximate, E should precede y.
SKIPREC=y
specifies that y records at the start of the input file are to be ignored before
sorting the remaining records.
CKPT or CHKPT
specifies that checkpoints are to be taken. If you use this option, you must
provide a SORTCKPT data set and DFSORT's 16NCKPT=NO installation
option must be specified.
EQUALS|NOEQUALS
specifies whether the order of equal records will be preserved as it was in
the input (EQUALS) or will be arbitrary (NOEQUALS). You could improve
sort performance by using the NOEQUALS. The default option is chosen
when Sort is installed. The IBM-supplied default is NOEQUALS.
DYNALLOC=(d,n)
(OS/VS Sort only) specifies that the program dynamically allocates
intermediate storage.
For example:
' RECORD TYPE=F,LENGTH=(8K) '
b represents one or more blanks. Blanks shown are mandatory. No other blanks
are allowed.
TYPE
specifies the type of record as follows:
F fixed length
V varying length EBCDIC
D varying length ASCII
Even when you use input and output routines to handle the unsorted and
sorted data, you must specify the record type as it applies to the work data sets
used by Sort.
If varying length strings are passed to Sort from an input routine (E15 exit), you
should normally specify V as a record format. However, if you specify F, the
records are padded to the maximum length with blanks.
LENGTH
specifies the length of the record to be sorted. You can omit LENGTH if you
use PLISRTA or PLISRTC, because the length will be taken from the input data
set. Note that there is a restriction on the maximum and minimum length of the
record that can be sorted (see below). For varying length records, you must
include the four-byte prefix.
11 is the length of the record to be sorted. For VSAM data sets sorted as
varying records it is the maximum record size+4.
,, represent two arguments that are not applicable to Sort when called from
PL/I. You must include the commas if the arguments that follow are
used.
14 specifies the minimum length of record when varying length records are
used. If supplied, it is used by Sort for optimization purposes.
15 specifies the modal (most common) length of record when varying length
records are used. If supplied, it is used by Sort for optimization
purposes.
Main storage
Sort requires both main and auxiliary storage. The minimum main storage for
DFSORT is 88K bytes, but for best performance, more storage (on the order of 1
megabyte or more) is recommended. DFSORT can take advantage of storage
above 16M virtual or extended architecture processors. Under OS/390, DFSORT
can also take advantage of expanded storage. You can specify that Sort use the
maximum amount of storage available by passing a storage parameter in the
following manner:
DCL MAXSTOR FIXED BINARY (31,K);
UNSPEC(MAXSTOR)='KKKKKKKK'B||UNSPEC('MAX');
CALL PLISRTA
(' SORT FIELDS=(1,8K,CH,A) ',
' RECORD TYPE=F,LENGTH=(8K) ',
MAXSTOR,
RETCODE,
'TASK');
If files are opened in E15 or E35 exit routines, enough residual storage should be
allowed for the files to open successfully.
Auxiliary storage
Calculating the minimum auxiliary storage for a particular sorting operation is a
complicated task. To achieve maximum efficiency with auxiliary storage, use direct
access storage devices (DASDs) whenever possible. For more information on
improving program efficiency, see the DFSORT Application Programming Guide,
particularly the information about dynamic allocation of workspace which allows
DFSORT to determine the auxiliary storage needed and allocate it for you.
If you are interested only in providing enough storage to ensure that the sort will
work, make the total size of the SORTWK data sets large enough to hold three sets
of the records being sorted. (You will not gain any advantage by specifying more
than three if you have enough space in three data sets.)
The examples below indicate the form that the CALL PLISRTx statement normally
takes.
Example 2
This example is the same as example 1 except that the input, output, and work
data sets are called TASKIN, TASKOUT, TASKWK01, and so forth. This might
occur if Sort was being called twice in one job step.
CALL PLISRTA (' SORT FIELDS=(1,8K,CH,A) ',
' RECORD TYPE=F,LENGTH=(8K) ',
1K48576,
RETCODE,
'TASK');
Example 3
This example is the same as example 1 except that the sort is to be undertaken on
two fields. First, bytes 1 to 10 which are characters, and then, if these are equal,
bytes 11 and 12 which contain a binary field, both fields are to be sorted in
ascending order.
CALL PLISRTA (' SORT FIELDS=(1,1K,CH,A,11,2,BI,A) ',
' RECORD TYPE=F,LENGTH=(8K) ',
1K48576,
RETCODE);
Example 4
This example shows a call to PLISRTB. The input is to be passed to Sort by the
PL/I routine PUTIN, the sort is to be carried out on characters 1 to 10 of an 80 byte
fixed length record. Other information as above.
CALL PLISRTB (' SORT FIELDS=(1,1K,CH,A) ',
' RECORD TYPE=F,LENGTH=(8K) ',
1K48576,
RETCODE,
PUTIN);
Example 5
This example shows a call to PLISRTD. The input is to be supplied by the PL/I
routine PUTIN and the output is to be passed to the PL/I routine PUTOUT. The
record to be sorted is 84 bytes varying (including the length prefix). It is to be
sorted on bytes 1 through 5 of the data in ascending order, then if these fields are
equal, on bytes 6 through 10 in descending order. (Note that the 4-byte length
prefix is included so that the actual values used are 5 and 10 for the starting
points.) If both these fields are the same, the order of the input is to be retained.
(The EQUALS option does this.)
You must declare the variable to which the return code is passed as FIXED
BINARY (31,0). It is standard practice to test the value of the return code after the
CALL PLISRTx statement and take appropriate action according to the success or
failure of the operation.
If the job step that follows the sort depends on the success or failure of the sort,
you should set the value returned in the Sort program as the return code from the
PL/I program. This return code is then available for the following job step. The
PL/I return code is set by a call to PLIRETC. You can call PLIRETC with the value
returned from Sort thus:
CALL PLIRETC(RETCODE);
You should not confuse this call to PLIRETC with the calls made in the input and
output routines, where a return code is used for passing control information to Sort.
When you call Sort, certain sort data sets must not be open. These are:
SYSOUT
A data set (normally the printer) on which messages from the Sort program will
be written.
Note: If you specify more than 32 sort work data sets, DFSORT will only use
the first 32.
****WK01–****WK32
From 1 to 32 working data sets used in the sorting process. These must be
direct-access. For a discussion of space required and number of data sets,
see “Determining storage needed for Sort” on page 251.
**** represents the four characters that you can specify as the data set prefix
argument in calls to PLISRTx. This allows you to use data sets with prefixes
other than SORT. They must start with an alphabetic character and must not
be the names PEER, BALN, CRCX, OSCL, POLY, SYSC, LIST, or DIAG.
SORTIN
****IN
The input data set used when PLISRTA and PLISRTC are called.
See ****WK01–****WK32 above for a detailed description.
SORTOUT
****OUT
The output data set used when PLISRTA and PLISRTB are called.
See ****WK01–****WK32 above for a detailed description.
SORTCKPT
Data set used to hold checkpoint data, if CKPT or CHKPT option was used in
the SORT statement argument and DFSORT's 16NCKPT=NO installation
option was specified. For information on this program DD statement, see
DFSORT Application Programming Guide.
DFSPARM
SORTCNTL
Data set from which additional or changed control statements can be read
(optional). For additional information on this program DD statement, see
DFSORT Application Programming Guide.
PLISRTA is the simplest of all of the interfaces because it sorts from data set to
data set. An example of a PLISRTA program is in Figure 51 on page 260. Other
interfaces require either the input handling routine or the output handling routine, or
both.
The routines are called individually for each record required by Sort or passed from
Sort. Therefore, each routine must be written to handle one record at a time.
Variables declared as AUTOMATIC within the procedures will not retain their values
between calls. Consequently, items such as counters, which need to be retained
from one call to the next, should either be declared as STATIC or be declared in
the containing block.
The input handling routine is used by Sort when a call is made to either PLISRTB
or PLISRTD. When Sort requires a record, it calls the input routine which should
return a record in character string format, with a return code of 12. This return
code means that the record passed is to be included in the sort. Sort continues to
call the routine until a return code of 8 is passed. A return code of 8 means that all
records have already been passed, and that Sort is not to call the routine again. If
a record is returned when the return code is 8, it is ignored by Sort.
The data returned by the routine must be a character string. It can be fixed or
varying. If it is varying, you should normally specify V as the record format in the
RECORD statement which is the second argument in the call to PLISRTx.
However, you can specify F, in which case the string will be padded to its
maximum length with blanks. The record is returned with a RETURN statement,
and you must specify the RETURNS attribute in the PROCEDURE statement. The
return code is set in a call to PLIRETC. A flowchart for a typical input routine is
shown in Figure 48 on page 257.
START START
LAST RECEIVE
RECORD YES CALL
PLIRETC(8) RECORD
ALREADY
SENT PARAMETER
NO
CALL CALL
PLIRETC(12) PLIRETC(4)
RETURN END
RECORD
END
Skeletal code for a typical input routine is shown in Figure 49 on page 258.
IF LAST_RECORD_SENT THEN
DO;
/]---------------------------------------------------------------]/
/]A test must be made to see if all the records have been sent, ]/
/]if they have, a return code of 8 is set up and control returned]/
/]to Sort ]/
/]---------------------------------------------------------------]/
END;
ELSE
DO;
/]------------------------------------------------]/
/] If another record is to be sent to Sort, do the]/
/] necessary processing, set a return code of 12 ]/
/] by calling PLIRETC, and return the data as a ]/
/] character string to Sort ]/
/]------------------------------------------------]/
Examples of an input routine are given in Figure 52 on page 261 and Figure 54 on
page 263.
In addition to the return codes of 12 (include current record in sort) and 8 (all
records sent), Sort allows the use of a return code of 16. This ends the sort and
causes Sort to return to your PL/I program with a return code of 16–Sort failed.
Note: A call to PLIRETC sets a return code that will be passed by your PL/I
program, and will be available to any job steps that follow it. When an output
handling routine has been used, it is good practice to reset the return code with a
call to PLIRETC after the call to PLISRTx to avoid receiving a nonzero completion
code. By calling PLIRETC with the return code from Sort as the argument, you can
make the PL/I return code reflect the success or failure of the sort. This practice is
shown in Figure 53 on page 262.
The record is passed from Sort to the output routine as a character string, and you
must declare a character string parameter in the output handling subroutine to
receive the data. The output handling subroutine must also pass a return code of 4
to Sort to indicate that it is ready for another record. You set the return code by a
call to PLIRETC.
The sort can be stopped by passing a return code of 16 to Sort. This will result in
Sort returning to the calling program with a return code of 16–Sort failed.
The record passed to the routine by Sort is a character string parameter. If you
specified the record type as F in the second argument in the call to PLISRTx, you
should declare the parameter with the length of the record. If you specified the
record type as V, you should declare the parameter as adjustable, as in the
following example:
Figure 55 on page 264 shows a program that sorts varying length records.
A flowchart for a typical output handling routine is given in Figure 48 on page 257.
Skeletal code for a typical output handling routine is shown in Figure 50.
CALL PLIRETC(4); /]Pass return code to Sort indicating that the next
sorted record is to be passed to this procedure.]/
END E35; /]End of procedure returns control to Sort]/
You should note that a call to PLIRETC sets a return code that will be passed by
your PL/I program, and will be available to any job steps that follow it. When you
have used an output handling routine, it is good practice to reset the return code
with a call to PLIRETC after the call to PLISRTx to avoid receiving a nonzero
completion code. By calling PLIRETC with the return code from Sort as the
argument, you can make the PL/I return code reflect the success or failure of the
sort. This practice is shown in the examples at the end of this chapter.
For details on handling conditions, especially those that occur during the input- and
output-handling routines, see OS/390 Language Environment Programming Guide.
Figure 51. PLISRTA—sorting from input data set to output data set
ON ENDFILE(SYSIN) BEGIN;
PUT SKIP(3) EDIT ('END OF SORT PROGRAM INPUT')(A);
CALL PLIRETC(8); /] signal that last record has
already been sent to sort]/
GOTO ENDE15;
END;
Figure 52. PLISRTB—sorting from input handling routine to output data set
Figure 53. PLISRTC—sorting from input data set to output handling routine
SELECT(RETURN_CODE);
WHEN(K) PUT SKIP EDIT
('SORT COMPLETE RETURN_CODE K') (A);
WHEN(2K) PUT SKIP EDIT
('SORT MESSAGE DATASET MISSING ') (A);
OTHER PUT SKIP EDIT
('INVALID RETURN_CODE = ', RETURN_CODE) (A,F(2));
END /] select ]/;
CALL PLIRETC(RETURN_CODE);
/]set PL/I return code to reflect success of sort]/
ON ENDFILE(SYSIN) BEGIN;
PUT SKIP(3) EDIT ('END OF SORT PROGRAM INPUT. ',
'SORTED OUTPUT SHOULD FOLLOW')(A);
CALL PLIRETC(8); /] Signal end of input to sort]/
GOTO ENDE15;
END;
Figure 54. PLISRTD—sorting from input handling routine to output handling routine
SELECT(RETURN_CODE);
WHEN(K) PUT SKIP EDIT (
'SORT COMPLETE RETURN_CODE K') (A);
WHEN(16) PUT SKIP EDIT (
'SORT FAILED, RETURN_CODE 16') (A);
WHEN(2K) PUT SKIP EDIT (
'SORT MESSAGE DATASET MISSING ') (A);
OTHER PUT SKIP EDIT (
'INVALID RETURN_CODE = ', RETURN_CODE)
(A,F(2));
END /] SELECT ]/;
CALL PLIRETC(RETURN_CODE);
/]SET PL/I RETURN CODE TO REFLECT SUCCESS OF SORT]/
PUTIN: PROC RETURNS (CHAR(8K) VARYING);
/]OUTPUT HANDLING ROUTINE]/
/]NOTE THAT VARYING MUST BE USED ON RETURNS ATTRIBUTE
WHEN USING VARYING LENGTH RECORDS]/
DCL STRING CHAR(8K) VAR;
ON ENDFILE(SYSIN) BEGIN;
PUT SKIP EDIT ('END OF INPUT')(A);
CALL PLIRETC(8);
GOTO ENDPUT;
END;
GET EDIT(STRING)(A(8K));
I=INDEX(STRING||' ',' ')-1;/]RESET LENGTH OF THE]/
STRING = SUBSTR(STRING,1,I); /] STRING FROM 8K TO ]/
/] LENGTH OF TEXT IN ]/
/] EACH INPUT RECORD.]/
Figure 55 (Part 1 of 2). Sorting varying-length records using input and output handling
routines
Figure 55 (Part 2 of 2). Sorting varying-length records using input and output handling
routines
struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
define structure
1 tm
,2 tm_sec fixed bin(31)
,2 tm_min fixed bin(31)
,2 tm_hour fixed bin(31)
,2 tm_mday fixed bin(31)
,2 tm_mon fixed bin(31)
,2 tm_year fixed bin(31)
,2 tm_wday fixed bin(31)
,2 tm_yday fixed bin(31)
,2 tm_isdst fixed bin(31)
;
typedef enum {
__disk = K,
__terminal = 1,
__printer = 2,
__tape = 3,
__tdq = 5,
__dummy = 6,
__memory = 8,
__hfs = 9,
__hiperspace = 1K
} __device_t;
struct __file {
unsigned char ]__bufPtr;
... } FILE;
All we want is a pointer (or token) for a file, so we can finesse this translation with:
Using C functions
Let's say we wanted to write a program to read a file and dump it as formatted hex
- using the C functions fopen and fread.
filedump:
proc(fn) options(noexecops main);
%include filedump;
do forever;
unspec(buffer) = ''b;
if read_In = K then
leave;
Figure 61. Sample code to use fopen and fread to dump a file
On some platforms, this would not link successfully because C names are case
senstive. In order to prevent this kind of linker problem, it is best to specify the
name in mixed case using the extended form of the external attribute. So, for
instance, the declare for fread would be better as:
But this wouldn't run right, because while PL/I parameters are byaddr by default, C
parameters are byvalue by default; so we fix that by adding the byvalue attribute to
the parameters:
But note how the return value is set in Figure 67: a fourth parameter (the address
of the temporary _temp5) is passed to the function fread, which is then expected to
place the return code in the integer at that address. This is the convention for how
values are returned when the byaddr attribute applies to returns, and PL/I uses this
convention by default.
This wouldn't run right, because C return values are byvalue. So, we fix that with
one more byvalue attribute.
Note how the return value is set now in Figure 69 on page 271: no extra address
is passed, and the return value is simply returned in register 15.
But C really has no strings, only pointers, and these pointers would be passed
byvalue; so the strings should be byaddr:
But PL/I passes descriptors with strings and C doesn't understand them, so they
must be suppressed. We can do this by adding options(nodescriptor) to the
declaration:
This will work, but isn't optimal since the parameters are input-only; if the parameter
is a constant, the nonassignable attribute will prevent a copy being made and
passed. Hence, the best translation of the declaration of fopen is:
Now, on USS, we can compile and run the programs with the commands:
filedump filedump.pli
comp2:
proc( key, element )
returns( fixed bin(31) byvalue );
select;
when( key->word < element->word )
return( -1 );
when( key->word = element->word )
return( K );
otherwise
return( +1 );
end;
end;
And the C qsort function could be used with this compare routine to sort an array of
integers, as in the following code fragment:
But since C function pointers are not the same as PL/I ENTRY variables, the C
qsort function must not be declared as simply:
Recall that a PL/I ENTRY variable may point to a nested function (and thus
requires a backchain address as well as an entry point address). But a C function
pointer is limited in pointing to a non-nested function only and so, a PL/I ENTRY
variable and a C function pointer do not even use the amount of storage.
Linkages
On 390, there are two crucial facts about linkages:
IBM C, JAVA and Enterprise PL/I use the same linkage by default.
This linkage is not the system linkage.
For a traditional PL/I application where all parameters are byaddr, the differences
between the code generated when a function has the default linkage and when it
has the system linkage would usually not matter. But if the parameters are byvalue
(as they usually are in C and JAVA), the differences can break your code.
In fact, there is only a small difference if the parameters are byaddr. In Figure 80
on page 274, the only difference between the code generated for a function with
] call dfta( n, m );
]
LA rK,M(,r13,172)
LA r2,N(,r13,168)
L r15,=V(DFTV)(,r3,126)
LA r1,#MX_TEMP1(,r13,152)
ST r2,#MX_TEMP1(,r13,152)
ST rK,#MX_TEMP1(,r13,156)
BALR r14,r15
]
] call sysa( n, m );
]
LA rK,M(,r13,172)
LA r2,N(,r13,168)
O rK,=X'8KKKKKKK'
L r15,=V(SYSV)(,r3,13K)
LA r1,#MX_TEMP1(,r13,152)
ST r2,#MX_TEMP1(,r13,152)
ST rK,#MX_TEMP1(,r13,156)
BALR r14,r15
But, there is a big difference if the parameters are byvalue rather than byaddr. In
Figure 81 on page 275, for the function with the default linkage, register 1 points to
the values of the integers passed, while for the function with the system linkage,
register 1 points to the addresses of those values.
] call dftv( n, m );
]
L r2,N(,r13,168)
L rK,M(,r13,172)
L r15,=V(DFTV)(,r3,174)
LA r1,#MX_TEMP1(,r13,152)
ST r2,#MX_TEMP1(,r13,152)
ST rK,#MX_TEMP1(,r13,156)
BALR r14,r15
]
] call sysv( n, m );
]
L r1,N(,r13,168)
L rK,M(,r13,172)
ST rK,#wtemp_1(,r13,176)
LA rK,#wtemp_1(,r13,176)
ST r1,#wtemp_2(,r13,18K)
LA r2,#wtemp_2(,r13,18K)
O rK,=X'8KKKKKKK'
L r15,=V(SYSV)(,r3,178)
LA r1,#MX_TEMP1(,r13,152)
ST r2,#MX_TEMP1(,r13,152)
ST rK,#MX_TEMP1(,r13,156)
BALR r14,r15
Summary
What we have learned in this chapter:
C is case sensitive.
Parameters should be BYVALUE.
Return values should be BYVALUE.
Except string parameters should be BYADDR.
Arrays and structures should also be BYADDR.
No descriptors should be passed.
Input-only strings should be NONASSIGNABLE.
C function pointers map to LIMITED ENTRYs.
The IBM C compilers and the IBM PL/I compilers use the same default linkage
(and it matters).
Before you can communicate with Java from PL/I you need to have Java installed
on your S/390 system. Contact your local System Administrator for more
information on how to set up your S/390 Java environment.
The Java Native Interface (JNI) is the Java interface to native programming
languages and is part of the Java Development Kits. By writing programs that use
the JNI, you ensure that your code is portable across many platforms.
The JNI allows Java code that runs within a Java Virtual Machine (JVM) to operate
with applications and libraries written in other languages, such as PL/I. In addition,
the Invocation API allows you to embed a Java Virtual Machine into your native
PL/I applications.
Programming through the JNI lets you use native methods to do many different
operations. A native method can:
utilize Java objects in the same way that a Java method uses these objects.
create Java objects, including arrays and strings, and then inspect and use
these objects to perform its tasks.
inspect and use objects created by Java application code.
Finally, native methods can also easily call already existing Java methods,
capitalizing on the functionality already incorporated in the Java programming
framework. In these ways, both the native language side and the Java side of an
application can create, update, and access Java objects and then share these
objects between them.
Our "Hello World!" program has one Java class, callingPLI.java. Our native
method, written in PL/I, is contained in hiFromPLI.pli. Here is a brief overview of
the steps for creating this sample program:
1. Write a Java program that defines a class containing a native method, loads
the native load library, and calls the native method.
2. Compile the Java program to create a Java class.
3. Write a PL/I program that implements the native method and displays the
"Hello!" text.
4. Compile and link the PL/I program.
5. Run the Java program which calls the native method in the PL/I program.
In the above statement, the void means that there is no return value expected from
this native method call. The empty parentheses in the method name callToPLI( ),
means that there are no parameters being passed on the call to the native method.
The complete definition of the callingPLI class, including all the points addressed
above in this section, looks like this:
public class callingPLI {
public native void callToPLI();
static {
System.loadLibrary("hiFromPLI");
}
public static void main(String[] argv) {
callingPLI callPLI = new callingPLI();
callPLI.callToPLI();
System.out.println("And Hello from Java, too!");
}
}
Extname(31)
Allows for longer, Java style, external names.
Margins(1,100)
Extending the margins gives you more room for Java style names and
identifiers.
Display(Std)
Writes the "Hello World" text to stdout, not via WTOs. In the USS environment
WTOs would not be seen by the user.
The following default PL/I compiler option is also necessary. A Java - PL/I program
may not work correctly if this option is changed or overridden.
RENT
The RENT option insures that code is reentrant even if it writes on static
variables.
Java
All native methods resident in dynamic libraries must begin with Java
_callingPLI
The name of the Java class that declares the native method
_callToPLI
The name of the native method itself.
The complete procedure statement for the sample program looks like this:
Java_callingPLI_callToPLI:
Proc( JNIEnv , MyJObject )
External( "Java_callingPLI_callToPLI" )
Options( NoDescriptor ByValue );
For a complete listing of the jni.inc file refer to Figure 87 on page 292.
Java_callingPLI_callToPLI:
Proc( JNIEnv , MyJObject )
External( "Java_callingPLI_callToPLI" )
Options( NoDescriptor ByValue );
%include jni;
End;
Be sure to include the lib prefix on the name of the PL/I shared library or the Java
class loader will not find it.
The first line written from the PL/I native method. The second line is from the
calling Java class after returning from the PL/I native method call.
This sample program prompts the user for a string and reads that value in from the
command line. This is done within a try/catch statement as shown in Figure 82 on
page 282.
System.out.println(" ");
The complete procedure statement for the sample program looks like this:
Java_jPassString_pliShowString:
Proc( JNIEnv , myjobject )
external( "Java_jPassString_pliShowString" )
options( byvalue nodescriptor );
For a complete listing of the jni.inc file refer to Figure 87 on page 292.
Upon entry, a reference to the calling Java Object, myObject is passed into the PL/I
procedure. The PL/I program will use this reference to get information from the
calling object. The first piece of information is the Class of the calling object which
is retrieved using the GetObjectClass JNI function. This Class value is then used
by the GetFieldID JNI function to get the identity of the Java string field in the Java
object that we are interested in. This Java field is further identified by providing the
name of the field, myString, and the JNI field descriptor, Ljava/lang/String;, which
identifies the field as a Java String field. The value of the Java string field is then
retrieved using the GetObjectField JNI function. Before PL/I can use the Java
string value, it must be unpacked into a form that PL/I can understand. The
GetStringUTFChars JNI function is used to convert the Java string into a PL/I
varyingz string which is then displayed by the PL/I program.
After displaying the retrieved Java string, the PL/I program prompts the user for a
PL/I string to be used to update the string field in the calling Java object. The PL/I
string value is converted to a Java string using the NewString JNI function. This
new Java string is then used to update the string field in the calling Java object
using the SetObjectField JNI function.
When the PL/I program ends control is returned to Java, where the newly updated
Java string is displayed by the Java program.
Java_passString_pliShowString:
Proc( JNIEnv , myJObject )
external( "Java_jPassString_pliShowString" )
options( byvalue nodescriptor );
%include jni;
Display(' ');
End;
end;
Be sure to include the lib prefix on the name or the PL/I shared library or the Java
class loader will not find it.
The output of the sample program, complete with the prompts for user input from
both Java and PL/I, will look like this:
>java jPassString
From PLI: String retrieved from Java is: A string entered in Java
From PLI: Enter a string to be returned to Java:
A string entered in PL/I
This sample program prompts the user for an integer and reads that value in from
the command line. This is done within a try/catch statement as shown in Figure 84
on page 287.
System.out.println(" ");
The complete procedure statement for the sample program looks like this:
Java_passNum_pliShowInt:
Proc( JNIEnv , myjobject )
external( "Java_jPassInt_pliShowInt" )
options( byvalue nodescriptor );
For a complete listing of the jni.inc file refer to Figure 87 on page 292.
Upon entry, a reference to the calling Java Object, myObject, is passed into the
PL/I procedure. The PL/I program will use this reference to get information from
the calling object. The first piece of information is the Class of the calling object
which is retrieved using the GetObjectClass JNI function. This Class value is then
used by the GetFieldID JNI function to get the identity of the Java integer field in
the Java object that we are interested in. This Java field is further identified by
providing the name of the field, myInt, and the JNI field descriptor, I, which
identifies the field as an integer field. The value of the Java integer field is then
retrieved using the GetIntField JNI function which is then displayed by the PL/I
program.
After displaying the retrieved Java integer, the PL/I program prompts the user for a
PL/I integer to be used to update the integer field in the calling Java object. The
PL/I integer value is then used to update the integer field in the calling Java object
using the SetIntField JNI function.
When the PL/I program ends, control is returned to Java, where the newly updated
Java integer is displayed by the Java program.
Java_passNum_pliShowInt:
Proc( JNIEnv , myjobject )
external( "Java_jPassInt_pliShowInt" )
options( byvalue nodescriptor );
%include jni;
Display(' ');
rtnJInt = pliReply;
End;
end;
Be sure to include the lib prefix on the name or the PL/I shared library or the Java
class loader will not find it.
The output of the sample program, complete with the prompts for user input from
both Java and PL/I, will look like this:
>java jPassInt
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/]] jni_md.inc - This is included by jni.inc. ]/
/]] - The source is jni_md.h in jdk1.1.8 ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/] ]/
/] Licensed Materials - Property of IBM ]/
/] 5639-A83, 5639-A24 (C) Copyright IBM Corp. 1999,2KK1 ]/
/] All Rights Reserved. ]/
/] (C) Copyright IBM Corp. 1998. All Rights Reserved. ]/
/] US Government Users Restricted Rights-- Use, duplication or ]/
/] disclosure restricted by GSA ADP Schedule Contract with ]/
/] IBM Corp. ]/
/] ]/
/] DISCLAIMER OF WARRANTIES ]/
/] The following menclosedy code is sample code created by IBM ]/
/] Corporation. This sample code is not part of any standard ]/
/] IBM product and is provided to you solely for the purpose of]/
/] assisting you in the development of your applications. The ]/
/] code is provided "AS IS", without warranty of any kind. ]/
/] IBM shall not be liable for any damages arising out of your ]/
/] use of the sample code, even if IBM has been advised of the ]/
/] possibility of such damages. ]/
/] ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/]] jni.inc - This is the main include for PL/I Java support. ]/
/]] - The source is jni.h in jdk1.1.8 ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
/] ]/
/] Licensed Materials - Property of IBM ]/
/] 5639-A83, 5639-A24 (C) Copyright IBM Corp. 1999,2KK1 ]/
/] All Rights Reserved. ]/
/] (C) Copyright IBM Corp. 1998. All Rights Reserved. ]/
/] US Government Users Restricted Rights-- Use, duplication or ]/
/] disclosure restricted by GSA ADP Schedule Contract with ]/
/] IBM Corp. ]/
/] ]/
/] DISCLAIMER OF WARRANTIES ]/
/] The following menclosedy code is sample code created by IBM ]/
/] Corporation. This sample code is not part of any standard ]/
/] IBM product and is provided to you solely for the purpose of]/
/] assisting you in the development of your applications. The ]/
/] code is provided "AS IS", without warranty of any kind. ]/
/] IBM shall not be liable for any damages arising out of your ]/
/] use of the sample code, even if IBM has been advised of the ]/
/] possibility of such damages. ]/
/] ]/
/]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]/
%include jni_md;
define structure
1 jvalue union,
2 z type jboolean,
2 b type jbyte,
2 c type jchar,
2 s type jshort,
2 i type jint,
2 j type jlong,
2 f type jfloat,
2 d type jdouble,
2 l type jobject;
/] jboolean constants ]/
/] used in ReleaseScalarArrayElements ]/
define structure
1 dummy#1,
2 name pointer,
2 signature pointer,
2 fnPtr pointer;
2 ] pointer,
2 ] pointer,
2 ] pointer,
2 ] pointer,
2 ] pointer,
2 ] pointer,
2 ] pointer,
2 ] pointer,
The XML support does not provide XML generation, which must be instead be
accomplished by PL/I program logic.
The XML support has no special environmental requirements. It executes in all the
principal run-time environments, including CICS, IMS, and MQ Series, as well as
z/OS and OS/390 batch and TSO.
Overview
There are two major types of interfaces for XML parsing: event-based and
tree-based.
For an event-based API, the parser reports events to the application through
callbacks. Such events include: the start of the document, the beginning of an
element, etc. The application provides handlers to deal with the events reported by
the parser. The Simple API for XML or SAX is an example of an industry-standard
event-based API.
For a tree-based API (such as the Document Object Model or DOM), the parser
translates the XML into an internal tree-based representation. Interfaces are
provided to navigate the tree.
IBM Enterprise PL/I for z/OS and OS/390 Version 3 Release 1 provides a SAX-like
event-based interface for parsing XML documents. The parser invokes an
application-supplied handler for parser events, passing references to the
corresponding document fragments.
XML documents have two levels of conformance: well-formedness and validity, both
of which are defined in the XML standard, which you can find at
http://www.w3c.org/XML/. Recapitulating these definitions, an XML document is
well-formed if it complies with the basic XML grammar, and with a few specific
rules, such as the requirement that the names on start and end element tags must
match. A well-formed XML document is also valid if it has an associated document
type declaration (DTD) and if it complies with the constraints expressed in the DTD.
The XML parser is non-validating, but does partially check for well-formedness
errors, and generates exception events if it discovers any.
──PLISAXA(e,p,x,n─┬────┬─)─────────────────────────────────────────────────────
└─,c─┘
e An event structure
p A pointer value or "token" that the parser will pass back to the event
functions
Also note that if the XML is contained in a WIDECHAR string, the value for the
number of bytes is twice the value returned by the LENGTH built-in function.
──PLISAXB(e,p,x─┬────┬─)───────────────────────────────────────────────────────
└─,c─┘
e An event structure
p A pointer value or "token" that the parser will pass back to the event
functions
The descriptions below of each event refer to the example of an XML document in
Figure 88 on page 319. In these descriptions, the term "XML text" refers to the
string based on the pointer and length passed to the event.
In the order of their appearance in this structure, the parser may recognize the
following events:
start_of_document
This event occurs once, at the beginning of parsing the document. The parser
passes the address and length of the entire document, including any line-control
characters, such as LF (Line Feed) or NL (New Line). For the above example, the
document is 305 characters in length.
version_information
This event occurs within the optional XML declaration for the version information.
The parser passes the address and length of the text containing the version value,
"1.0" in the example above.
encoding_declaration
This event occurs within the XML declaration for the optional encoding declaration.
The parser passes the address and length of the text containing the encoding
value.
standalone_declaration
This event occurs within the XML declaration for the optional standalone
declaration. The parser passes the address and length of the text containing the
standalone value, "yes" in the example above.
document_type_declaration
This event occurs when the parser finds a document type declaration. Document
type declarations begin with the character sequence "<!DOCTYPE" and end with a
">" character, with some fairly complicated grammar rules describing the content in
between. The parser passes the address and length of the text containing the
entire declaration, including the opening and closing character sequences, and is
the only event where XML text includes the delimiters. The example above does
not have a document type declaration.
start_of_element
This event occurs once for each element start tag or empty element tag. The
parser passes the address and length of the text containing the element name. For
the first start_of_element event during parsing of the example, this would be the
string "sandwich".
attribute_name
This event occurs for each attribute in an element start tag or empty element tag,
after recognizing a valid name. The parser passes the address and length of the
text containing the attribute name. The only attribute name in the example is
"type".
attribute_characters
This event occurs for each fragment of an attribute value. The parser passes the
address and length of the text containing the fragment. An attribute value normally
consists of a single string only, even if it is split across lines:
<element attribute="This attribute value is
split across two lines"/>
The attribute value might consist of multiple pieces, however. For instance, the
value of the "type" attribute in the "sandwich" example at the beginning of the
section consists of three fragments: the string "baker", the single character "'" and
the string "s best". The parser passes these fragments as three separate events.
It passes each string, "baker" and "s best" in the example, as attribute_characters
events, and the single character "'" as an attribute_predefined_reference event,
described next.
attribute_predefined_reference
This event occurs in attribute values for the five pre-defined entity references
"&", "'", ">", "<" and """. The parser passes a CHAR(1) or
WIDECHAR(1) value that contains one of "&", "'", ">", "<" or '"', respectively.
attribute_character_reference
This event occurs in attribute values for numeric character references (Unicode
code points or "scalar values") of the form "&#dd;" or "&#xhh;", where "d" and "h"
represent decimal and hexadecimal digits, respectively. The parser passes a
FIXED BIN(31) value that contains the corresponding integer value.
end_of_element
This event occurs once for each element end tag or empty element tag when the
parser recognizes the closing angle bracket of the tag. The parser passes the
address and length of the text containing the element name.
end_of_CDATA_section
This event occurs when the parser recognizes the end of a CDATA section. The
parser passes the address and length of the text containing the closing character
sequence, “]]”.
content_characters
This event represents the "heart" of an XML document: the character data between
element start and end tags. The parser passes the address and length of the text
containing the this data, which usually consists of a single string only, even if it is
split across lines:
<element1>This character content is
split across two lines</element1>
content_predefined_reference
This event occurs in element content for the five pre-defined entity references
"&", "'", ">", "<" and """. The parser passes a CHAR(1) or
WIDECHAR(1) value that contains one of "&", "'", ">", "<" or '"', respectively.
content_character_reference
This event occurs in element content for numeric character references (Unicode
code points or "scalar values") of the form "&#dd;" or "&#xhh;", where "d" and "h"
represent decimal and hexadecimal digits, respectively. The parser passes a
FIXED BIN(31) value that contains the corresponding integer value.
processing_instruction
Processing instructions (PIs) allow XML documents to contain special instructions
for applications. This event occurs when the parser recognizes the name following
the PI opening character sequence, "<?". The event also covers the data following
the processing instruction (PI) target, up to but not including the PI closing
character sequence, "?>". Trailing, but not leading white space characters in the
comment
This event occurs for any comments in the XML document. The parser passes the
address and length of the text between the opening and closing comment
delimiters, "<!--" and "-->", respectively. In the example, the text of the only
comment is "This document is just an example".
unknown_attribute_reference
This event occurs within attribute values for entity references other than the five
pre-defined entity references, listed for the event attribute_predefined_character.
The parser passes the address and length of the text containing the entity name.
unknown_content_reference
This event occurs within element content for entity references other than the five
pre-defined entity references listed for the content_predefined_character event.
The parser passes the address and length of the text containing the entity name.
start_of_prefix_mapping
This event is currently not generated.
end_of_prefix_mapping
This event is currently not generated.
exception
The parser generates this event when it detects an error in processing the XML
document.
All of these functions will be passed as the first argument a BYVALUE POINTER
that is the token value passed originally as the second argument to the built-in
function.
With the following exceptions, all of the functions will also be passed a BYVALUE
POINTER and a BYVALUE FIXED BIN(31) that supply the address and length of
the text element for the event. The functions/events that are different are:
end_of_document
No argument other than the user token is passed.
attribute_predefined_reference
In addition to the user token, one additional argument is passed: a BYVALUE
CHAR(1) or, for a UTF-16 document, a BYVALUE WIDECHAR(1) that holds
the value of the predefined character.
attribute_character_reference
In addition to the user token, one additional argument is passed: a BYVALUE
FIXED BIN(31) that holds the value of the numeric reference.
content_character_reference
In addition to the user token, one additional argument is passed: a BYVALUE
FIXED BIN(31) that holds the value of the numeric reference.
processing_instruction
In addition to the user token, four additional arguments are passed:
exception
In addition to the user token, three additional arguments are passed:
If the XML document begins with an XML declaration that includes an encoding
declaration specifying one of the supported code pages listed below, the parser
honors the encoding declaration if it does not conflict with either the basic
document encoding or the encoding information from the PLISAX built-in
subroutine. If the XML document does not have an XML declaration at all, or if the
XML declaration omits the encoding declaration, the parser uses the encoding
information from the PLISAX built-in subroutine to process the document, as long
as it does not conflict with the basic document encoding.
CCSID Description
01047 Latin 1 / Open Systems
01140, 00037 USA, Canada, etc.
01141, 00273 Austria, Germany
01142, 00277 Denmark, Norway
01143, 00278 Finland, Sweden
01144, 00280 Italy
01145, 00284 Spain, Latin America (Spanish)
01146, 00285 UK
01147, 00297 France
01148, 00500 International
01149, 00871 Iceland
You can also specify the encoding information for the document in the XML
declaration, with which most XML documents begin. An example of an XML
declaration that includes an encoding declaration is:
<?xml version="1.K" encoding="ibm-114K"?>
IBM_ CP CCSID_
IBM- CP_ CCSID-
CP-
Using an alias
You can use any of the following supported aliases (in any mixture of lower and
upper case):
Exceptions
For most exceptions, the XML text contains the part of the document that was
parsed up to and including the point where the exception was detected. For
encoding conflict exceptions, which are signaled before parsing begins, the length
of the XML text is either zero or the XML text contains just the encoding declaration
value from the document. The example above contains one item that causes an
exception event, the superfluous "junk" following the "sandwich" element end tag.
Returning from the exception event function with a non-zero return code normally
causes the parser to stop processing the document, and return control to the
program that invoked the PLISAXA or PLISAXB built-in subroutine.
For continuable exceptions, returning from the exception event function with a zero
return code requests the parser to continue processing the document, although
further exceptions might subsequently occur. See section 2.5.6.1, "Continuable
exceptions" for details of the actions that the parser takes when you request
continuation.
A special case applies to exceptions with exception numbers in the ranges 100,001
through 165,535 and 200,001 through 265,535. These ranges of exception codes
indicate that the document's CCSID (determined by examining the beginning of the
document, including any encoding declaration) is not identical to the CCSID value
For these exceptions, the exception code passed to the exception event contains
the document's CCSID, plus 100,000 for EBCDIC CCSIDs, or 200,000 for ASCII
CCSIDs. For instance, if the exception code contains 101,140, the document s
CCSID is 01140. The CCSID value provided by the PLISAXA or PLISAXB built-in
subroutine is either set explicitly as the last argument on the call or implicitly when
the last argument is omitted and the value of the CODEPAGE compiler option is
used.
Depending on the value of the return code after returning from the exception event
function for these CCSID conflict exceptions, the parser takes one of three actions:
1. If the return code is zero, the parser proceeds using the CCSID provided by the
built-in subroutine.
2. If the return code contains the document's CCSID (that is, the original
exception code value minus 100,000 or 200,000), the parser proceeds using
the document s CCSID. This is the only case where the parser continues after
a non-zero value is returned from one of the parsing events.
3. Otherwise, the parser stops processing the document, and returns control to
the PLISAXA or PLISAXB built-in subroutine which will raise the ERROR
condition.
Example
The following example illustrates the use of the PLISAXA built-in subroutine and
uses the example XML document cited above:
dcl
1 eventHandler static
xmlDocument =
'<?xml version="1.K" standalone="yes"?>'
|| '<!--This document is just an example-->'
|| '<sandwich>'
|| '<bread type="baker's best"/>'
|| '<?spread please use real mayonnaise ?>'
|| '<meat>Ham & turkey</meat>'
|| '<filling>Cheese, lettuce, tomato, etc.</filling>'
|| '<![CDATA[We should add a <relish> element in future!]]'.
|| '</sandwich>'
|| 'junk';
end;
start_of_document:
proc( userToken, xmlToken, TokenLength )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
version_information:
proc( userToken, xmlToken, TokenLength )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
encoding_declaration:
proc( userToken, xmlToken, TokenLength )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
standalone_declaration:
proc( userToken, xmlToken, TokenLength )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
return(K);
end;
end_of_document:
proc( userToken )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
start_of_element:
proc( userToken, xmlToken, TokenLength )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
attribute_name:
proc( userToken, xmlToken, TokenLength )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
return(K);
end;
attribute_predefined_reference:
proc( userToken, reference )
returns( byvalue fixed bin(31) )
options( byvalue nodescriptor );
return(K);
end;
attribute_character_reference:
proc( userToken, reference )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
end_of_element:
proc( userToken, xmlToken, TokenLength )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
return(K);
end;
end_of_CDATA:
proc( userToken, xmlToken, TokenLength )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
content_characters:
proc( userToken, xmlToken, TokenLength )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
content_predefined_reference:
proc( userToken, reference )
returns( byvalue fixed bin(31) )
options( byvalue nodescriptor );
return(K);
end;
return(K);
end;
processing_instruction:
proc( userToken, piTarget, piTargetLength,
piData, piDataLength )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
comment:
proc( userToken, xmlToken, TokenLength )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
unknown_attribute_reference:
proc( userToken, xmlToken, TokenLength )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
return(K);
end;
start_of_prefix_mapping:
proc( userToken, xmlToken, TokenLength )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
end_of_prefix_mapping:
proc( userToken, xmlToken, TokenLength )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
exception:
proc( userToken, xmlToken, currentOffset, errorID )
returns( byvalue fixed bin(31) )
options( byvalue );
return(K);
end;
Exception codes
For each value of the exception code parameter passed to the exception event
(listed under the heading "Number"), the following table describes the exception,
and the actions that the parser takes when you request it to continue after the
exception. In these descriptions, the term "XML text" refers to the string based on
the pointer and length passed to the event.
PLIDMPA: PROC;
Declare (a,b) Fixed bin(31) Auto;
a = 1; b = 3;
Put skip list('PLIDMPA Starting');
Call PLIDMPB;
PLIDMPB: PROC;
Declare 1 Name auto,
2 First Char(12) Varying,
2 Last Char(12) Varying;
First = 'Teri';
Last = 'Gillispy';
Put skip list('PLIDMPB Starting');
Call PLIDUMP('TBFC','PLIDUMP called from procedure PLIDMPB');
Put Data;
End PLIDMPB;
End PLIDMPA;
End PLIDMP;
──)─────────────────────────────────────────────────────────────────────────────
character-string-expression 1
is a dump options character string consisting of one or more of the following:
character-string-expression 2
is a user-identified character string up to 80 characters long that is printed as
the dump header.
You can find the procedure used to create an interrupt in the IBM instruction
manual for the operating system and terminal that you are using.
There is a difference between the interrupt (the operating system recognized your
request) and the raising of the ATTENTION condition.
An interrupt is your request that the operating system notify the running program. If
a PL/I program was compiled with the INTERRUPT compile-time option,
instructions are included that test an internal interrupt switch at discrete points in
the program. The internal interrupt switch can be set if any program in the load
module was compiled with the INTERRUPT compile-time option.
The internal switch is set when the operating system recognizes that an interrupt
request was made. The execution of the special testing instructions (polling) raises
the ATTENTION condition. If a debugging tool hook (or a CALL PLITEST) is
encountered before the polling occurs, the debugging tool can be given control
before the ATTENTION condition processing starts.
Polling ensures that the ATTENTION condition is raised between PL/I statements,
rather than within the statements.
LABEL1
Each iteration of the DO
The ELSE PUT SKIP ... statement
Block END statements
Later, when the ATTENTION condition is raised, the debugging tool receives
control again for condition processing.
At points specified in the program, information about the current status of the
program is written as a record on a data set. If the program terminates due to a
system failure, you can use this information to restart the program close to the point
where the failure occurred, avoiding the need to rerun the program completely.
This restart can be either automatic or deferred. An automatic restart is one that
takes place immediately (provided the operator authorizes it when requested by a
system message). A deferred restart is one that is performed later as a new job.
You can request an automatic restart from within your program without a system
failure having occurred.
──CALL──PLICKPT──┬────────────────────────────────────────────────────────┬────
└─(──ddname──┬──────────────────────────────────────┬──)─┘
└─,──check-id──┬─────────────────────┬─┘
└─,──org──┬─────────┬─┘
└─,──code─┘
The four arguments are all optional. If you do not use an argument, you need not
specify it unless you specify another argument that follows it in the given order. In
this case, you must specify the unused argument as a null string (''). The
following paragraphs describe the arguments.
ddname
is a character string constant or variable specifying the name of the DD
statement defining the data set that is to be used for checkpoint records. If you
omit this argument, the system will use the default ddname SYSCHK.
org
is a character string constant or variable with the attributes CHARACTER(2)
whose value indicates, in operating system terms, the organization of the
checkpoint data set. PS indicates sequential (that is, CONSECUTIVE)
organization; PO represents partitioned organization. If you omit this argument,
PS is assumed.
code
is a variable with the attributes FIXED BINARY (31), which can receive a return
code from PLICKPT. The return code has the following values:
You must specify a data set name only if you want to keep the data set for a
deferred restart. The I/O device can be any direct-access device.
To obtain only the last checkpoint record, then specify status as NEW (or OLD if
the data set already exists). This will cause each checkpoint record to overwrite
the previous one.
To retain more than one checkpoint record, specify status as MOD. This will cause
each checkpoint record to be added after the previous one.
For direct-access storage, you should allocate enough primary space to store as
many checkpoint records as you will retain. You can specify an incremental space
allocation, but it will not be used. A checkpoint record is approximately 5000 bytes
longer than the area of main storage allocated to the step.
Requesting a restart
A restart can be automatic or deferred. You can make automatic restarts after a
system failure or from within the program itself. The system operator must
authorize all automatic restarts when requested by the system.
If a system failure occurs before any checkpoint has been taken, an automatic
restart, from the beginning of the job step, can still occur if you have specified
RD=R in the EXEC or JOB statement.
After a system failure occurs, you can still force automatic restart from the
beginning of the job step by specifying RD=RNC in the EXEC or JOB statement.
By specifying RD=RNC, you are requesting an automatic step restart without
checkpoint processing if another system failure occurs.
To effect the restart, the compiler terminates the program abnormally, with a
system completion code of 4092. Therefore, to use this facility, the system
completion code 4092 must not have been deleted from the table of eligible codes
at system generation.
──RESTART──═──(──stepname──┬──────────┬──)─────────────────────────────────────
├─,────────┤
└─check-id─┘
If you subsequently require a deferred restart, you must submit the program as a
new job, with the RESTART parameter in the JOB statement. Use the RESTART
parameter to specify the job step at which the restart is to be made and, if you
want to restart at a checkpoint, the name of the checkpoint record.
Also, any checkpoints already taken are still available for a deferred restart.
You can cancel any automatic restart and the taking of checkpoints, even if they
were requested in your program, by specifying RD=NC in the JOB or EXEC
statement.
If you want the exits to perform functions that are different from those supplied by
the default exits, we recommend that you modify the supplied source files as
appropriate.
At times, it is useful to be able to tailor the compiler to meet the needs of your
organization. For example, you might want to suppress certain messages or alter
the severity of others. You might want to perform a specific function with each
compilation, such as logging statistical information about the compilation into a file.
A compiler user exit handles this type of function.
With PL/I, you can write your own user exit or use the exit provided with the
product, either 'as is' or modified, depending on what you want to do with it. The
purpose of this chapter is to describe:
Procedures that the compiler user exit supports
How to activate the compiler user exit
IBMUEXIT, the IBM-supplied compiler user exit
Requirements for writing your own compiler user exit.
┌────────┐
│ │
│ │ ┌───────────────┐
│ ├───────
│Initialization │
│ C │───────┤procedure │
│ O │ └───────────────┘
│ M │ ┌───────────────┐
│ P ├───────
│Message filter │
│ I │───────┤procedure │
│ L │ └───────────────┘
│ E │ ┌───────────────┐
│ R ├───────
│Termination │
│ │───────┤procedure │
│ │ └───────────────┘
│ │
└────────┘
Figure 96. PL/I compiler user exit procedures
The user-option-string is passed to the user exit functions in the global control block
which is discussed in “Structure of global control blocks” on page 353. Please
refer to the field “Uex_UIB_User_char_str” in the section “Structure of global control
blocks” on page 353 for additional information.
Modifying SYSUEXIT
Rather than spending the time to write a completely new compiler user exit, you
can simplify modify the user exit input file.
Edit the file to indicate which message numbers you want to suppress, and which
message number severity levels you would like changed. A sample file is shown in
Figure 97.
The first two lines are header lines and are ignored by IBMUEXIT. The remaining
lines contain input separated by a variable number of blanks.
The global control block syntax for the initialization procedure is discussed in the
section “Structure of global control blocks” on page 353.
Upon completion of the initialization procedure, you should set the return/reason
codes to the following:
Upon completion of the message filtering procedure, set the return/reason codes to
one of the following:
The global control block syntax for the termination procedure is discussed in
“Structure of global control blocks” on page 353. Upon completion of the
termination procedure, set the return/reason codes to one of the following:
Passing an argument
When a string, an array, or a structure is passed as an argument, the compiler
passes a descriptor for that argument unless the called routine is declared with
OPTIONS(NODESCRIPTOR). There are two methods for passing such
descriptors:
By descriptor list
By descriptor locator
The following key features should be noted about each of these two methods:
When arguments are passed with a descriptor list
– The number of arguments passed is one greater than the number of
arguments specified if any of the arguments needs a descriptor.
– An argument passed with a descriptor can be received as a pointer passed
by value (BYVALUE).
– The compiler uses this method when the DEFAULT(DESCLOCATOR)
compiler option is in effect.
When arguments are passed by descriptor locator
– The number of arguments passed always matches the number of
arguments specified.
– An argument passed with a descriptor can be received as a pointer passed
by address (BYADDR).
– The compiler uses this method when the DEFAULT(DESCLIST) compiler
option is in effect.
The locator/descriptor is a pair of pointers. The first pointer is the address of the
data; the second pointer is the address of the descriptor.
IMPORTANT
The rest of this chapter describes only the descriptors generated under the
compiler option CMPAT(LE). The descriptors generated under the compiler
options CMPAT(V1) and CMPAT(V2) are the same as those generated under
OS PL/I.
Descriptor header
Every descriptor starts with a 4-byte field. The first byte specifies the descriptor
type (scalar, array, structure or union). The remaining three bytes are zero unless
they are set by the particular descriptor type.
String descriptors
In a string descriptor, the second byte of the header indicates the string type (bit,
character or graphic as well as nonvarying, varying or varyingz).
In a string descriptor for a nonvarying bit string, the third byte of the header gives
the bit offset.
In a string descriptor for a varying string, the fourth byte has a bit indicating if the
string length is held in nonnative format.
In a string descriptor for a character string, the fourth byte also has a bit indicating
if the string data is in EBCDIC.
Array descriptors
The declare for an array descriptor is:
declare
1 dsc_Array based( sysnull() ),
2 dsc_Array_Header like dsc_Header,
2 dsc_Array_EltLen fixed bin(31), /] Length of array element ]/
2 dsc_Array_Rank fixed bin(31), /] Count of dimensions ]/
2 dsc_Array_RVO fixed bin(31), /] Relative virtual origin ]/
2 dsc_Array_Data( 1: 1 refer(dsc_Array_Rank) ),
3 dsc_Array_LBound fixed bin(31), /] LBound ]/
3 dsc_Array_Extent fixed bin(31), /] HBound - LBound + 1 ]/
3 dsc_Array_Stride fixed bin(31); /] Multiplier ]/
IBM may have patents or pending patent applications covering subject matter described in
this document. The furnishing of this document does not give you any license to these
patents. You can send license inquiries, in writing, to:
IBM Corporation
J74/G4
555 Bailey Avenue
San Jose, CA 95141-1099
U.S.A.
For license inquiries regarding double-byte (DBCS) information, contact the IBM Intellectual
Property Department in your country or send inquiries, in writing, to:
The following paragraph does not apply to the United Kingdom or any other country where
such provisions are inconsistent with local law:
Some states do not allow disclaimer of express or implied warranties in certain transactions,
therefore, this statement may not apply to you.
Changes are periodically made to the information herein; these changes will be incorporated
in new editions of the publication. IBM may make improvements and/or changes in the
product(s) and/or the program(s) described in this publication at any time without notice.
Any references in this publication to non-IBM Web sites are provided for convenience only
and do not in any manner serve as an endorsement of those Web sites. The materials at
those Web sites are not part of the materials for this IBM product and use of those Web
sites is at your own risk.
Intel is a registered trademark of Intel Corporation in the United States and other countries.
Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United
States and other countries.
Microsoft, Windows, and Windows NT are trademarks of Microsoft Corporation in the United
States and other countries.
Pentium is a registered trademark of Intel Corporation in the United States and other
countries.
UNIX is a registered trademark of The Open Group in the United States and other countries.
Other company, product or service names may be the trademarks or service marks of
others.
If you are viewing this information in softcopy, the photographs and color illustrations may
not appear.
action specification. In an ON statement, the ON-unit aggregate type. For any item of data, the specification
or the single keyword SYSTEM, either of which whether it is structure, union, or array.
specifies the action to be taken whenever the
appropriate condition is raised. allocated variable. A variable with which main storage
is associated and not freed.
activate (a block). To initiate the execution of a block.
A procedure block is activated when it is invoked. A allocation. (1) The reservation of main storage for a
begin-block is activated when it is encountered in the variable. (2) A generation of an allocated variable.
normal flow of control, including a branch. A package (3) The association of a PL/I file with a system data set,
cannot be activated. device, or file.
activate (a preprocessor variable or preprocessor alignment. The storing of data items in relation to
entry point). To make a macro facility identifier eligible certain machine-dependent boundaries (for example, a
for replacement in subsequent source code. The fullword or halfword boundary).
%ACTIVATE statement activates preprocessor variables
or preprocessor entry points. alphabetic character. Any of the characters A through
Z of the English alphabet and the alphabetic extenders
active. (1) The state of a block after activation and #, $, and @ (which can have a different graphic
before termination. (2) The state in which a representation in different countries).
preprocessor variable or preprocessor entry name is
said to be when its value can replace the corresponding alphameric character. An alphabetic character or a
identifier in source program text. (3) The state in which digit.
an event variable is said to be during the time it is
associated with an asynchronous operation. (4) The alternative attribute. A file description attribute that is
state in which a task variable is said to be when its chosen from a group of attributes. If none is specified,
associated task is attached. (5) The state in which a a default is assumed. Contrast with additive attribute.
task is said to be before it has been terminated.
ambiguous reference. A reference that is not
actual origin (AO). The location of the first item in the sufficiently qualified to identify one and only one name
array or structure. known at the point of reference.
additive attribute. A file description attribute for which area. A portion of storage within which based variables
there are no defaults, and which, if required, must be can be allocated.
stated explicitly or implied by another explicitly stated
attribute. Contrast with alternative attribute. argument. An expression in an argument list as part
of an invocation of a subroutine or function.
adjustable extent. The bound (of an array), the length
(of a string), or the size (of an area) that might be argument list. A parenthesized list of zero or more
different for different generations of the associated arguments, separated by commas, following an entry
variable. Adjustable extents are specified as name constant, an entry name variable, a generic
expressions or asterisks (or by REFER options for name, or a built-in function name. The list becomes the
based variables), which are evaluated separately for parameter list of the entry point.
each generation. They cannot be used for static
variables. arithmetic comparison. A comparison of numeric
values. See also bit comparison, character comparison.
asynchronous operation. (1) The overlap of an binary fixed-point value. An integer consisting of
input/output operation with the execution of statements. binary digits and having an optional binary point and
(2) The concurrent execution of procedures using optional sign. Contrast with decimal fixed-point value.
multiple flows of control for different tasks.
binary floating-point value. An approximation of a
attachment of a task. The invocation of a procedure real number in the form of a significand, which can be
and the establishment of a separate flow of control to considered as a binary fraction, and an exponent, which
execute the invoked procedure (and procedures it can be considered as an integer exponent to the base
invokes) asynchronously, with execution of the invoking of 2. Contrast with decimal floating-point value.
procedure.
bit. (1) A 0 or a 1. (2) The smallest amount of space
attention. An occurrence, external to a task, that could of computer storage.
cause a task to be interrupted.
bit comparison. A left-to-right, bit-by-bit comparison of
attribute. (1) A descriptive property associated with a binary digits. See also arithmetic comparison, character
name to describe a characteristic represented. (2) A comparison.
descriptive property used to describe a characteristic of
bit string constant. (1) A series of binary digits
the result of evaluation of an expression.
enclosed in and followed immediately by the suffix B.
automatic storage allocation. The allocation of Contrast with character constant. (2) A series of
storage for automatic variables. hexadecimal digits enclosed in single quotes and
followed by the suffix B4.
automatic variable. A variable whose storage is
allocated automatically at the activation of a block and bit string. A string composed of zero or more bits.
released automatically at the termination of that block.
Glossary 367
condition. An exceptional situation, either an error control variable. A variable that is used to control the
(such as an overflow), or an expected situation (such as iterative execution of a DO statement.
the end of an input file). When a condition is raised
(detected), the action established for it is processed. controlled parameter. A parameter for which the
See also established action and implicit action. CONTROLLED attribute is specified in a DECLARE
statement. It can be associated only with arguments
condition name. Name of a PL/I-defined or that have the CONTROLLED attribute.
programmer-defined condition.
controlled storage allocation. The allocation of
condition prefix. A parenthesized list of one or more storage for controlled variables.
condition names prefixed to a statement. It specifies
whether the named conditions are to be enabled or controlled variable. A variable whose allocation and
disabled. release are controlled by the ALLOCATE and FREE
statements, with access to the current generation only.
connected aggregate. An array or structure whose
elements occupy contiguous storage without any control sections. Grouped machine instructions in an
intervening data items. Contrast with nonconnected object module.
aggregate.
conversion. The transformation of a value from one
connected reference. A reference to connected representation to another to conform to a given set of
storage. It must be apparent, prior to execution of the attributes. For example, converting a character string to
program, that the storage is connected. an arithmetic value such as FIXED BINARY (15,0).
connected storage. Main storage of an uninterrupted cross section of an array. The elements represented
linear sequence of items that can be referred to by a by the extent of at least one dimension of an array. An
single name. asterisk in the place of a subscript in an array reference
indicates the entire extent of that dimension.
constant. (1) An arithmetic or string data item that
does not have a name and whose value cannot change. current generation. The generation of an automatic or
(2) An identifier declared with the VALUE attribute. controlled variable that is currently available by referring
(3) An identifier declared with the FILE or the ENTRY to the name of the variable.
attribute but without the VARIABLE attribute.
deactivated. The state in which an identifier is said to digit. One of the characters 0 through 9.
be when its value cannot replace a preprocessor
identifier in source program text. Contrast with active. dimension attribute. An attribute that specifies the
number of dimensions of an array and indicates the
debugging. Process of removing bugs from a bounds of each dimension.
program.
disabled. The state of a condition in which no interrupt
decimal. The number system whose numerals are 0 occurs and no established action will take place.
through 9.
do-group. A sequence of statements delimited by a
decimal digit picture character. The picture DO statement and ended by its corresponding END
specification character 9. statement, used for control purposes. Contrast with
block.
decimal fixed-point constant. A constant consisting
of one or more decimal digits with an optional decimal do-loop. See iterative do-group.
point.
dummy argument. Temporary storage that is created
decimal fixed-point value. A rational number automatically to hold the value of an argument that
consisting of a sequence of decimal digits with an cannot be passed by reference.
assumed position of the decimal point. Contrast with
binary fixed-point value. dump. Printout of all or part of the storage used by a
program as well as other program information, such as
decimal floating-point constant. A value made up of a trace of an error's origin.
a significand that consists of a decimal fixed-point
constant, and an exponent that consists of the letter E
followed by an optionally signed integer constant not E
exceeding three digits.
EBCDIC. (Extended Binary-Coded Decimal
decimal floating-point value. An approximation of a Interchange Code). A coded character set consisting of
real number, in the form of a significand, which can be 8-bit coded characters.
considered as a decimal fraction, and an exponent,
which can be considered as an integer exponent to the edit-directed transmission. The type of
base 10. Contrast with binary floating-point value. stream-oriented transmission in which data appears as
a continuous stream of characters and for which a
decimal picture data. See numeric picture data. format list is required to specify the editing desired for
the associated data list.
declaration. (1) The establishment of an identifier as
a name and the specification of a set of attributes element. A single item of data as opposed to a
(partial or complete) for it. (2) A source of attributes of collection of data items such as an array; a scalar item.
a particular name.
element expression. An expression whose evaluation
default. Describes a value, attribute, or option that is yields an element value.
assumed when none has been specified.
Glossary 369
element variable. A variable that represents an established action. The action taken when a
element; a scalar variable. condition is raised. See also implicit action and
ON-statement action.
elementary name. See base element.
epilogue. Those processes that occur automatically at
enabled. The state of a condition in which the the termination of a block or task.
condition can cause an interrupt and then invocation of
the appropriate established ON-unit. evaluation. The reduction of an expression to a single
value, an array of values, or a structured set of values.
end-of-step message. message that follows the listng
of the job control statements and job scheduler event. An activity in a program whose status and
messages and contains return code indicating success completion can be determined from an associated event
or failure for each step. variable.
entry constant. (1) The label prefix of a event variable. A variable with the EVENT attribute
PROCEDURE statement (an entry name). (2) The that can be associated with an event. Its value
declaration of a name with the ENTRY attribute but indicates whether the action has been completed and
without the VARIABLE attribute. the status of the completion.
entry data. A data item that represents an entry point explicit declaration. The appearance of an identifier
to a procedure. (a name) in a DECLARE statement, as a label prefix, or
in a parameter list. Contrast with implicit declaration.
entry expression. An expression whose evaluation
yields an entry name. exponent characters. The following picture
specification characters:
entry name. (1) An identifier that is explicitly or
1. K and E, which are used in floating-point picture
contextually declared to have the ENTRY attribute
specifications to indicate the beginning of the
(unless the VARIABLE attribute is given) or (2) An
exponent field.
identifier that has the value of an entry variable with the
ENTRY attribute implied. 2. F, the scaling factor character, specified with an
integer constant that indicates the number of
entry point. A point in a procedure at which it can be decimal positions the decimal point is to be moved
invoked. primary entry point and secondary entry point. from its assumed position to the right (if the
constant is positive) or to the left (if the constant is
entry reference. An entry constant, an entry variable negative).
reference, or a function reference that returns an entry
value. expression. (1) A notation, within a program, that
represents a value, an array of values, or a structured
entry variable. A variable to which an entry value can set of values. (2) A constant or a reference appearing
be assigned. It must have both the ENTRY and alone, or a combination of constants and/or references
VARIABLE attributes. with operators.
entry value. The entry point represented by an entry extended alphabet. The uppercase and lowercase
constant or variable; the value includes the environment alphabetic characters A through Z, $, @ and #, or those
of the activation that is associated with the entry specified in the NAMES compiler option.
constant.
extent. (1) The range indicated by the bounds of an
environment (of an activation). Information array dimension, by the length of a string, or by the size
associated with and used in the invoked block regarding of an area. (2) The size of the target area if this area
data declared in containing blocks. were to be assigned to a target area.
environment (of a label constant). Identity of the external name. A name (with the EXTERNAL
particular activation of a block to which a reference to a attribute) whose scope is not necessarily confined only
statement-label constant applies. This information is to one block and its contained blocks.
determined at the time a statement-label constant is
passed as an argument or is assigned to a external procedure. (1) A procedure that is not
statement-label variable, and it is passed or assigned contained in any other procedure. (2) A level-2
along with the constant. procedure contained in a package that is also exported.
factoring. The application of one or more attributes to fully qualified name. A name that includes all the
a parenthesized list of names in a DECLARE statement, names in the hierarchical sequence above the member
eliminating the repetition of identical attributes for to which the name refers, as well as the name of the
multiple names. member itself.
field (in the data stream). That portion of the data function (procedure). (1) A procedure that has a
stream whose width, in number of characters, is defined RETURNS option in the PROCEDURE statement.
by a single data or spacing format item. (2) A name declared with the RETURNS attribute. It is
invoked by the appearance of one of its entry names in
field (of a picture specification). Any character-string a function reference and it returns a scalar value to the
picture specification or that portion (or all) of a numeric point of reference. Contrast with subroutine.
character picture specification that describes a
fixed-point number. function reference. An entry constant or an entry
variable, either of which must represent a function,
file. A named representation, within a program, of a followed by a possibly empty argument list. Contrast
data set or data sets. A file is associated with the data with subroutine call.
set(s) for each opening.
Glossary 371
select-group and it can be used wherever a single input/output. The transfer of data between auxiliary
statement can appear, except as an on-unit. medium and main storage.
Glossary 373
multiple declaration. (1) Two or more declarations of numeric picture data. Picture data that has an
the same identifier internal to the same block without arithmetic value as well as a character value. This type
different qualifications. (2) Two or more external of picture data cannot contain the characters 'A' or
declarations of the same identifier. 'X.'
parameter. A name in the parameter list following the prefix operator. An operator that precedes an
PROCEDURE statement, specifying an argument that operand and applies only to that operand. The prefix
will be passed when the procedure is invoked. operators are plus (+), minus (−), and not (¬).
parameter descriptor. The set of attributes specified preprocessor. A program that examines the source
for a parameter in an ENTRY attribute specification. program before the compilation takes place.
parameter descriptor list. The list of all parameter preprocessor statement. A special statement
descriptors in an ENTRY attribute specification. appearing in the source program that specifies the
actions to be performed by the preprocessor. It is
parameter list. A parenthesized list of one or more executed as it is encountered by the preprocessor.
parameters, separated by commas and following either
the keyword PROCEDURE in a procedure statement or primary entry point. The entry point identified by any
the keyword ENTRY in an ENTRY statement. The list of the names in the label list of the PROCEDURE
corresponds to a list of arguments passed at invocation. statement.
partially qualified name. A qualified name that is priority. A value associated with a task, that specifies
incomplete. It includes one or more, but not all, of the the precedence of the task relative to other tasks.
names in the hierarchical sequence above the structure
or union member to which the name refers, as well as problem data. Coded arithmetic, bit, character,
the name of the member itself. graphic, and picture data.
picture data. Numeric data, character data, or a mix problem-state program. A program that operates in
of both types, represented in character form. the problem state of the operating system. It does not
contain input/output instructions or other privileged
picture specification. A data item that is described instructions.
using the picture characters in a declaration with the
PICTURE attribute or in a P-format item. procedure. A collection of statements, delimited by
PROCEDURE and END statements. A procedure is a
picture specification character. Any of the program or a part of a program, delimits the scope of
characters that can be used in a picture specification. names, and is activated by a reference to the procedure
or one of its entry names. See also external procedure
PL/I character set. A set of characters that has been and internal procedure.
defined to represent program elements in PL/I.
procedure reference. An entry constant or variable. It
PL/I prompter. Command processor program for the can be followed by an argument list. It can appear in a
PLI command that checks the operands and allocates CALL statement or the CALL option, or as a function
the data sets required by the compiler. reference.
point of invocation. The point in the invoking block at program. A set of one or more external procedures or
which the reference to the invoked procedure appears. packages. One of the external procedures must have
the OPTIONS(MAIN) specification in its procedure
pointer. A type of variable that identifies a location in statement.
storage.
program control data. Area, locator, label, format,
pointer value. A value that identifies the pointer type. entry, and file data that is used to control the
processing of a PL/I program.
pointer variable. A locator variable with the POINTER
attribute that contains a pointer value. prologue. The processes that occur automatically on
block activation.
precision. The number of digits or bits contained in a
fixed-point data item, or the minimum number of pseudovariable. Any of the built-in function names
significant digits (excluding the exponent) maintained for that can be used to specify a target variable. It is
a floating-point data item. usually on the left-hand side of an assignment
statement.
Glossary 375
transmission statements to control the format of data
Q being transmitted.
qualified name. A hierarchical sequence of names of repetition factor. A parenthesized unsigned integer
structure or union members, connected by periods, constant that specifies:
used to identify a name within a structure. Any of the
names can be subscripted. 1. The number of times the string constant that follows
is to be repeated.
2. The number of times the picture character that
R follows is to be repeated.
range (of a default specification). A set of identifiers
repetitive specification. An element of a data list that
and/or parameter descriptors to which the attributes in a
specifies controlled iteration to transmit one or more
DEFAULT statement apply.
data items, generally used in conjunction with arrays.
record. (1) The logical unit of transmission in a
restricted expression. An expression that can be
record-oriented input or output operation. (2) A
evaluated by the compiler during compilation, resulting
collection of one or more related data items. The items
in a constant. Operands of such an expression are
usually have different data attributes and usually are
constants, named constants, and restricted expressions.
described by a structure or union declaration.
returned value. The value returned by a function
recorded key. A character string identifying a record
procedure.
in a direct-access data set where the character string
itself is also recorded as part of the data. RETURNS descriptor. A descriptor used in a
RETURNS attribute, and in the RETURNS option of the
record-oriented data transmission. The transmission
PROCEDURE and ENTRY statements.
of data in the form of separate records. Contrast with
stream data transmission.
reentrant procedure. A procedure that can be scale. A system of mathematical notation whose
activated by multiple tasks, threads, or processes representation of an arithmetic value is either fixed-point
simultaneously without causing any interference or floating-point.
between these tasks, threads, and processes.
scale factor. A specification of the number of
REFER expression. The expression preceding the fractional digits in a fixed-point number.
keyword REFER, which is used as the bound, length, or
size when the based variable containing a REFER scaling factor. See scale factor.
option is allocated, either by an ALLOCATE or LOCATE
statement. scope (of a condition prefix). The portion of a
program throughout which a particular condition prefix
REFER object. The variable in a REFER option that applies.
holds or will hold the current bound, length, or size for
the member. The REFER object must be a member of scope (of a declaration or name). The portion of a
the same structure or union. It must not be program throughout which a particular name is known.
locator-qualified or subscripted, and it must precede the
member with the REFER option. secondary entry point. An entry point identified by
any of the names in the label list of an entry statement.
reference. The appearance of a name, except in a
context that causes explicit declaration. select-group. A sequence of statements delimited by
SELECT and END statements.
relative virtual origin (RVO). The actual origin of an
array minus the virtual origin of an array. selection clause. A WHEN or OTHERWISE clause of
a select-group.
remote format item. The letter R followed by the label
(enclosed in parentheses) of a FORMAT statement. self-defining data. An aggregate that contains data
The format statement is used by edit-directed data items whose bounds, lengths, and sizes are determined
shift-in. Symbol used to signal the compiler at the end static storage allocation. The allocation of storage for
of a double-byte string. static variables.
shift-out. Symbol used to signal the compiler at the static variable. A variable that is allocated before
beginning of a double-byte string. execution of the program begins and that remains
allocated for the duration of execution.
sign and currency symbol characters. The picture
specification characters. S, +, −, and $ (or other national stream-oriented data transmission. The transmission
currency symbols enclosed in < and >). of data in which the data is treated as though it were a
continuous stream of individual data values in character
simple parameter. A parameter for which no storage form. Contrast with record-oriented data transmission.
class attribute is specified. It can represent an
argument of any storage class, but only the current string. A contiguous sequence of characters, graphics,
generation of a controlled argument. or bits that is treated as a single data item.
simple statement. A statement other than IF, ON, string variable. A variable declared with the BIT,
WHEN, and OTHERWISE. CHARACTER, or GRAPHIC attribute, whose values can
be either bit, character, or graphic strings.
source. Data item to be converted for problem data.
structure. A collection of data items that need not
source key. A key referred to in a record-oriented have identical attributes. Contrast with array.
transmission statement that identifies a particular record
within a direct-access data set. structure expression. An expression whose
evaluation yields a structure set of values.
source program. A program that serves as input to
the source program processors and the compiler. structure of arrays. A structure that has the
dimension attribute.
source variable. A variable whose value participates
in some other operation, but is not modified by the structure member. See member.
operation. Contrast with target variable.
structuring. The hierarchy of a structure, in terms of
spill file. Data set named SYSUT1 that is used as a the number of members, the order in which they
temporary workfile. appear, their attributes, and their logical level.
standard default. The alternative attribute or option subroutine. A procedure that has no RETURNS
assumed when none has been specified and there is no option in the PROCEDURE statement. Contrast with
applicable DEFAULT statement. function.
standard file. A file assumed by PL/I in the absence subroutine call. An entry reference that must
of a FILE or STRING option in a GET or PUT represent a subroutine, followed by an optional
statement. SYSIN is the standard input file and argument list that appears in a CALL statement.
SYSPRINT is the standard output file. Contrast with function reference.
standard system action. Action specified by the subscript. An element expression that specifies a
language to be taken for an enabled condition in the position within a dimension of an array. If the subscript
absence of an ON-unit for that condition. is an asterisk, it specifies all of the elements of the
dimension.
statement. A PL/I statement, composed of keywords,
delimiters, identifiers, operators, and constants, and subscript list. A parenthesized list of one or more
terminated by a semicolon (;). Optionally, it can have a subscripts, one for each dimension of the array, which
condition prefix list and a list of labels. See also together uniquely identify either a single element or
cross section of the array.
Glossary 377
subtask. A task that is attached by the given task or
any of the tasks in a direct line from the given task to U
the last attached task.
undefined. Indicates something that a user must not
synchronous. A single flow of control for serial do. Use of a undefined feature is likely to produce
execution of a program. different results on different implementations of a PL/I
product. In that case, the application program is in
error.
T
union. A collection of data elements that overlay each
target. Attributes to which a data item (source) is other, occupying the same storage. The members can
converted. be structures, unions, elementary variables, or arrays.
They need not have identical attributes.
target reference. A reference that designates a
receiving variable (or a portion of a receiving variable). union of arrays. A union that has the DIMENSION
attribute.
target variable. A variable to which a value is
assigned. upper bound. The upper limit of an array dimension.
task variable. A variable with the TASK attribute variable. A named entity used to refer to data and to
whose value gives the relative priority of a task. which values can be assigned. Its attributes remain
constant, but it can refer to different values at different
termination (of a block). Cessation of execution of a times.
block, and the return of control to the activating block by
means of a RETURN or END statement, or the transfer variable reference. A reference that designates all or
of control to the activating block or to some other active part of a variable.
block by means of a GO TO statement.
virtual origin (VO). The location where the element of
termination (of a task). Cessation of the flow of the array whose subscripts are all zero are held. If
control for a task. such an element does not appear in the array, the
virtual origin is where it would be held.
truncation. The removal of one or more digits,
characters, graphics, or bits from one end of an item of
data when a string length or precision of a target Z
variable has been exceeded.
zero-suppression characters. The picture
type. The set of data attributes and storage attributes specification characters Z and *, which are used to
that apply to a generation, a value, or an item of data. suppress zeros in the corresponding digit positions and
replace them with blanks or asterisks respectively.
Index 381
CONSECUTIVE CYLOFL subparameter
option of ENVIRONMENT 163, 179 DCB parameter 144
consecutive data sets
controlling input from the terminal
capital and lowercase letters 176 D
condition format 174 data
COPY option of GET statement 176 conversion under OS/390 UNIX 132
end-of-file 176 files
format of data 175 creating under OS/390 UNIX 133
stream and record files 175 sort program 256
controlling output to the terminal PLISRT(x) command 260
capital and lowercase letters 177 sorting 245
conditions 176 description of 245
format of PRINT files 176 types
output from the PUT EDIT command 177 equivalent Java and PL/I 290
stream and record files 177 equivalent SQL and PL/I 77
defining and using 162 data definition (DD) information under OS/390
input from the terminal 174 UNIX 132
output to the terminal 176 data set
record-oriented data transmission associating PL/I files with
accessing and updating a data set 181 closing a file 146
creating a data set 181 opening a file 145
defining files 178 specifying characteristics in the ENVIRONMENT
specifying ENVIRONMENT options 179 attribute 146
statements and options allowed 177 associating several data sets with one file 130
record-oriented I/O 177 blocks and records 139
stream-oriented data transmission 162 checkpoint 348
accessing a data set 168 conditional subparameter characteristics 144
creating a data set 165 consecutive stream-oriented data 162
defining files 162 data set control block (DSCB) 143
specifying ENVIRONMENT options 163 ddnames 104
using PRINT files 169 defining for dump
using SYSIN and SYSPRINT files 173 DD statement 343
control logical record length 343
area 198 defining relative-record 223
characters 169 direct 142
CONTROL option dissociating from a file 146
EXEC statement 107 dissociating from PL/I file 131
interval 198 establishing characteristics 139
control blocks indexed
function-specific 351 sequential 142
global control 353 information interchange codes 140
COPY option 176 input in cataloged procedures 87
cross-reference table label modification 145
compiler listing 57 labels 143, 156
using XREF option 56 libraries
CSECT compiler option 10 extracting information 160
CTLASA and CTL360 options SPACE parameter 157
ENVIRONMENT option types of 156
for consecutive data sets 179 updating 158
SCALARVARYING 153 use 156
CURRENCY compiler option 11 organization
customizing conditional subparameters 143
user exit data definition (DD) statement 143
modifying SYSUEXIT 352 types of 142
structure of global control blocks 353 partitioned 156
writing your own compiler exit 353
Index 383
DD_DDNAME environment variables (continued) define file
specifying characteristics under OS/390 UNIX 133 associating several files with one data set 130
TYPE 138 closing a file 146
ddname concatenating several data sets 131
%INCLUDE 53 ENVIRONMENT attribute 146
standard data sets 104 opening a file 145
DEBLOCK regional data set 188
option of ENVIRONMENT 179 ENV options 189
deblocking of records 140 keys 189
declaration specifying characteristics 146
of files under OS/390 128 VSAM data set 202
DECLARE define file under OS/390
STATEMENT definition 84 associating several data sets with one file 130
TABLE statement 84 DEFINED
declaring versus UNION 240
host variables, SQL preprocessor 75 DELAY option under OS/390 UNIX
DEFAULT compiler option description 135
description and syntax 12 DELIMIT option under OS/390 UNIX
suboptions description 135
ALIGNED 17 DESCLIST compiler suboption 16
ASCII or EBCDIC 13 DESCLOCATOR compiler suboption 16
ASSIGNABLE or NONASSIGNABLE 13 descriptor 357
BYADDR or BYVALUE 13 descriptor area, SQL 73
CONNECTED or NONCONNECTED 13 DESCRIPTOR compiler option
DESCLIST or DESCLOCATOR 16 effect on performance 234
DESCRIPTOR or NODESCRIPTOR 14 DESCRIPTOR compiler suboption
DUMMY 16 description 14
E 18 descriptor header
EVENDEC or NOEVENDEC 15 descriptor list, argument passing 357
HEXADEC 18 descriptor-locator, argument passing 358
IBM or ANS 13 DFSORT 245
INITFILL or NOINITFILL 16 direct data sets 142
INLINE or NOINLINE 14 DIRECT file
LINKAGE 15 indexed ESDS with VSAM
LOWERINC | UPPERINC 17 accessing data set 212
NATIVE or NONNATIVE 14 updating data set 214
NATIVEADDR or NONNATIVEADDR 14 RRDS
NULLSYS or NULL370 15 access data set 226
ORDER or REORDER 15 DISP parameter
ORDINAL(MIN | MAX) 18 consecutive data sets 182
OVERLAP | NOOVERLAP 18 for consecutive data sets 181
RECURSVIE or NONRECURSIVE 15 to delete a data set 156
RETCODE 17 DISPLAY compiler option 19
RETURNS 16 DLLINIT compiler option 19
SHORT 16 DSCB (data set control block) 143, 158
deferred restart 349 DSNAME parameter
define data set for consecutive data sets 181, 182
associating several data sets with one file 130 DSORG subparameter 144
associating several files with one data set 130 DUMMY compiler suboption 16
closing a file 146 dummy records
concatenating several data sets 131 REGIONAL(1) data set 190
ENVIRONMENT attribute 146 VSAM 201
ESDS 207 dump
opening a file 145 calling PLIDUMP 342
specifying characteristics 146 defining data set for
DD statement 343
logical record length 343
Index 385
FETCH
assembler routines 122 H
Enterprise PL/I routines 114 handling routines
OS/390 C routines 122 data for sort
field for sorting 248 input (sort exit E15) 256
file output (sort exit E35) 259
associating data sets with files 128 PLISRTB 260
closing 146 PLISRTC 262
defining data sets under OS/390 128 PLISRTD 263
establishing characteristics 139 to determine success 254
FILE attribute 56 variable length records 264
filespec 133 header label 143
FILLERS, for tab control table 172 HEXADEC compiler suboption 18
FILSZ sort option 249 HFS files
filtering messages 352 hook
FIXED location suboptions 46
TYPE option under OS/390 UNIX 138 host
fixed-length records 140 structures 82
FLAG compiler option 20 variables, using in SQL statements 75
flags, specifying compile-time options 103
FLOAT option 20
flowchart for sort 256
I
I compiler message 60
format notation, rules for xvi
IBM compiler suboption 13
forward slash (/) 132
IBMUEXIT compiler exit 352
FS option of ENVIRONMENT
IBMZC cataloged procedure 88
for record I/O 148
IBMZCB cataloged procedure 89
for stream I/O 163
IBMZCBG cataloged procedure 91
FUNC subparameter
IBMZCPG cataloged procedure 95
usage 144
IBMZCPL cataloged procedure 92
IBMZCPLG cataloged procedure 94
G identifiers
not referenced 6
GENKEY option
key classification 151 source program 6
usage 147 improving application performance 230
VSAM 203 INCAFTER compiler option 21
GET DATA statement 112 INCDIR compiler option 21
GET EDIT statement 112 %INCLUDE statement 53, 106
GET LIST statement 112 control statement 53
global control blocks source statement library 106
data entry fields 354 INCLUDE option 22
writing the initialization procedure 355 include preprocessor
writing the message filtering procedure 355 syntax 64
writing the termination procedure 356 %INCLUDE statement 22
GONUMBER compiler option 230 compiler 53
definition 20 without full preprocessor 22
GOTO statements 237 INDEXAREA option 147
graphic data 162 indexed data sets
GRAPHIC option indexed sequential data set 142
compiler 21 indexed ESDS (entry-sequenced data set)
of ENVIRONMENT 147, 165 DIRECT file 212
stream I/O 163 loading 210
graphic string constant compilation 21 SEQUENTIAL file 212
indicator variables, SQL 82
information interchange codes 140
Index 387
library (continued)
types of 156 M
updating a library member 160 MACRO option 25
using 156 macro preprocessor
LIMCT subparameter 144, 196 macro definition 65
LIMITS compiler option 24 options 65
line main storage for sort 251
length 170 MAP compiler option 26
numbers in messages 20 MARGINI compiler option 26
line feed (LF) MARGINS compiler option 26
definition 138 mass sequential insert 214
LINE option 163, 170 MAXMEM compiler option 27
LINECOUNT compiler option 25 MAXMSG compiler option 28
LINESIZE option MAXSTMT compiler option 28
for tab control table 172 MDECK compiler option
OPEN statement 164 description 28
link-editing message
description of 109 compiler list 60
LINKAGE compiler suboption printed format 173
effect on performance 235 run-time message line numbers 20
syntax 15 messages
Linking PL/I code filter function 355
LIST compiler option 25 modifying in compiler user exit 352
listing mixed string constant compilation 21
cataloged procedure 97 MODE subparameter
compiler usage 144
aggregate length table 57 module
ATTRIBUTE and cross-reference table 56 create and store object module 31
ddname list 3 multiple
file reference table 60 invocations
heading information 55 cataloged procedure 97
messages 60
options 55
preprocessor input 55
N
NAME compiler option 29
return codes 60
named constants
SOURCE option program 56
defining 241
statement nesting level 56
versus static variables 241
statement offset addresses 57
NAMES compiler option 29
storage offset listing 59
NATIVE compiler suboption
OS/390 batch compile 101, 106
description 14
source program 42
NATIVEADDR compiler suboption 14
statement offset address 57
NATLANG compiler option 30
storage offset listing 59
negative value
SYSPRINT 106
block-size 150
loader program, using 95
record length 149
logical not 30
NEST option 30
logical or 33
NODESCRIPTOR compiler suboption 14
loops
NOEQUALS sort option 249
control variables 238
NOEVENDEC compiler suboption 15
LOWERINC compiler suboption 17
NOINITFILL compiler suboption 16
LRECL option under OS/390 UNIX 136
NOINLINE compiler suboption 14
LRECL subparameter 139, 144
NOINTERRUPT compiler option 23
LRMSKIP option under OS/390 UNIX 136
NOMAP option 57
NONASSIGNABLE compiler suboption 13
Index 389
PLIRETC built-in subroutine
P return codes for sort 254
PACKAGEs versus nested PROCEDUREs 238 PLISRTA interface 260
%PAGE 53 PLISRTB interface 260
control statement 53 PLISRTC interface 262
PAGE option 163 PLISRTD interface 263
PAGELENGTH, for tab control table 172 PLITABS external structure
PAGESIZE, for tab control table 172 control section 173
parameter passing declaration 110
argument passing 357 PLIXOPT variable 110
descriptor header 358 %POP statement 53
PARM parameter PP compiler option 33
for cataloged procedure 99 PPTRACE compiler option 34
specify options 107 PREFIX compiler option 34, 232
passing an argument 357 using default suboptions 232
performance preprocessing
VSAM options 204 %INCLUDE statement 53
performance improvement input 55
coding for performance limit output to 80 bytes 28
avoiding calls to library routines 242 source program 25
DATA-directed input and output 236 with MACRO 25
DEFINED versus UNION 240 preprocessors
GOTO statements 237 available with PL/I 63
input-only parameters 237 CICS options 85
loop control variables 238 include 64
named constants versus static variables 241 macro preprocessor 65
PACKAGEs versus nested PROCEDUREs 238 SQL options 68
REDUCIBLE functions 239 SQL preprocessor 66
string assignments 237 %PRINT 53
selecting compiler options control statement 53
ARCH 230 PRINT file
DEFAULT 233 format 176
GONUMBER 230 line length 170
OPTIMIZE 230 stream I/O 169
PREFIX 232 PRINT file
REDUCE 231 formatting conventions 110
RULES 231 punctuating output 110
PL/I record I/O 183
compiler procedure
user exit procedures 351 cataloged, using under OS/390 87
files compile and bind (IBMZCB) 89
associating with a data set under OS/390 compile and link-edit (IBMZCPL) 92
UNIX 132 compile only (IBMZC) 88
PL/I code, compiling 280, 284, 289 compile, bind, and run (IBMZCBG) 91
PL/I code, linking 280, 284, 289 compile, prelink, link-edit, and run (IBMZCPLG) 94
PL/I code, writing 278, 283, 288 compile, prelink, load and run (IBMZCPG) 95
PLICANC statement, and checkpoint/request 350 PROCEED compiler option 34
PLICKPT built-in subroutine 347 PROCESS statement
PLIDUMP built-in subroutine description 52
calling to produce a Language Environment for override option defaults 107
OS/390 & VM dump 342 PROMPT option under OS/390 UNIX 136
H option 343 prompting
syntax of 342 automatic, overriding 111
user-identifier 343 automatic, using 111
PLIREST statement 349 PRTSP subparameter
usage 144
Index 391
return code (continued) SKIP0 option under OS/390 UNIX 138
PLIRETC 254 SKIPREC sort option 249
return codes sorting
in compiler listing 60 assessing results 254
RETURNS compiler suboption 16, 236 calling sort 251
REUSE option 147, 204 CHKPT option 249
RRDS (relative record data set) choosing type of sort 246
define 224 CKPT option 249
load statements and options 221 data 245
load with VSAM 223 data input and output 256
updating 226 description of 245
VSAM DYNALLOC option 249
DIRECT file 226 E15 input handling routine 256
loading 223 EQUALS option 249
SEQUENTIAL file 225 FILSZ option 249
RULES compiler option 37 maximum record length 250
effect on performance 231 PLISRT 245
run-time PLISRTA(x) command 260—265
message line numbers 20 preparation 245
OS/390 considerations RECORD statement 256
automatic prompting 111 RETURN statement 256
formatting conventions 110 SKIPREC option 249
GET EDIT statement 112 SORTCKPT 255
GET LIST and GET DATA statements 112 SORTCNTL 255
punctuating long lines 112 SORTIN 255
SKIP option 113 sorting field 248
using PLIXOPT 110 SORTLIB 254
Running Sample Program SORTOUT 255
SORTWK 251, 254
storage
S auxiliary 251
S compiler message 60 main 251
SAMELINE option under OS/390 UNIX 137 writing input/output routines 256
sample program, running 280, 285, 290 source
SCALARVARYING option 153 key
SEMANTIC compiler option 41 in REGIONAL(1) data sets 190
sequential access listing
REGIONAL(1) data set 192 location 26
sequential data set 142 program
SEQUENTIAL file compiler list 56
ESDS with VSAM data set 105
defining and loading 207 identifiers 6
updating 208 included in compiler list 22
indexed ESDS with VSAM list 42
access data set 212 preprocessor 25
RRDS, access data set 225 shifting outside text 26
serial number volume label 143 SOURCE compiler option 42
SERVICE compiler option 42 source statement library 106
shift code compilation 21 SPACE parameter
SHORT compiler suboption 16 library 157
%SKIP 53 standard data sets 104
control statement 53 specifying compile-time options
SKIP option using flags under 103
in stream I/O 163 SPILL compiler option 42
under OS/390 113 spill file 106
Index 393
TEST compiler option variable-length records
definition 46 format 141
TIME parameter 99 sort program 264
TITLE option VB option of ENVIRONMENT
associating standard SYSPRINT file 114 for record I/O 148
description under OS/390 UNIX 132 for stream I/O 163
using 144 VB-format records 141
TITLE option under OS/390 VBS option of ENVIRONMENT
specifying character string value 128 for stream I/O 163
TITLE option under OS/390 UNIX VOLUME parameter
using files not associated with data sets 133 consecutive data sets 181, 182
trailer label 143 volume serial number
TUNE compiler option 47 direct access volumes 143
TYPE option under OS/390 UNIX 138 regional data sets 195
VS option of ENVIRONMENT
for stream I/O 163
U VSAM (virtual storage access method)
U compiler message 60 alternate index paths
U option of ENVIRONMENT data sets
for record I/O 148 alternate index paths 205
for stream I/O 163 alternate indexes 215
U-format 142 blocking 198
undefined-length records 142 choosing a type 201
UNDEFINEDFILE condition defining 205
BLKSIZE error 150 defining files for 202
line size conflict in OPEN 170 dummy data set 201
raising when opening a file under OS/390 entry-sequenced 206
UNIX 139 file attribute 202
UNDEFINEDFILE condition under OS/390 key-sequenced and indexed
DD statement error 129 entry-sequenced 209
UNDEFINEDFILE condition under OS/390 UNIX keys for 200
using files not associated with data sets 139 organization 198
UNIT parameter performance options 204
consecutive data sets 182 relative record 221
unreferenced identifiers 6 running a program with 197
updating specifying ENVIRONMENT options 203
ESDS 208 using 197
REGIONAL(1) data set 193 defining files 202
relative-record data set 226 ENV option 203
UPPERINC compiler suboption 17 performance option 204
USAGE compiler option 48 indexed data set
user exit load statement and options 209
compiler 351 mass sequential insert 214
customizing relative-record data set 223
modifying SYSUEXIT 352 VSAM option 204
structure of global control blocks 353 VTOC 143
writing your own compiler exit 353
functions 351
sort 248 W
using host variables, SQL preprocessor 75 W compiler message 60
WIDECHAR compiler option 48
WINDOW compiler option 49
V work data sets for sort 254
V option of ENVIRONMENT WRITABLE compiler option 49
for record I/O 148 Writing Java code
for stream I/O 163
X
XINFO compiler option 50
XREF compiler option 51
Z
zero value 149
Index 395
We'd Like to Hear from You
Enterprise PL/I for z/OS and OS/390
Programming Guide
Version 3 Release 2.0
Publication No. SC27-1457-02
Please use one of the following ways to send us your comments about this book:
Mail—Use the Readers' Comments form on the next page. If you are sending the form
from a country other than the United States, give it to your local IBM branch office or
IBM representative for mailing.
Fax—Use the Readers' Comments form on the next page and fax it to this U.S. number:
800-426-7773.
Electronic mail—Use one of the following network IDs:
Internet: [email protected]
Be sure to include the following with your comments:
– Title and publication number of this book
– Your name, address, and telephone number if you would like a reply
Your comments should pertain only to the information in this book and the way the
information is presented. To request additional publications, or to comment on other IBM
information or the function of IBM products, please give your comments to your IBM
representative or to your IBM authorized remarketer.
Very Very
Satisfied Satisfied Neutral Dissatisfied Dissatisfied
Technically accurate
Complete
Easy to find
Easy to understand
Well organized
Applicable to your tasks
Grammatically correct and consistent
Graphically well designed
Overall satisfaction
Name Address
Company or Organization
Phone No.
Cut or Fold
Readers' Comments
IBM
Along Line
SC27-1457-02
NO POSTAGE
NECESSARY
IF MAILED IN THE
UNITED STATES
IBM Corporation
Department HHX/H3
555 Bailey Ave
San Jose, CA 95141-1099
Cut or Fold
SC27-1457-02 Along Line
IBM
SC27-1457-K2
Spine information:
IBM Enterprise PL/I for z/OS and OS/390 Programming Guide Version 3 Release 2.0