Cobol Programming Guide - Igy5pg20
Cobol Programming Guide - Igy5pg20
Programming Guide
Version 5.2
SC14-7382-03
Enterprise COBOL for z/OS
Programming Guide
Version 5.2
SC14-7382-03
Note
Before using this information and the product it supports, be sure to read the general information under Notices on page
815.
First edition
| This edition applies to Version 5 Release 2 of IBM Enterprise COBOL for z/OS (program number 5655-W32) and to
| all subsequent releases and modifications until otherwise indicated in new editions. Make sure that you are using
| the correct edition for the level of the product.
You can view or download softcopy publications free of charge at www.ibm.com/shop/publications/order/.
Copyright IBM Corporation 1991, 2015.
US Government Users Restricted Rights Use, duplication or disclosure restricted by GSA ADP Schedule Contract
with IBM Corp.
Contents
Tables . . . . . . . . . . . . . . . xiii Examples: initializing data items . . . . . . 28
Initializing a structure (INITIALIZE) . . . . . 30
Preface . . . . . . . . . . . . . . xv Assigning values to elementary data items
(MOVE) . . . . . . . . . . . . . . 32
About this information . . . . . . . . . . xv
Assigning values to group data items (MOVE) . 33
How this information will help you . . . . . xv
Assigning arithmetic results (MOVE or
Abbreviated terms . . . . . . . . . . . xv
COMPUTE) . . . . . . . . . . . . . 34
Comparison of commonly used terms . . . . xvi
Assigning input from a screen or file (ACCEPT) 34
How to read syntax diagrams . . . . . . . xvi
Displaying values on a screen or in a file (DISPLAY) 35
How examples are shown . . . . . . . . xviii
Displaying data on the system logical output
Additional documentation and support . . . . xviii
device . . . . . . . . . . . . . . . 36
Summary of changes . . . . . . . . . . xviii
Using WITH NO ADVANCING . . . . . . 37
| Version 5 Release 2 . . . . . . . . . . xix
Using intrinsic functions (built-in functions) . . . 38
Version 5 Release 1 Modification 1 . . . . . xix
Using tables (arrays) and pointers . . . . . . . 39
Version 5 Release 1 . . . . . . . . . . . xx
Storage and its addressability . . . . . . . . 39
How to send your comments . . . . . . . . xxii
Restrictions for AMODE . . . . . . . . . . 40
Accessibility. . . . . . . . . . . . . . xxii
Settings for RMODE . . . . . . . . . . . 41
Interface information . . . . . . . . . . xxii
Storage restrictions for passing data . . . . . 41
Keyboard navigation . . . . . . . . . . xxii
Location of data areas . . . . . . . . . . 42
Accessibility of this information . . . . . . xxiii
Storage for LOCAL-STORAGE data . . . . . 42
IBM and accessibility . . . . . . . . . xxiii
Storage for external data . . . . . . . . . 42
Storage for QSAM input-output buffers . . . . 42
Part 1. Coding your program . . . . 1
Chapter 3. Working with numbers and
Chapter 1. Structuring your program . . 3 arithmetic . . . . . . . . . . . . . 43
Identifying a program . . . . . . . . . . . 3 Defining numeric data. . . . . . . . . . . 43
Identifying a program as recursive . . . . . . 4 Displaying numeric data . . . . . . . . . . 45
Marking a program as callable by containing Controlling how numeric data is stored . . . . . 46
programs . . . . . . . . . . . . . 4. Formats for numeric data. . . . . . . . . . 47
Setting a program to an initial state. . . . . 5. External decimal (DISPLAY and NATIONAL)
Changing the header of a source listing . . . 5. items . . . . . . . . . . . . . . . 47
Describing the computing environment . . . . 5. External floating-point (DISPLAY and
Example: FILE-CONTROL entries . . . . . 6. NATIONAL) items . . . . . . . . . . . 48
Specifying the collating sequence . . . . . 6. Binary (COMP) items . . . . . . . . . . 48
Defining symbolic characters . . . . . . . 8. Native binary (COMP-5) items . . . . . . . 49
Defining a user-defined class . . . . . . . 8. Packed-decimal (COMP-3) items . . . . . . 50
Defining files to the operating system . . . . 8. Internal floating-point (COMP-1 and COMP-2)
Describing the data . . . . . . . . . . . . 11 items . . . . . . . . . . . . . . . 50
Using data in input and output operations . . . 11 Examples: numeric data and internal
Comparison of WORKING-STORAGE and representation . . . . . . . . . . . . 51
LOCAL-STORAGE . . . . . . . . . . . 14 Data format conversions . . . . . . . . . . 52
Using data from another program . . . . . . 16 Conversions and precision . . . . . . . . 52
Processing the data . . . . . . . . . . . . 17 Sign representation of zoned and packed-decimal
How logic is divided in the PROCEDURE data . . . . . . . . . . . . . . . . . 53
DIVISION . . . . . . . . . . . . . . 18 Checking for incompatible data (numeric class test) 54
Declaratives . . . . . . . . . . . . . 21 Performing arithmetic . . . . . . . . . . . 55
Using COMPUTE and other arithmetic
Chapter 2. Using data . . . . . . . . 23 statements . . . . . . . . . . . . . . 56
Using variables, structures, literals, and constants . 23 Using arithmetic expressions . . . . . . . 57
Using variables . . . . . . . . . . . . 23 Using numeric intrinsic functions . . . . . . 57
Using data items and group items . . . . . . 24 Using math-oriented callable services . . . . . 58
Using literals . . . . . . . . . . . . . 25 Using date callable services . . . . . . . . 60
Using constants . . . . . . . . . . . . 26 Examples: numeric intrinsic functions . . . . 60
Using figurative constants . . . . . . . . 26 Fixed-point contrasted with floating-point arithmetic 62
Assigning values to data items . . . . . . . . 27 Floating-point evaluations . . . . . . . . 63
Contents v
Chapter 13. Handling errors . . . . . 239 Messages and listings for compiler-detected
Requesting dumps . . . . . . . . . . . 239 errors . . . . . . . . . . . . . . . 280
Handling errors in joining and splitting strings . . 240 Format of compiler diagnostic messages . . . 281
Handling errors in arithmetic operations . . . . 240 Severity codes for compiler diagnostic messages 282
Example: checking for division by zero . . . . 241
Handling errors in input and output operations 241 Chapter 15. Compiling under z/OS
Using the end-of-file condition (AT END) . . . 243 UNIX . . . . . . . . . . . . . . . 283
Coding ERROR declaratives . . . . . . . 244 Setting environment variables under z/OS UNIX 283
Using file status keys . . . . . . . . . . 245 Specifying compiler options under z/OS UNIX . . 284
Example: file status key . . . . . . . . . 246 Compiling and linking with the cob2 command 285
Using VSAM status codes (VSAM files only) 246 Creating a DLL under z/OS UNIX . . . . . 286
Example: checking VSAM status codes . . . . 247 Example: using cob2 to compile and link under
Coding INVALID KEY phrases . . . . . . 249 z/OS UNIX . . . . . . . . . . . . . 286
Example: FILE STATUS and INVALID KEY . . 249 cob2 syntax and options . . . . . . . . . 287
Handling errors when calling programs . . . . 250 cob2 input and output files . . . . . . . . 288
Writing routines for handling errors . . . . . . 250 Compiling using scripts . . . . . . . . . . 290
Contents vii
COBOL and DB2 CCSID determination. . . . . 437 Chapter 24. Using subprograms . . . 463
Code-page determination for string host Main programs, subprograms, and calls . . . . 463
variables in SQL statements . . . . . . . 437 Ending and reentering main programs or
Programming with the SQLCCSID or subprograms . . . . . . . . . . . . . 464
NOSQLCCSID option . . . . . . . . . 438 Transferring control to another program . . . . 465
Differences in how the DB2 precompiler and Making static calls. . . . . . . . . . . 466
coprocessor behave . . . . . . . . . . . 439 Making dynamic calls . . . . . . . . . 467
Period at the end of EXEC SQL INCLUDE AMODE switching . . . . . . . . . . 469
statements . . . . . . . . . . . . . 439 Performance considerations of static and
EXEC SQL INCLUDE and nested COPY dynamic calls . . . . . . . . . . . . 471
REPLACING . . . . . . . . . . . . 439 Making both static and dynamic calls . . . . 471
EXEC SQL and REPLACE or COPY Examples: static and dynamic CALL statements 472
REPLACING . . . . . . . . . . . . 439 Calling nested COBOL programs . . . . . . 473
Source code after an END-EXEC statement . . 440 Making recursive calls . . . . . . . . . . 477
Multiple definitions of host variables . . . . 440 Calling to and from object-oriented programs . . 477
EXEC SQL statement continuation lines . . . 440 Using procedure and function pointers . . . . . 477
Bit-data host variables . . . . . . . . . 440 Deciding which type of pointer to use . . . . 479
SQL-INIT-FLAG . . . . . . . . . . . 440 Calling alternate entry points . . . . . . . 479
Choosing the DYNAM or NODYNAM compiler Making programs reentrant . . . . . . . . 480
option . . . . . . . . . . . . . . . . 441
Chapter 25. Sharing data . . . . . . 481
Chapter 22. Developing COBOL Passing data . . . . . . . . . . . . . . 481
programs for IMS. . . . . . . . . . 443 Describing arguments in the calling program 483
IMS SQL coprocessor . . . . . . . . . . . 443 Describing parameters in the called program 484
Coding SQLIMS statements . . . . . . . . 444 Testing for OMITTED arguments . . . . . . 485
Using SQLIMS INCLUDE with the IMS SQL Coding the LINKAGE SECTION . . . . . . . 485
coprocessor . . . . . . . . . . . . . 444 Coding the PROCEDURE DIVISION for passing
Using character data in SQLIMS statements . . 445 arguments . . . . . . . . . . . . . . 486
Using binary items in SQLIMS statements . . . 445 Grouping data to be passed . . . . . . . 486
Determining the success of SQLIMS statements 445 Handling null-terminated strings . . . . . . 486
Compiling with the SQLIMS option . . . . . . 445 Using pointers to process a chained list . . . 487
Separating IMS suboptions . . . . . . . . 446 Passing return-code information . . . . . . . 490
Compiling and linking COBOL programs for Using the RETURN-CODE special register. . . 490
running under IMS . . . . . . . . . . . 447 Using PROCEDURE DIVISION RETURNING . .
Using object-oriented COBOL and Java under IMS 448 .. . . . . . . . . . . . . . . . . 490
Calling a COBOL method from a Java Specifying CALL . . . RETURNING . . . . . 491
application under IMS . . . . . . . . . 448 Sharing data by using the EXTERNAL clause. . . 491
Building a mixed COBOL-Java application that Sharing files between programs (external files) . . 491
starts with COBOL . . . . . . . . . . 449 Example: using external files . . . . . . . 492
Writing mixed-language IMS applications . . . 449 Accessing main program parameters under z/OS 495
Example: accessing main program parameters
Chapter 23. Running COBOL under z/OS . . . . . . . . . . . . . 495
programs under z/OS UNIX . . . . . 453
Running in z/OS UNIX environments . . . . . 453 Chapter 26. Creating a DLL or a DLL
Setting and accessing environment variables . . . 454 application . . . . . . . . . . . . 497
Setting environment variables that affect Dynamic link libraries (DLLs) . . . . . . . . 497
execution . . . . . . . . . . . . . . 455 Compiling programs to create DLLs . . . . . . 498
Runtime environment variables . . . . . . 455 Linking DLLs . . . . . . . . . . . . . 499
Example: setting and accessing environment Example: sample JCL for a procedural DLL
variables . . . . . . . . . . . . . . 456 application . . . . . . . . . . . . . . 500
Calling UNIX/POSIX APIs . . . . . . . . . 456 Using CALL identifier with DLLs . . . . . . 500
Accessing main program parameters under z/OS Search order for DLLs in the z/OS UNIX file
UNIX . . . . . . . . . . . . . . . . 458 system . . . . . . . . . . . . . . 501
Example: accessing main program parameters Using DLL linkage and dynamic calls together . . 502
under z/OS UNIX. . . . . . . . . . . 459 Using procedure or function pointers with DLLs 503
Calling DLLs from non-DLLs . . . . . . . 503
Example: calling DLLs from non-DLLs . . . . 504
Part 4. Structuring complex
Using COBOL DLLs with C/C++ programs . . . 505
applications . . . . . . . . . . . 461 Using DLLs in OO COBOL applications . . . . 506
Contents ix
Example: J2EE client written in COBOL . . . . 634 | Using the format 2 SORT statement to sort a table 671
COBOL client (ConverterClient.cbl) . . . . . 635
Java client (ConverterClient.java) . . . . . . 637
Part 9. Appendixes . . . . . . . . 673
Part 7. Specialized processing . . 639 Appendix A. Intermediate results and
arithmetic precision . . . . . . . . 675
Chapter 32. Interrupts and Terminology used for intermediate results . . . . 676
checkpoint/restart . . . . . . . . . 641 Example: calculation of intermediate results . . . 677
Setting checkpoints . . . . . . . . . . . 641 Fixed-point data and intermediate results . . . . 677
Designing checkpoints . . . . . . . . . 642 Addition, subtraction, multiplication, and
Testing for a successful checkpoint . . . . . 642 division . . . . . . . . . . . . . . 677
DD statements for defining checkpoint data sets 643 Exponentiation . . . . . . . . . . . . 678
Messages generated during checkpoint . . . . 644 Example: exponentiation in fixed-point
Restarting programs . . . . . . . . . . . 644 arithmetic . . . . . . . . . . . . . 679
Requesting automatic restart . . . . . . . 645 Truncated intermediate results. . . . . . . 680
Requesting deferred restart . . . . . . . . 645 Binary data and intermediate results . . . . 680
Formats for requesting deferred restart . . . . 646 Intrinsic functions evaluated in fixed-point
Resubmitting jobs for restart . . . . . . . 647 arithmetic . . . . . . . . . . . . . . 680
Example: restarting a job at a specific Integer functions . . . . . . . . . . . 680
checkpoint step. . . . . . . . . . . . 647 Mixed functions . . . . . . . . . . . 681
Example: requesting a step restart . . . . . 647 Floating-point data and intermediate results . . . 682
Example: resubmitting a job for a step restart 647 Exponentiations evaluated in floating-point
Example: resubmitting a job for a checkpoint arithmetic . . . . . . . . . . . . . 683
restart . . . . . . . . . . . . . . . 648 Intrinsic functions evaluated in floating-point
arithmetic . . . . . . . . . . . . . 683
Arithmetic expressions in nonarithmetic statements 683
Part 8. Improving performance and
productivity . . . . . . . . . . . 649 Appendix B. Converting double-byte
character set (DBCS) data . . . . . . 685
Chapter 33. Tuning your program . . . 651 DBCS notation . . . . . . . . . . . . . 685
Using an optimal programming style . . . . . 651 Alphanumeric to DBCS data conversion
Using structured programming . . . . . . 652 (IGZCA2D) . . . . . . . . . . . . . . 685
Factoring expressions. . . . . . . . . . 652 IGZCA2D syntax . . . . . . . . . . . 685
Using symbolic constants . . . . . . . . 652 IGZCA2D return codes . . . . . . . . . 686
Choosing efficient data types . . . . . . . . 652 Example: IGZCA2D . . . . . . . . . . 687
Choosing efficient computational data items . . 653 DBCS to alphanumeric data conversion (IGZCD2A) 688
Using consistent data types. . . . . . . . 653 IGZCD2A syntax . . . . . . . . . . . 688
Making arithmetic expressions efficient . . . . 654 IGZCD2A return codes . . . . . . . . . 689
Making exponentiations efficient . . . . . . 654 Example: IGZCD2A . . . . . . . . . . 689
| Using VOLATILE clauses efficiently . . . . . 654
Handling tables efficiently . . . . . . . . . 654
Optimization of table references . . . . . . 656
Appendix C. XML reference material 691
Optimizing your code . . . . . . . . . . 657 | XML PARSE exceptions with XMLPARSE(XMLSS)
Optimization . . . . . . . . . . . . 657 | in effect . . . . . . . . . . . . . . . 691
Choosing compiler features to enhance | XML PARSE exceptions with
performance . . . . . . . . . . . . . . 658 | XMLPARSE(COMPAT) in effect . . . . . . . 693
Performance-related compiler options . . . . 659 | XML PARSE exceptions that allow continuation 693
Evaluating performance . . . . . . . . . 662 | XML PARSE exceptions that do not allow
Running efficiently with CICS, IMS, or VSAM . . 662 | continuation . . . . . . . . . . . . . 697
Choosing static or dynamic calls . . . . . . . 663 XML GENERATE exceptions . . . . . . . . 700
Chapter 34. Simplifying coding . . . . 665 Appendix D. EXIT compiler option . . 701
Eliminating repetitive coding . . . . . . . . 665 Using the user-exit work area . . . . . . . . 701
Example: using the COPY statement. . . . . 666 Calling from exit modules . . . . . . . . . 702
Using Language Environment callable services . . 667 Processing of INEXIT. . . . . . . . . . . 702
Sample list of Language Environment callable INEXIT parameters . . . . . . . . . . 702
services . . . . . . . . . . . . . . 668 Processing of LIBEXIT . . . . . . . . . . 703
Calling Language Environment services . . . 669 Processing of LIBEXIT with nested COPY
Example: Language Environment callable statements . . . . . . . . . . . . . 704
services . . . . . . . . . . . . . . 670 LIBEXIT parameters . . . . . . . . . . 705
Contents xi
xii Enterprise COBOL for z/OS, V5.2 Programming Guide
Tables
1. FILE-CONTROL entries . . . . . . . . 6 41. Commands for compiling and linking a
2. FILE SECTION entries . . . . . . . . 12 class definition . . . . . . . . . . . 292
3. Assignment to data items in a program 27 42. java command options for customizing the
4. Effect of RMODE and RENT compiler JVM . . . . . . . . . . . . . . 294
options on the RMODE attribute . . . . . 41 43. Compiler options . . . . . . . . . . 301
5. Ranges in value of COMP-5 data items 49 44. Mutually exclusive compiler options 305
6. Internal representation of numeric items 51 45. EBCDIC multibyte coded character set
7. NUMCLS(PRIM) and valid signs . . . . . 55 identifiers . . . . . . . . . . . . 315
8. NUMCLS(ALT) and valid signs . . . . . 55 46. DISPLAY output with the DISPSIGN(COMPAT)
9. Order of evaluation of arithmetic operators 57 option or the DISPSIGN(SEP) option specified: . 321
10. Numeric intrinsic functions . . . . . . . 58 47. Values of the LANGUAGE compiler option 332
11. Compatibility of math intrinsic functions and | 48. Mapping of removed options to new options 344
callable services . . . . . . . . . . . 59 49. Severity levels of compiler messages 384
12. INTDATE(LILIAN) and compatibility of date 50. Using compiler options to get listings 388
intrinsic functions and callable services. . . 60 51. Terms used in MAP output . . . . . . 395
13. INTDATE(ANSI) and compatibility of date 52. Symbols used in LIST and MAP output 396
intrinsic functions and callable services. . . 60 53. Compiler options in the INFO BYTE section 399
14. Hexadecimal values of the euro sign . . . . 65 54. Signature information bytes . . . . . . 399
15. COBOL statements and national data 126 55. Calls between COBOL and assembler under
16. Intrinsic functions and national character CICS . . . . . . . . . . . . . . 422
data. . . . . . . . . . . . . . . 128 56. Compiler options required for the integrated
17. National group items that are processed CICS translator . . . . . . . . . . . 424
with group semantics . . . . . . . . 136 57. Compiler options required for the separate
18. Encoding and size of alphanumeric, DBCS, CICS translator . . . . . . . . . . . 426
and national data . . . . . . . . . . 137 58. TRUNC compiler options recommended for
19. Summary of file organizations, access the separate CICS translator . . . . . . 427
modes, and record formats of COBOL files . 155 59. Samples with POSIX function calls . . . . 457
20. QSAM file allocation. . . . . . . . . 175 60. Effects of termination statements. . . . . 464
21. Maximum record length of QSAM files 179 61. Methods for passing data in the CALL
22. Comparison of VSAM, COBOL, and statement . . . . . . . . . . . . . 482
non-VSAM terminology. . . . . . . . 185 62. Compiler options for DLL applications 498
23. Comparison of VSAM data-set types 187 63. Binder options for DLL applications 499
24. VSAM file organization, access mode, and 64. Special registers used by the XML parser 522
record format . . . . . . . . . . . 188 | 65. Results of processing-procedure changes to
25. Definition of VSAM fixed-length records 192 | XML-CODE with XMLPARSE(XMLSS) in effect . . 525
26. Definition of VSAM variable-length records 192 | 66. Results of processing-procedure changes to
27. I/O statements for VSAM sequential files 194 | XML-CODE with XMLPARSE(COMPAT) in effect . . 526
28. I/O statements for VSAM relative and 67. Coded character sets for XML documents 537
indexed files . . . . . . . . . . . 194 68. Hexadecimal values of white-space
29. Statements to load records into a VSAM file 197 characters. . . . . . . . . . . . . 538
30. Statements to update records in a VSAM 69. Aliases for XML encoding declarations 540
file . . . . . . . . . . . . . . . 199 70. Hexadecimal values of special characters for
31. Methods for improving VSAM performance 209 various EBCDIC CCSIDs . . . . . . . 540
32. Methods for checking for sort errors with 71. XML events and special registers . . . . 547
NOFASTSRT . . . . . . . . . . . 233 72. XML events and special registers . . . . 553
33. Methods for controlling sort behavior 234 73. XML events and special registers from
34. Compiler data sets . . . . . . . . . 267 parsing XML document with an undeclared
35. Block size of fixed-length compiler data sets 269 namespace prefix . . . . . . . . . . 555
36. Block size of variable-length compiler data 74. Encoding of generated XML if the
sets . . . . . . . . . . . . . . . 269 ENCODING phrase is omitted . . . . . 567
37. Types of compiler output under z/OS 274 75. Structure of class definitions . . . . . . 582
38. Severity codes for compiler diagnostic 76. Structure of instance method definitions 588
messages . . . . . . . . . . . . . 282 77. Structure of COBOL clients . . . . . . 596
39. Input files to the cob2 command . . . . . 288 78. Conformance of arguments in a COBOL
40. Output files from the cob2 command 289 client . . . . . . . . . . . . . . 601
For information about COBOL language, and for references needed to write a
program for an IBM COBOL compiler, see the Enterprise COBOL Language
Reference.
For information about migrating programs to Enterprise COBOL, see the IBM
Enterprise COBOL Migration Guide.
IBM z/OS Language Environment provides the runtime environment and runtime
services that are required to run Enterprise COBOL programs. You can find
information about link-editing and running programs in the IBM z/OS Language
Environment Programming Guide and IBM z/OS Language Environment Programming
Reference.
Abbreviated terms
Certain terms are used in a shortened form in this information. Abbreviations for
the product names used most frequently are listed alphabetically in the following
table.
Other terms, if not commonly understood, are shown in italics the first time that
they appear, and are listed in the glossary.
required_item
required_item
optional_item
v If you can choose from two or more items, they appear vertically, in a stack. If
you must choose one of the items, one item of the stack appears on the main
path:
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
If one of the items is the default, it appears above the main path and the
remaining choices are shown below:
default_choice
required_item
optional_choice
optional_choice
v An arrow returning to the left, above the main line, indicates an item that can be
repeated:
Preface xvii
required_item repeatable_item
If the repeat arrow contains a comma, you must separate repeated items with a
comma:
required_item repeatable_item
v Keywords appear in uppercase (for example, FROM). They must be spelled exactly
as shown. Variables appear in lowercase italics (for example, column-name). They
represent user-supplied names or values.
v If punctuation marks, parentheses, arithmetic operators, or other such symbols
are shown, you must enter them as part of the syntax.
To more clearly separate some examples from the explanatory text, they are
presented in a monospace font.
COBOL keywords and compiler options that appear in text are generally shown in
SMALL UPPERCASE. Other terms such as program variable names are sometimes
shown in an italic font for clarity.
Summary of changes
This section lists the major changes that have been made to this document for
| Enterprise COBOL in Version 5. The changes that are described in this information
have an associated cross-reference for your convenience. The latest technical
changes are marked by a vertical bar (|) in the left margin in the PDF version.
Preface xix
v Except for a few exception cases, AMODE 24 execution of COBOL programs is
supported. Many programs compiled by Enterprise COBOL V5.1.1 will execute
in AMODE 31 or AMODE 24.
| With current service applied, COBOL V5.1.0 appears to be V5.1.1 and has the
| following new compiler options:
| v SQLIMS | NOSQLIMS (SQLIMS on page 356)
| v VLR(COMPAT | STANDARD) (VLR on page 366)
| v XMLPARSE(XMLSS | COMPAT) (XMLPARSE on page 368)
| v New suboptions of HEX and DEC are added to the MAP compiler option to control
| whether hexadecimal or decimal offsets are shown for MAP output in the
| compiler listing (MAP on page 333).
Version 5 Release 1
v Several changes are made to compiler options:
The following compiler options are new:
- AFP(VOLATILE | NOVOLATILE) (AFP on page 306)
- ARCH(n) (ARCH on page 307)
- DISPSIGN(SEP | COMPAT) (DISPSIGN on page 320)
- HGPR(PRESERVE | NOPRESERVE) (HGPR on page 330)
- MAXPCF(n) (MAXPCF on page 335)
- STGOPT | NOSTGOPT(STGOPT on page 358)
The following compiler options are modified:
- The MDECK option no longer has a dependency on the LIB option.
(MDECK on page 336)
- The MIG suboption of the NUMPROC compiler option is no longer supported.
(NUMPROC on page 339)
- The compiled-in range checks cannot be disabled at run time using the
runtime option NOCHECK. (SSRANGE on page 357)
- Execution of NORENT programs above the 16 MB line is not supported.
(RENT on page 348 and RMODE on page 349)
- The HOOK | NOHOOK and SEPARATE | NOSEPARATE suboptions of the TEST
compiler option are no longer supported, but continue to be tolerated to
ease migration. New suboptions SOURCE and NOSOURCE are added to the TEST
compiler option. (TEST on page 359)
- The NOTEST option is enhanced to include the suboptions DWARF and
NODWARF. (TEST on page 359)
- The EXIT compiler option is no longer mutually exclusive with the DUMP
compiler option, and the compiler exits rules are updated. (EXIT on page
324)
- The OPTIMIZE option is modified to allow several level of optimization.
(OPTIMIZE on page 343)
| The following compiler options have been removed, but continue to be
tolerated to ease migration. Informational or warning diagnostics will be
displayed if you specify any of these options.
- DATEPROC - Year 2000 support is no longer provided.
- LIB - Library processing is always done.
- SIZE(MAX) - This choice has become meaningless.
- YEARWINDOW - Year 2000 support is no longer provided.
Preface xxi
With NOLOAD debug segments in the program object, Enterprise COBOL V5
debug data always matches the executable file, and is always available
without giving lists of data sets to search, and does not increase the size of
the loaded program.
For other improvements about Debug Tool with Enterprise COBOL V5, see
Debug Tool changes with IBM Enterprise COBOL, Version 5 in the Enterprise
COBOL Migration Guide.
v Restrictions are added in the interoperability of Enterprise COBOL Version 5
Release 1 with earlier versions of COBOL. For details, see Interoperation with
older levels of Enterprise COBOL programs in the Enterprise COBOL Migration
Guide.
Be sure to include the name of the document, the publication number, the version
of Enterprise COBOL, and, if applicable, the specific location (for example, the
page number or section heading) of the text that you are commenting on.
When you send information to IBM, you grant IBM a nonexclusive right to use or
distribute the information in any way that IBM believes appropriate without
incurring any obligation to you.
Accessibility
Accessibility features help users who have a disability, such as restricted mobility
or limited vision, to use information technology products successfully. The
accessibility features in z/OS provide accessibility for Enterprise COBOL.
Interface information
Assistive technology products work with the user interfaces that are found in
z/OS. For specific guidance information, see the documentation for the assistive
technology product that you use to access z/OS interfaces.
Keyboard navigation
Users can access z/OS user interfaces by using TSO/E or ISPF. For information
about accessing TSO/E or ISPF interfaces, see the following publications:
v z/OS TSO/E Primer
v z/OS TSO/E User's Guide
v z/OS ISPF User's Guide Volume I
To enable your screen reader to accurately read syntax diagrams, source code
examples, and text that contains the period or comma PICTURE symbols, you must
set the screen reader to speak all punctuation.
Preface xxiii
xxiv Enterprise COBOL for z/OS, V5.2 Programming Guide
Part 1. Coding your program
To define a COBOL class or method, you need to define some divisions differently
than you do for a program.
RELATED TASKS
Identifying a program
Describing the computing environment on page 5
Describing the data on page 11
Processing the data on page 17
Defining a class on page 582
Defining a class instance method on page 587
Structuring OO applications on page 620
Identifying a program
Use the IDENTIFICATION DIVISION to name a program and optionally provide other
identifying information.
You can use the optional AUTHOR, INSTALLATION, DATE-WRITTEN, and DATE-COMPILED
paragraphs for descriptive information about a program. The data you enter in the
DATE-COMPILED paragraph is replaced with the latest compilation date.
IDENTIFICATION DIVISION.
Program-ID. Helloprog.
Author. A. Programmer.
Installation. Computing Laboratories.
Date-Written. 07/30/2009.
Date-Compiled. 03/30/2013.
Use the PROGRAM-ID paragraph to name your program. The program-name that you
assign is used in these ways:
v Other programs use that name to call your program.
v The name appears in the header on each page, except the first, of the program
listing that is generated when you compile the program.
| v If you use the NAME compiler option, the name is placed on the NAME binder
| (linkage-editor) control statement to identify the object module that the
compilation creates.
Tip: Do not use program-names that start with prefixes used by IBM products.
If you use program-names that start with any of the following prefixes, your
CALL statements might resolve to IBM library or compiler routines rather than to
your intended program:
AFB
AFH
CBC
CEE
Tip: If a program-name is case sensitive, avoid mismatches with the name that the
compiler is looking for. Verify that the appropriate setting of the PGMNAME compiler
option is in effect.
RELATED TASKS
Changing the header of a source listing on page 5
Identifying a program as recursive
Marking a program as callable by containing programs
Setting a program to an initial state on page 5
RELATED REFERENCES
Compiler limits (Enterprise COBOL Language Reference)
Conventions for program-names (Enterprise COBOL Language Reference)
You can code RECURSIVE only on the outermost program of a compilation unit.
Neither nested subprograms nor programs that contain nested subprograms can be
recursive. You must code RECURSIVE for programs that you compile with the THREAD
option.
RELATED TASKS
Sharing data in recursive or multithreaded programs on page 17
Making recursive calls on page 477
RELATED CONCEPTS
Nested programs on page 474
RELATED TASKS
Ending and reentering main programs or subprograms on page 464
Making static calls on page 466
Making dynamic calls on page 467
The header indicates the compilation platform. You can customize the header on
succeeding pages of the listing by using the compiler-directing TITLE statement.
RELATED REFERENCES
TITLE statement (Enterprise COBOL Language Reference)
Use the FILE-CONTROL and I-O-CONTROL paragraphs of the INPUT-OUTPUT SECTION to:
v Identify and describe the characteristics of the files in the program.
v Associate your files with the external QSAM, VSAM, or z/OS UNIX file system
data sets where they physically reside.
The terms file in COBOL terminology and data set in operating-system
terminology have essentially the same meaning and are used interchangeably in
this information.
For Customer Information Control System (CICS) and online Information
Management System (IMS) message processing programs (MPP), code only the
ENVIRONMENT DIVISION header and, optionally, the CONFIGURATION SECTION. Do
RELATED TASKS
Specifying the collating sequence
Defining symbolic characters on page 8
Defining a user-defined class on page 8
Defining files to the operating system on page 8
RELATED REFERENCES
Sections and paragraphs (Enterprise COBOL Language Reference)
1. The SELECT clause chooses a file in the COBOL program to be associated with an external data set.
2. The ASSIGN clause associates the program's name for the file with the external name for the actual data file. You
can define the external name with a DD statement or an environment variable.
3. The ORGANIZATION clause describes the file's organization. For QSAM files, the ORGANIZATION clause is optional.
4. The ACCESS MODE clause defines the manner in which the records are made available for processing: sequential,
random, or dynamic. For QSAM and line-sequential files, the ACCESS MODE clause is optional. These files always
have sequential organization.
5. For VSAM files, you might have additional statements in the FILE-CONTROL paragraph depending on the type of
VSAM file you use.
RELATED TASKS
Chapter 9, Processing QSAM files, on page 159
Chapter 10, Processing VSAM files, on page 185
Chapter 11, Processing line-sequential files, on page 213
Describing the computing environment on page 5
These clauses specify the collating sequence for the following operations on
alphanumeric items:
The sequence that you use can be based on one of these alphabets:
v EBCDIC: references the collating sequence associated with the EBCDIC
character set
v NATIVE: references the same collating sequence as EBCDIC
v STANDARD-1: references the collating sequence associated with the ASCII
character set defined by ANSI INCITS X3.4, Coded Character Sets - 7-bit American
National Standard Code for Information Interchange (7-bit ASCII)
v STANDARD-2: references the collating sequence associated with the character
set defined by ISO/IEC 646 -- Information technology -- ISO 7-bit coded character set
for information interchange, International Reference Version
v An alteration of the EBCDIC sequence that you define in the SPECIAL-NAMES
paragraph
The PROGRAM COLLATING SEQUENCE clause does not affect comparisons that involve
national or DBCS operands.
RELATED TASKS
Choosing alternate collating sequences on page 229
Comparing national (UTF-16) data on page 147
When you change the EBCDIC sequence in the SPECIAL-NAMES paragraph, the
overall collating sequence is affected, not just the collating sequence of the
characters that are included in the SPECIAL-NAMES paragraph.
IDENTIFICATION DIVISION.
. . .
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
Source-Computer. IBM-390.
Object-Computer. IBM-390.
Program Collating Sequence Special-Sequence.
Special-Names.
Alphabet Special-Sequence Is
"A" Also "a"
"B" Also "b"
"C" Also "c"
"D" Also "d"
"E" Also "e"
"F" Also "f"
"G" Also "g"
"H" Also "h"
"I" Also "i"
"J" Also "j"
"K" Also "k"
RELATED TASKS
Specifying the collating sequence on page 6
For example, to give a name to the backspace character (X'16' in the EBCDIC
alphabet), code:
SYMBOLIC CHARACTERS BACKSPACE IS 23
For example, name the set of digits by coding the following clause:
CLASS DIGIT IS "0" THROUGH "9"
You can reference the class-name only in a class condition. (This user-defined class
is not the same as an object-oriented class.)
Depending on the operating system, this system data definition can take any of the
following forms:
v DD statement for MVS JCL.
v ALLOCATE command under TSO.
v Environment variable for z/OS or z/OS UNIX. The contents can define either an
MVS data set or a file in the z/OS UNIX file system.
RELATED TASKS
Optimizing buffer and device space on page 10
RELATED REFERENCES
FILE SECTION entries on page 12
FILE SECTION (Enterprise COBOL Language Reference)
Changing a file-name within a COBOL program would require changing the input
statements and output statements and recompiling the program. Alternatively, you
can change the DSNAME value in the DD statement or the DSN or PATH value in the
export command to use a different file at run time.
Environment variable values that are in effect at the time of the OPEN statement are
used for associating COBOL file-names to the system file-names (including any
path specifications).
The name that you use in the assignment-name of the ASSIGN clause must be the
same as the ddname in the DD statement or the environment variable in the export
command.
The file-name that you use in the SELECT clause (such as SELECT MASTER) must be the
same as in the FD file-name entry.
This example shows that you use the same COBOL program to access different
files by coding a DD statement or an export command before the programs runs.
Assume the three possible input files are MASTER1, MASTER2, and MASTER3. Before
running the program, code one of the following DD statements in the job step that
calls for program execution, or issue one of the following export commands from
the same shell from which you run the program:
//MASTERA DD DSNAME=MY.MASTER1,. . .
export MASTERA=DSN(MY.MASTER1),. . .
//MASTERA DD DSNAME=MY.MASTER2,. . .
export MASTERA=DSN(MY.MASTER2),. . .
//MASTERA DD DSNAME=MY.MASTER3,. . .
export MASTERA=DSN(MY.MASTER3),. . .
Any reference in the program to MASTER will therefore be a reference to the file that
is currently assigned to the ddname or environment-variable name MASTERA.
Notice that in this example, you cannot use the PATH(path) form of the export
command to reference a line-sequential file in the z/OS UNIX file system, because
you cannot specify an organization field (S- or AS-) with a line-sequential file.
With APPLY WRITE-ONLY specified, a buffer is truncated only when the next record
does not fit in the unused portion of the buffer. Without APPLY WRITE-ONLY
specified, a buffer is truncated when it does not have enough space for a
maximum-size record.
The APPLY WRITE-ONLY clause has meaning only for sequential files that have
variable-length records and are blocked.
The AWO compiler option applies an implicit APPLY WRITE-ONLY clause to all eligible
files. The NOAWO compiler option has no effect on files that have the APPLY
WRITE-ONLY clause specified. The APPLY WRITE-ONLY clause takes precedence over
the NOAWO compiler option.
The APPLY-WRITE ONLY clause can cause input files to use a record area rather than
process the data in the buffer. This use might affect the processing of both input
files and output files.
RELATED REFERENCES
AWO on page 310
You can use these sections for defining the following types of data:
v Data used in input-output operations: FILE SECTION
v Data developed for internal processing:
To have storage be statically allocated and exist for the life of the run unit:
WORKING-STORAGE SECTION
To have storage be allocated each time a program is entered, and deallocated
on return from the program: LOCAL-STORAGE SECTION
v Data from another program: LINKAGE SECTION
The Enterprise COBOL compiler limits the maximum size of DATA DIVISION
elements. For details, see the related reference about compiler limits below.
RELATED CONCEPTS
Comparison of WORKING-STORAGE and LOCAL-STORAGE on page 14
RELATED TASKS
Using data in input and output operations
Using data from another program on page 16
RELATED REFERENCES
Compiler limits (Enterprise COBOL Language Reference)
Programs in the same run unit can share, or have access to, common files. The
method for doing this depends on whether the programs are part of a nested
(contained) structure or are separately compiled (including programs compiled as
part of a batch sequence).
You can use the EXTERNAL clause for separately compiled programs. A file that is
defined as EXTERNAL can be referenced by any program in the run unit that
describes the file.
You can use the GLOBAL clause for programs in a nested, or contained, structure. If
a program contains another program (directly or indirectly), both programs can
access a common file by referencing a GLOBAL file-name.
RELATED CONCEPTS
Nested programs on page 474
RELATED TASKS
Sharing files between programs (external files) on page 491
RELATED REFERENCES
FILE SECTION entries
RELATED REFERENCES
FILE SECTION (Enterprise COBOL Language Reference)
Any data items that have VALUE clauses are initialized to the appropriate value at
that time. For the duration of the run unit, WORKING-STORAGE items persist in their
last-used state. Exceptions are:
v A program with INITIAL specified in the PROGRAM-ID paragraph
In this case, WORKING-STORAGE data items are reinitialized each time that the
program is entered.
v A subprogram that is dynamically called and then canceled
In this case, WORKING-STORAGE data items are reinitialized on the first reentry into
the program following the CANCEL.
See the related tasks for information about WORKING-STORAGE in COBOL class
definitions.
RELATED TASKS
Ending and reentering main programs or subprograms on page 464
RELATED REFERENCES
WORKING-STORAGE SECTION (Enterprise COBOL Language Reference)
LOCAL-STORAGE SECTION (Enterprise COBOL Language Reference)
if numb = 0
move 1 to fact
else
subtract 1 from numb
call factorial
multiply num by fact
end-if.
The following tables show the changing values of the data items in LOCAL-STORAGE
and WORKING-STORAGE in the successive recursive calls of the program, and in the
ensuing gobacks. During the gobacks, fact progressively accumulates the value of
5! (five factorial).
RELATED CONCEPTS
Comparison of WORKING-STORAGE and LOCAL-STORAGE on page 14
RELATED TASKS
Sharing data in separately compiled programs
Sharing data in nested programs
Sharing data in recursive or multithreaded programs on page 17
Passing data on page 481
RELATED TASKS
Passing data on page 481
Coding the LINKAGE SECTION on page 485
A nested program can also access data items in a sibling program (one at the same
nesting level in the same containing program) that is declared with the COMMON
attribute.
RELATED CONCEPTS
Nested programs on page 474
If your program has the RECURSIVE attribute or is compiled with the THREAD
compiler option, the address of the record is valid for a particular instance of the
program invocation. The address of the record in another execution instance of the
same program must be reestablished for that execution instance. Unpredictable
results will occur if you refer to a data item for which the address has not been
established.
RELATED CONCEPTS
Multithreading on page 508
RELATED TASKS
Making recursive calls on page 477
Processing files with multithreading on page 510
RELATED REFERENCES
THREAD on page 362
SET statement (Enterprise COBOL Language Reference)
The PROCEDURE DIVISION begins with the division header and a procedure-name
header. The division header for a program can simply be:
PROCEDURE DIVISION.
You can code the division header to receive parameters by using the USING phrase,
or to return a value by using the RETURNING phrase.
To receive a parameter that was passed by value, code the division header for a
program as follows:
PROCEDURE DIVISION USING BY VALUE dataname
RELATED CONCEPTS
How logic is divided in the PROCEDURE DIVISION
RELATED TASKS
Coding the LINKAGE SECTION on page 485
Coding the PROCEDURE DIVISION for passing arguments on page 486
Using PROCEDURE DIVISION RETURNING . . . on page 490
Eliminating repetitive coding on page 665
RELATED REFERENCES
The procedure division header (Enterprise COBOL Language Reference)
The USING phrase (Enterprise COBOL Language Reference)
CALL statement (Enterprise COBOL Language Reference)
RELATED CONCEPTS
Compiler-directing statements on page 20
Scope terminators on page 20
Imperative statements on page 19
Conditional statements on page 19
Declaratives on page 21
Imperative statements
An imperative statement (such as ADD, MOVE, INVOKE, or CLOSE) indicates an
unconditional action to be taken.
You can end an imperative statement with an implicit or explicit scope terminator.
RELATED CONCEPTS
Conditional statements
Scope terminators on page 20
Conditional statements
A conditional statement is either a simple conditional statement (IF, EVALUATE,
SEARCH) or a conditional statement made up of an imperative statement that
includes a conditional phrase or option.
You can end a conditional statement with an implicit or explicit scope terminator.
If you end a conditional statement explicitly, it becomes a delimited scope
statement (which is an imperative statement).
For additional program control, you can use the NOT phrase with conditional
statements. For example, you can provide instructions to be performed when a
particular exception does not occur, such as NOT ON SIZE ERROR. The NOT phrase
cannot be used with the ON OVERFLOW phrase of the CALL statement, but it can be
used with the ON EXCEPTION phrase.
The following statements are examples of conditional statements if they are coded
without scope terminators:
v Arithmetic statement with ON SIZE ERROR
v Data-manipulation statements with ON OVERFLOW
v CALL statements with ON OVERFLOW
v I/O statements with INVALID KEY, AT END, or AT END-OF-PAGE
v RETURN with AT END
RELATED CONCEPTS
Imperative statements on page 19
Scope terminators
RELATED TASKS
Selecting program actions on page 93
RELATED REFERENCES
Conditional statements (Enterprise COBOL Language Reference)
Compiler-directing statements
A compiler-directing statement causes the compiler to take specific action about the
program structure, COPY processing, listing control, or control flow.
RELATED REFERENCES
Chapter 18, Compiler-directing statements, on page 373
Compiler-directing statements (Enterprise COBOL Language Reference)
Scope terminators
A scope terminator ends a verb or statement. Scope terminators can be explicit or
implicit.
Explicit scope terminators end a verb without ending a sentence. They consist of
END followed by a hyphen and the name of the verb being terminated, such as
END-IF. An implicit scope terminator is a period (.) that ends the scope of all
previous statements not yet ended.
Each of the two periods in the following program fragment ends an IF statement,
making the code equivalent to the code after it that instead uses explicit scope
terminators:
IF ITEM = "A"
DISPLAY "THE VALUE OF ITEM IS " ITEM
ADD 1 TO TOTAL
MOVE "C" TO ITEM
DISPLAY "THE VALUE OF ITEM IS NOW " ITEM.
IF ITEM = "B"
ADD 2 TO TOTAL.
IF ITEM = "A"
DISPLAY "THE VALUE OF ITEM IS " ITEM
ADD 1 TO TOTAL
MOVE "C" TO ITEM
DISPLAY "THE VALUE OF ITEM IS NOW " ITEM
If you use implicit terminators, the end of statements can be unclear. As a result,
you might end statements unintentionally, changing your program's logic. Explicit
scope terminators make a program easier to understand and prevent unintentional
ending of statements. For example, in the program fragment below, changing the
location of the first period in the first implicit scope example changes the meaning
of the code:
IF ITEM = "A"
DISPLAY "VALUE OF ITEM IS " ITEM
ADD 1 TO TOTAL.
MOVE "C" TO ITEM
DISPLAY " VALUE OF ITEM IS NOW " ITEM
IF ITEM = "B"
ADD 2 TO TOTAL.
The MOVE statement and the DISPLAY statement after it are performed regardless of
the value of ITEM, despite what the indentation indicates, because the first period
terminates the IF statement.
For improved program clarity and to avoid unintentional ending of statements, use
explicit scope terminators, especially within paragraphs. Use implicit scope
terminators only at the end of a paragraph or the end of a program.
To ensure that the explicit scope terminator is paired with the intended statement,
the preceding example can be recoded in this way:
READ FILE1
AT END
MOVE A TO B
READ FILE2
END-READ
END-READ
RELATED CONCEPTS
Conditional statements on page 19
Imperative statements on page 19
Declaratives
Declaratives provide one or more special-purpose sections that are executed when
an exception condition occurs.
Start each declarative section with a USE statement that identifies the function of
the section. In the procedures, specify the actions to be taken when the condition
occurs.
RELATED REFERENCES
Declaratives (Enterprise COBOL Language Reference)
RELATED CONCEPTS
Storage and its addressability on page 39
RELATED TASKS
Using variables, structures, literals, and constants
Assigning values to data items on page 27
Displaying values on a screen or in a file (DISPLAY) on page 35
Using intrinsic functions (built-in functions) on page 38
Using tables (arrays) and pointers on page 39
Chapter 7, Processing data in an international environment, on page 125
RELATED TASKS
Using variables
Using data items and group items on page 24
Using literals on page 25
Using constants on page 26
Using figurative constants on page 26
RELATED REFERENCES
Classes and categories of data (Enterprise COBOL Language Reference)
Using variables
A variable is a data item whose value can change during a program. The value is
restricted, however, to the data type that you define when you specify a name and
a length for the data item.
RELATED CONCEPTS
Unicode and the encoding of language characters on page 129
RELATED TASKS
Using national data (Unicode) in COBOL on page 130
RELATED REFERENCES
NSYMBOL on page 338
Storage of character data on page 137
PICTURE clause (Enterprise COBOL Language Reference)
A record can be either an elementary item or a group item. A group item can be
either an alphanumeric group item or a national group item.
In the example above, the group items could instead specify the USAGE NATIONAL
clause at the group level. A USAGE clause at the group level applies to each
elementary data item in a group (and thus serves as a convenient shorthand
notation). However, a group that specifies the USAGE NATIONAL clause is not a
national group despite the representation of the elementary items within the group.
Groups that specify the USAGE clause are alphanumeric groups and behave in many
operations, such as moves and compares, like elementary data items of USAGE
DISPLAY (except that no editing or conversion of data occurs).
RELATED CONCEPTS
Unicode and the encoding of language characters on page 129
National groups on page 133
RELATED TASKS
Using national data (Unicode) in COBOL on page 130
Using national groups on page 134
RELATED REFERENCES
FILE SECTION entries on page 12
Storage of character data on page 137
Classes and categories of group items (Enterprise COBOL Language Reference)
PICTURE clause (Enterprise COBOL Language Reference)
MOVE statement (Enterprise COBOL Language Reference)
USAGE clause (Enterprise COBOL Language Reference)
Using literals
A literal is a character string whose value is given by the characters themselves. If
you know the value you want a data item to have, you can use a literal
representation of the data value in the PROCEDURE DIVISION.
| You do not need to define a data item for the value nor refer to it by using a
data-name. For example, you can prepare an error message for an output file by
moving an alphanumeric literal:
Move "Name is not valid" To Customer-Name
You can use the opening delimiter N" or N to designate a national literal if the
NSYMBOL(NATIONAL) compiler option is in effect, or to designate a DBCS literal if the
NSYMBOL(DBCS) compiler option is in effect.
You can use the opening delimiter NX" or NX to designate national literals in
hexadecimal notation (regardless of the setting of the NSYMBOL compiler option).
Each group of four hexadecimal digits designates a single national character.
RELATED CONCEPTS
Unicode and the encoding of language characters on page 129
RELATED TASKS
Using national literals on page 131
Using DBCS literals on page 150
RELATED REFERENCES
NSYMBOL on page 338
Literals (Enterprise COBOL Language Reference)
Using constants
A constant is a data item that has only one value. COBOL does not define a
construct for constants. However, you can define a data item with an initial value
by coding a VALUE clause in the data description (instead of coding an INITIALIZE
statement).
Data Division.
01 Report-Header pic x(50) value "Company Sales Report".
. . .
01 Interest pic 9v9999 value 1.0265.
The example above initializes an alphanumeric and a numeric data item. You can
likewise use a VALUE clause in defining a national or DBCS constant.
RELATED TASKS
Using national data (Unicode) in COBOL on page 130
Coding for use of DBCS support on page 150
For example:
Move Spaces To Report-Header
RELATED TASKS
Using national-character figurative constants on page 132
Coding for use of DBCS support on page 150
RELATED TASKS
Initializing a structure (INITIALIZE) on page 30
Assigning values to elementary data items (MOVE) on page 32
Assigning values to group data items (MOVE) on page 33
Assigning input from a screen or file (ACCEPT) on page 34
Joining data items (STRING) on page 105
Splitting data items (UNSTRING) on page 107
Assigning arithmetic results (MOVE or COMPUTE) on page 34
Tallying and replacing data items (INSPECT) on page 115
Chapter 7, Processing data in an international environment, on page 125
RELATED TASKS
Initializing a structure (INITIALIZE)
Initializing a table (INITIALIZE) on page 73
Defining numeric data on page 43
RELATED REFERENCES
NSYMBOL on page 338
The following example shows how you can reset fields to spaces and zeros in
transaction records that a program produces. The values of the fields are not
identical in each record that is produced. (The transaction record is defined as an
alphanumeric group item, TRANSACTION-OUT.)
01 TRANSACTION-OUT.
05 TRANSACTION-CODE PIC X.
05 PART-NUMBER PIC 9(6).
05 TRANSACTION-QUANTITY PIC 9(5).
05 PRICE-FIELDS.
10 UNIT-PRICE PIC 9(5)V9(2).
You can likewise reset the values of all the subordinate data items in a national
group item by applying the INITIALIZE statement to that group item. The
following structure is similar to the preceding structure, but instead uses Unicode
UTF-16 data:
01 TRANSACTION-OUT GROUP-USAGE NATIONAL.
05 TRANSACTION-CODE PIC N.
05 PART-NUMBER PIC 9(6).
05 TRANSACTION-QUANTITY PIC 9(5).
05 PRICE-FIELDS.
10 UNIT-PRICE PIC 9(5)V9(2).
10 DISCOUNT PIC V9(2).
10 SALES-PRICE PIC 9(5)V9(2).
. . .
INITIALIZE TRANSACTION-OUT
Regardless of the previous contents of the transaction record, after the INITIALIZE
statement above is executed:
v TRANSACTION-CODE contains NX"0020" (a national space).
v Each of the remaining 27 national character positions of TRANSACTION-OUT
contains NX"0030" (a national-decimal zero).
RELATED CONCEPTS
National groups on page 133
RELATED TASKS
Initializing a table (INITIALIZE) on page 73
Using national groups on page 134
RELATED REFERENCES
INITIALIZE statement (Enterprise COBOL Language Reference)
For data items that contain numbers, moves can be more complicated than with
character data items because there are several ways in which numbers can be
represented. In general, the algebraic values of numbers are moved if possible, as
opposed to the digit-by-digit moves that are performed with character data. For
example, after the MOVE statement below, Item-x contains the value 3.0, represented
as 0030:
01 Item-x Pic 999v9.
. . .
Move 3.06 to Item-x
For complete details about elementary moves, see the related reference below
about the MOVE statement.
The following example shows an alphanumeric data item in the Greek language
that is moved to a national data item:
CBL CODEPAGE(00875)
. . .
01 Data-in-Unicode Pic N(100) usage national.
01 Data-in-Greek Pic X(100).
. . .
Read Greek-file into Data-in-Greek
Move Data-in-Greek to Data-in-Unicode
RELATED CONCEPTS
Unicode and the encoding of language characters on page 129
RELATED TASKS
Assigning values to group data items (MOVE) on page 33
Converting to or from national (Unicode) representation on page 137
RELATED REFERENCES
CODEPAGE on page 313
Classes and categories of data (Enterprise COBOL Language Reference)
MOVE statement (Enterprise COBOL Language Reference)
You can move a national group item (a data item that is described with the
GROUP-USAGE NATIONAL clause) to another national group item. The compiler
processes the move as though each national group item were an elementary item
of category national, that is, as if each item were described as PIC N(m), where m
is the length of that item in national character positions.
You can code the CORRESPONDING phrase in a MOVE statement to move subordinate
elementary items from one group item to the identically named corresponding
subordinate elementary items in another group item:
01 Group-X.
02 T-Code Pic X Value "A".
02 Month Pic 99 Value 04.
02 State Pic XX Value "CA".
02 Filler PIC X.
01 Group-N Group-Usage National.
02 State Pic NN.
02 Month Pic 99.
02 Filler Pic N.
02 Total Pic 999.
. . .
MOVE CORR Group-X TO Group-N
In the example above, State and Month within Group-N receive the values in
national representation of State and Month, respectively, from Group-X. The other
data items in Group-N are unchanged. (Filler items in a receiving group item are
unchanged by a MOVE CORRESPONDING statement.)
In a MOVE CORRESPONDING statement, sending and receiving group items are treated
as group items, not as elementary data items; group semantics apply. That is, the
elementary data items within each group are recognized, and the results are the
same as if each pair of corresponding data items were referenced in a separate
MOVE statement. Data conversions are performed according to the rules for the MOVE
statement as specified in the related reference below. For details about which types
of elementary data items correspond, see the related reference about the
CORRESPONDING phrase.
RELATED CONCEPTS
Unicode and the encoding of language characters on page 129
National groups on page 133
RELATED TASKS
Assigning values to elementary data items (MOVE) on page 32
Using national groups on page 134
Converting to or from national (Unicode) representation on page 137
In the example above, the two statements in most cases have the same effect. The
MOVE statement however carries out the assignment with truncation. You can use
the DIAGTRUNC compiler option to request that the compiler issue a warning for
MOVE statements that might truncate numeric receivers.
When significant left-order digits would be lost in execution, the COMPUTE statement
can detect the condition and allow you to handle it. If you use the ON SIZE ERROR
phrase of the COMPUTE statement, the compiler generates code to detect a
size-overflow condition. If the condition occurs, the code in the ON SIZE ERROR
phrase is performed, and the content of z remains unchanged. If you do not
specify the ON SIZE ERROR phrase, the assignment is carried out with truncation.
There is no ON SIZE ERROR support for the MOVE statement.
You can also use the COMPUTE statement to assign the result of an arithmetic
expression or intrinsic function to a data item. For example:
Compute z = y + (x ** 3)
Compute x = Function Max(x y z)
You can assign the results of date, time, mathematical, and other calculations to
data items by using Language Environment callable services. Language
Environment services are available through a standard COBOL CALL statement, and
the values they return are passed in the parameters of the CALL statement. For
example, you can call the Language Environment service CEESIABS to find the
absolute value of a data item by coding the following statement:
Call CEESIABS Using Arg, Feedback-code, Result.
As a result of this call, data item Result is assigned the absolute value of the value
in data item Arg; data item Feedback-code contains the return code that indicates
whether the service completed successfully. You have to define all the data items in
the DATA DIVISION using the correct descriptions according to the requirements of
the particular callable service. For the example above, the data items could be
defined as follows:
77 Arg Pic s9(9) Binary.
77 Feedback-code Pic x(12) Display.
77 Result Pic s9(9) Binary.
RELATED REFERENCES
DIAGTRUNC on page 319
Intrinsic functions (Enterprise COBOL Language Reference)
Language Environment Programming Reference (Callable services)
To read from a file instead of the screen, make the following change:
v Change Console to device, where device is any valid system device (for example,
SYSIN). For example:
SYSIN is Names-Input
device can be a ddname that references a z/OS UNIX file system path. If this
ddname is not defined and your program is running in the z/OS UNIX
environment, stdin is the input source. If this ddname is not defined and your
program is not running in the z/OS UNIX environment, the ACCEPT statement
fails.
When you use the ACCEPT statement, you can assign a value to an alphanumeric or
national group item, or to an elementary data item that has USAGE DISPLAY, USAGE
DISPLAY-1, or USAGE NATIONAL.
When you assign a value to a USAGE NATIONAL data item, input data from the
console is converted from the EBCDIC code page specified in the CODEPAGE
compiler option to national (Unicode UTF-16) representation. This is the only case
where conversion of national data is done when you use the ACCEPT statement.
Conversion is done in this case because the input is known to be coming from a
screen.
To have conversion done when the input data is from any other device, use the
NATIONAL-OF intrinsic function.
RELATED CONCEPTS
Unicode and the encoding of language characters on page 129
RELATED TASKS
Converting alphanumeric or DBCS to national (NATIONAL-OF) on page 139
RELATED REFERENCES
CODEPAGE on page 313
ACCEPT statement (Enterprise COBOL Language Reference)
SPECIAL-NAMES paragraph (Enterprise COBOL Language Reference)
You can specify a file in the z/OS UNIX file system by using the SYSPUNCH DD
statement. For example, the following definition causes DISPLAY output to be
written to the file /u/userid/cobol/demo.lst:
//SYSPUNCH DD PATH=/u/userid/cobol/demo.lst,
// PATHOPTS=(OWRONLY,OCREAT,OTRUNC),PATHMODE=SIRWXU,
// FILEDATA=TEXT
The following statement writes to the job log or console and to the TSO screen if
you are running under TSO:
Display "Hello" upon console.
When you display the value of a USAGE NATIONAL data item to the console, the data
item is converted from Unicode (UTF-16) representation to EBCDIC based on the
value of the CODEPAGE option. This is the only case in which conversion of national
data is done when you use the DISPLAY statement. Conversion is done in this case
because the output is known to be directed to a screen.
To have a national data item be converted when you direct output to a different
device, use the DISPLAY-OF intrinsic function, as in the following example:
01 Data-in-Unicode pic N(10) usage national.
. . .
Display function Display-of(Data-in-Unicode, 00037)
RELATED CONCEPTS
Unicode and the encoding of language characters on page 129
RELATED TASKS
Displaying data on the system logical output device
Using WITH NO ADVANCING on page 37
Converting national to alphanumeric (DISPLAY-OF) on page 139
Coding COBOL programs to run under CICS on page 419
RELATED REFERENCES
CODEPAGE on page 313
DISPLAY statement (Enterprise COBOL Language Reference)
The output is directed to the ddname that you specify in the OUTDD compiler
option. You can specify a file in the z/OS UNIX file system with this ddname.
If the OUTDD ddname is not allocated and you are not running in the z/OS UNIX
environment, a default DD of SYSOUT=* is allocated. If the OUTDD ddname is not
allocated and you are running in the z/OS UNIX environment, the _IGZ_SYSOUT
environment variable is used as follows:
Undefined or set to stdout
Output is routed to stdout (file descriptor 1).
When DISPLAY output is routed to stdout or stderr, the output is not subdivided
into records. The output is written as a single stream of characters without line
breaks.
If OUTDD and the Language Environment runtime option MSGFILE specify the same
ddname, both DISPLAY output and Language Environment runtime diagnostics are
routed to the Language Environment message file.
RELATED TASKS
Setting and accessing environment variables on page 454
RELATED REFERENCES
OUTDD on page 344
DISPLAY statement (Enterprise COBOL Language Reference)
If you specify the WITH NO ADVANCING phrase and the output is going to stdout or
stderr, a newline character is not appended to the end of the stream. A subsequent
DISPLAY statement might add additional characters to the end of the stream.
If you do not specify WITH NO ADVANCING, and the output is going to a ddname, the
printer control character ' ' (space) is placed into the first output position from the
next DISPLAY statement, indicating single-spaced output.
DISPLAY "ABC"
DISPLAY "CDEF" WITH NO ADVANCING
DISPLAY "GHIJK" WITH NO ADVANCING
DISPLAY "LMNOPQ"
DISPLAY "RSTUVWX"
If you code the statements above, the result sent to the output device is:
ABC
CDEF
+GHIJK
+LMNOPQ
RSTUVMX
The output that is printed depends on how the output device interprets printer
control characters.
If you do not specify the WITH NO ADVANCING phrase and the output is going to
stdout or stderr, a newline character is appended to the end of the stream.
RELATED REFERENCES
DISPLAY statement (Enterprise COBOL Language Reference)
A function-identifier represents both the invocation of the function and the data
value returned by the function. Because it actually represents a data item, you can
use a function-identifier in most places in the PROCEDURE DIVISION where a data
item that has the attributes of the returned value can be used.
The COBOL word function is a reserved word, but the function-names are not
reserved. You can use them in other contexts, such as for the name of a data item.
For example, you could use Sqrt to invoke an intrinsic function and to name a
data item in your program:
Working-Storage Section.
01 x Pic 99 value 2.
01 y Pic 99 value 4.
01 z Pic 99 value 0.
01 Sqrt Pic 99 value 0.
. . .
Compute Sqrt = 16 ** .5
Compute z = x + Function Sqrt(y)
. . .
The functions MAX and MIN can return either type of value depending on the type of
arguments you supply.
Functions can reference other functions as arguments provided that the results of
the nested functions meet the requirements for the arguments of the outer function.
For example, Function Sqrt(5) returns a numeric value. Thus, the three arguments
to the MAX function below are all numeric, which is an allowable argument type for
this function:
Compute x = Function Max((Function Sqrt(5)) 2.5 3.5)
Pointers are data items that contain virtual storage addresses. You define them
either explicitly with the USAGE IS POINTER clause in the DATA DIVISION or
implicitly as ADDRESS OF special registers.
You can perform the following operations with pointer data items:
v Pass them between programs by using the CALL . . . BY REFERENCE statement.
v Move them to other pointers by using the SET statement.
v Compare them to other pointers for equality by using a relation condition.
v Initialize them to contain an invalid address by using VALUE IS NULL.
RELATED TASKS
Defining a table (OCCURS) on page 67
Using procedure and function pointers on page 477
You can address storage below (but not above) the 16 MB line with 24-bit
addressing. You can address storage either above or below the 16 MB line with
31-bit addressing. Unrestricted storage is addressable by 31-bit addressing and
therefore encompasses all the storage available to your program, both above and
below the 16 MB line.
Enterprise COBOL does not directly exploit the 64-bit virtual addressing capability
of z/OS; however, COBOL applications running in 31-bit or 24-bit addressing
mode are fully supported on 64-bit z/OS systems.
Addressing mode (AMODE) is the attribute that tells which hardware addressing mode
is supported by your program: 24-bit addressing, 31-bit addressing, or either 24-bit
or 31-bit addressing. These attributes are AMODE 24, AMODE 31, and AMODE ANY,
| respectively. The program object and the executing program each have an AMODE
attribute. Enterprise COBOL V5.1.1 object programs are either AMODE MIN for
cases where AMODE 24 is possible, or AMODE 31 in all other cases. See
Restrictions for AMODE on page 40.
Enterprise COBOL uses Language Environment services to control the storage used
at run time. Thus COBOL compiler options and Language Environment runtime
options influence the AMODE and RMODE attributes of your program and data, alone
and in combination:
DATA Compiler option that influences the location of storage for WORKING-STORAGE
data, I-O buffers, and parameter lists for programs compiled with RENT.
RMODE Compiler option that influences the residency mode.
RENT Compiler option to generate a reentrant program.
HEAP Runtime option that controls storage for the runtime heap. For example,
COBOL WORKING-STORAGE is allocated from heap storage when the COBOL
program is compiled with the RENT option and is in one of the following
cases:
v Compiled with Enterprise COBOL V4.2 or earlier releases
v Compiled with the DATA(24) compiler option
v Running in CICS
v A COBOL V5.1.1 in a program object that contains only COBOL
programs (V5.1.1, V4.2 or earlier) and assembly programs. There are no
Language Environment interlanguage calls within the program object
and no COBOL V5.1.0 programs.
v A COBOL V5 program in a program object where the main entry point
is COBOL V5. In this case, the program object can contain Language
Environment interlanguage calls, with COBOL statically linking with C,
C++ or PL/I. All COBOL V5 programs within such program objects
(even if they are not the main entry point) have their WORKING-STORAGE
allocated from heap storage.
STACK Runtime option that controls storage for the runtime stack. For example,
COBOL LOCAL-STORAGE is allocated from stack storage.
ALL31 Runtime option that specifies whether an application can run entirely in
AMODE 31.
Note: An AMODE 31 driver program resident in the z/OS UNIX file system can
contain a dynamic call to an AMODE 24 program module resident in an MVS PDS
or PDSE.
v Programs used as COBOL compiler exit modules that are specified on the EXIT
compiler option
v Language Environment enclaves that use XPLINK, including either the enclaves
that contain non-COBOL programs compiled with the XPLINK compiler option, or
run with the XPLINK runtime option
Note: To run COBOL programs with addressing mode 24, you must compile all
COBOL programs with Enterprise COBOL V5.1.1, or later versions; or Enterprise
COBOL V4.2 or earlier versions. If any component of a program object is compiled
with Enterprise COBOL V5.1.0, the program object must run in addressing mode
31. COBOL programs that run with addressing mode 24 must be linked with the
binder option RMODE(24).
Link-edit considerations: When the object code that COBOL generates has an
attribute of RMODE 24, you must link-edit it with RMODE 24. When the object code
that COBOL generates has an attribute of RMODE ANY, you can link-edit it with
RMODE ANY or RMODE 24.
In all other cases, the storage for EXTERNAL data is obtained from below the 16 MB
line. If you specify the ALL31(ON) runtime option, all the programs in the run unit
must be capable of running in 31-bit addressing mode.
RELATED CONCEPTS
AMODE switching on page 469
Language Environment Programming Guide (AMODE considerations for heap
storage)
RELATED TASKS
Chapter 24, Using subprograms, on page 463
Chapter 25, Sharing data, on page 481
RELATED REFERENCES
Allocation of buffers for QSAM files on page 181
Allocation of record areas for VSAM files on page 209
DATA on page 318
RENT on page 348
RMODE on page 349
Performance-related compiler options on page 659
Language Environment Programming Reference (HEAP, STACK, ALL31)
MVS Program Management: User's Guide and Reference
To define, display, and store numeric data so that you can perform arithmetic
operations efficiently:
v Use the PICTURE clause and the characters 9, +, -, P, S, and V to define numeric
data.
v Use the PICTURE clause and editing characters (such as Z, comma, and period)
along with MOVE and DISPLAY statements to display numeric data.
v Use the USAGE clause with various formats to control how numeric data is stored.
v Use the numeric class test to validate that data values are appropriate.
v Use ADD, SUBTRACT, MULTIPLY, DIVIDE, and COMPUTE statements to perform
arithmetic.
v Use the CURRENCY SIGN clause and appropriate PICTURE characters to designate
the currency you want.
RELATED TASKS
Defining numeric data
Displaying numeric data on page 45
Controlling how numeric data is stored on page 46
Checking for incompatible data (numeric class test) on page 54
Performing arithmetic on page 55
Using currency signs on page 65
For example, Count-y below is a numeric data item, an external decimal item that
has USAGE DISPLAY (a zoned decimal item):
05 Count-y Pic 9(4) Value 25.
05 Customer-name Pic X(20) Value "Johnson".
You can similarly define numeric data items to hold national characters (UTF-16).
For example, Count-n below is an external decimal data item that has USAGE
NATIONAL (a national decimal item):
05 Count-n Pic 9(4) Value 25 Usage National.
You can code up to 18 digits in the PICTURE clause when you compile using the
default compiler option ARITH(COMPAT) (referred to as compatibility mode). When
you compile using ARITH(EXTEND) (referred to as extended mode), you can code up
to 31 digits in the PICTURE clause.
The field can therefore hold a positive or a negative value. The v indicates the
position of an implied decimal point, but does not contribute to the size of the
item because it does not require a storage position. An s usually does not
contribute to the size of a numeric item, because by default s does not require a
storage position.
However, if you plan to port your program or data to a different machine, you
might want to code the sign for a zoned decimal data item as a separate position
in storage. In the following case, the sign takes 1 byte:
05 Price Pic s99V99 Sign Is Leading, Separate.
This coding ensures that the convention your machine uses for storing a
nonseparate sign will not cause unexpected results on a machine that uses a
different convention.
Separate signs are also preferable for zoned decimal data items that will be printed
or displayed.
Separate signs are required for national decimal data items that are signed. The
sign takes 2 bytes of storage, as in the following example:
05 Price Pic s99V99 Usage National Sign Is Leading, Separate.
You cannot use the PICTURE clause with internal floating-point data (COMP-1 or
COMP-2). However, you can use the VALUE clause to provide an initial value for an
internal floating-point literal:
05 Compute-result Usage Comp-2 Value 06.23E-24.
For information about external floating-point data, see the examples referenced
below and the related concept about formats for numeric data.
RELATED CONCEPTS
Formats for numeric data on page 47
Appendix A, Intermediate results and arithmetic precision, on page 675
RELATED TASKS
Displaying numeric data on page 45
Controlling how numeric data is stored on page 46
Performing arithmetic on page 55
Defining national numeric data items on page 133
RELATED REFERENCES
Sign representation of zoned and packed-decimal data on page 53
Storage of character data on page 137
ARITH on page 309
NUMPROC on page 339
SIGN clause (Enterprise COBOL Language Reference)
For example, in the code below, Edited-price is a numeric-edited item that has
USAGE DISPLAY. (You can specify the clause USAGE IS DISPLAY for numeric-edited
items; however, it is implied. It means that the items are stored in character
format.)
05 Price Pic 9(5)v99.
05 Edited-price Pic $zz,zz9.99.
. . .
Move Price To Edited-price
Display Edited-price
If the contents of Price are 0150099 (representing the value 1,500.99), $ 1,500.99 is
displayed when you run the code. The z in the PICTURE clause of Edited-price
indicates the suppression of leading zeros.
You can define numeric-edited data items to hold national (UTF-16) characters
| instead of alphanumeric characters. To do so, define the numeric-edited items as
USAGE NATIONAL. The effect of the editing symbols is the same for numeric-edited
items that have USAGE NATIONAL as it is for numeric-edited items that have USAGE
DISPLAY, except that the editing is done with national characters. For example, if
Edited-price is declared as USAGE NATIONAL in the code above, the item is edited
and displayed using national characters.
If these two statements immediately followed the statements in the first example
above, then Price would be displayed as 0150099, representing the value 1,500.99.
Price would also be displayed as 0150099 if Edited-price had USAGE NATIONAL.
RELATED TASKS
Displaying values on a screen or in a file (DISPLAY) on page 35
Controlling how numeric data is stored
Defining numeric data on page 43
Performing arithmetic on page 55
Defining national numeric data items on page 133
Converting to or from national (Unicode) representation on page 137
RELATED REFERENCES
MOVE statement (Enterprise COBOL Language Reference)
BLANK WHEN ZERO clause (Enterprise COBOL Language Reference)
You might want to control the format for any of several reasons such as these:
v Arithmetic performed with computational data types is more efficient than with
USAGE DISPLAY or USAGE NATIONAL data types.
v Packed-decimal format requires less storage per digit than USAGE DISPLAY or
USAGE NATIONAL data types.
v Packed-decimal format converts to and from DISPLAY or NATIONAL format more
efficiently than binary format does.
v Floating-point format is well suited for arithmetic operands and results with
widely varying scale, while maintaining the maximal number of significant
digits.
v You might need to preserve data formats when you move data from one
machine to another.
The numeric data you use in your program will have one of the following formats
available with COBOL:
v External decimal (USAGE DISPLAY or USAGE NATIONAL)
v External floating point (USAGE DISPLAY or USAGE NATIONAL)
v Internal decimal (USAGE PACKED-DECIMAL)
v Binary (USAGE BINARY)
v Native binary (USAGE COMP-5)
COMP and COMP-4 are synonymous with BINARY, and COMP-3 is synonymous with
PACKED-DECIMAL.
Regardless of which USAGE clause you use to control the internal representation of a
value, you use the same PICTURE clause conventions and decimal value in the
VALUE clause (except for internal floating-point data, for which you cannot use a
PICTURE clause).
RELATED CONCEPTS
Formats for numeric data
Data format conversions on page 52
Appendix A, Intermediate results and arithmetic precision, on page 675
RELATED TASKS
Defining numeric data on page 43
Displaying numeric data on page 45
Performing arithmetic on page 55
RELATED REFERENCES
Conversions and precision on page 52
Sign representation of zoned and packed-decimal data on page 53
When USAGE NATIONAL is in effect for a category numeric data item, 2 bytes of
storage are required for each decimal digit. The items are stored in UTF-16 format.
| External decimal items that have USAGE NATIONAL must only contain valid
| UTF-16 digits. If they do not, the data is illegal and the behaviour of the generated
| code is undefined. External decimal items that have USAGE NATIONAL are referred to
as national decimal data items.
National decimal data items, if signed, must have the SIGN SEPARATE clause in
effect. All other rules for zoned decimal items apply to national decimal items. You
can use national decimal items anywhere that other category numeric data items
can be used.
The minus signs (-) do not mean that the mantissa and exponent must necessarily
be negative numbers. Instead, they mean that when the number is displayed, the
sign appears as a blank for positive numbers or a minus sign for negative
numbers. If you instead code a plus sign (+), the sign appears as a plus sign for
positive numbers or a minus sign for negative numbers.
When USAGE NATIONAL is in effect for a floating-point data item, each PICTURE
character position (except for v, if used) takes 2 bytes of storage. The items are
stored as national characters (UTF-16). External floating-point items that have
USAGE NATIONAL are referred to as national floating-point data items.
The existing rules for display floating-point items apply to national floating-point
items.
You cannot use the VALUE clause for external floating-point items.
You can use binary items, for example, for indexes, subscripts, switches, and
arithmetic operands or results.
Use the TRUNC(STD|OPT|BIN) compiler option to indicate how binary data (BINARY,
COMP, or COMP-4) is to be truncated.
When you move or store numeric data into a COMP-5 item, truncation occurs at the
binary field size rather than at the COBOL PICTURE size limit. When you reference
a COMP-5 item, the full binary field size is used in the operation.
COMP-5 is thus particularly useful for binary data items that originate in
non-COBOL programs where the data might not conform to a COBOL PICTURE
clause.
The table below shows the ranges of possible values for COMP-5 data items.
Table 5. Ranges in value of COMP-5 data items
PICTURE Storage representation Numeric values
S9(1) through S9(4) Binary halfword (2 bytes) -32768 through +32767
S9(5) through S9(9) Binary fullword (4 bytes) -2,147,483,648 through +2,147,483,647
S9(10) through Binary doubleword (8 -9,223,372,036,854,775,808 through
S9(18) bytes) +9,223,372,036,854,775,807
9(1) through 9(4) Binary halfword (2 bytes) 0 through 65535
9(5) through 9(9) Binary fullword (4 bytes) 0 through 4,294,967,295
9(10) through 9(18) Binary doubleword (8 0 through 18,446,744,073,709,551,615
bytes)
You can specify scaling (that is, decimal positions or implied integer positions) in
the PICTURE clause of COMP-5 items. If you do so, you must appropriately scale the
maximal capacities listed above. For example, a data item you describe as PICTURE
S99V99 COMP-5 is represented in storage as a binary halfword, and supports a range
of values from -327.68 through +327.67.
Large literals in VALUE clauses: Literals specified in VALUE clauses for COMP-5 items
can, with a few exceptions, contain values of magnitude up to the capacity of the
native binary representation. See Enterprise COBOL Language Reference for the
exceptions.
Regardless of the setting of the TRUNC compiler option, COMP-5 data items behave
like binary data does in programs compiled with TRUNC(BIN).
COMP-1 and COMP-2 data items are stored in System z hexadecimal format.
RELATED CONCEPTS
Unicode and the encoding of language characters on page 129
Appendix A, Intermediate results and arithmetic precision, on page 675
RELATED TASKS
Defining numeric data on page 43
Defining national numeric data items on page 133
RELATED REFERENCES
Storage of character data on page 137
TRUNC on page 363
Classes and categories of data (Enterprise COBOL Language Reference)
SIGN clause (Enterprise COBOL Language Reference)
VALUE clause (Enterprise COBOL Language Reference)
1. The example demonstrates that COMP-5 data items can contain values of magnitude up to the capacity of the
native binary representation (2, 4, or 8 bytes), rather than being limited to the value implied by the number of 9s
in the PICTURE clause.
A conversion is actually a move of a value from one data item to another. The
compiler performs any conversions that are required during the execution of
arithmetic or comparisons by using the same rules that are used for MOVE and
COMPUTE statements.
When possible, the compiler performs a move to preserve numeric value instead of
a direct digit-for-digit move.
Conversion generally requires additional storage and processing time because data
is moved to an internal work area and converted before the operation is
performed. The results might also have to be moved back into a work area and
converted again.
RELATED REFERENCES
Conversions and precision
Sign representation of zoned and packed-decimal data on page 53
When the compiler converts short form to long form for comparisons, zeros are
used for padding the shorter number.
When a USAGE COMP-2 data item is moved to a fixed-point data item that has more
than 18 digits, the fixed-point data item will receive only 18 significant digits, and
the remaining digits will be zero.
If a USAGE COMP-1 data item is moved to a fixed-point data item of nine or more
digits and then returned to the USAGE COMP-1 data item, the original value is
recovered.
If a fixed-point data item that has 15 or fewer digits is moved to a USAGE COMP-2
data item and then returned to the fixed-point data item, the original value is
recovered.
If a USAGE COMP-2 data item is moved to a USAGE COMP-1 data item, rounding occurs
in the low-order position of the target data item.
If a fixed-point data item is moved to an external floating-point data item and the
PICTURE of the fixed-point data item contains more digit positions than the PICTURE
of the external floating-point data item, rounding occurs in the low-order position
of the target data item.
RELATED CONCEPTS
Appendix A, Intermediate results and arithmetic precision, on page 675
Given Xsd, where s is the sign representation and d represents the digit, the valid
sign representations for zoned decimal (USAGE DISPLAY) data without the SIGN IS
SEPARATE clause are:
Positive:
C, A, E, and F
Negative:
D and B
RELATED REFERENCES
NUMPROC on page 339
ZWB on page 372
It can happen that values are passed into your program and assigned to items that
have incompatible data descriptions for those values. For example, nonnumeric
data might be moved or passed into a field that is defined as numeric, or a signed
number might be passed into a field that is defined as unsigned. In either case, the
receiving fields contain invalid data. When you give an item a value that is
incompatible with its data description, references to that item in the PROCEDURE
DIVISION are undefined and your results are unpredictable.
You can use the numeric class test to perform data validation. For example:
Linkage Section.
01 Count-x Pic 999.
. . .
Procedure Division Using Count-x.
If Count-x is numeric then display "Data is good"
For zoned decimal and packed-decimal items, the numeric class test is affected by
the NUMPROC compiler option and the NUMCLS option (which is set at installation
time). To determine the NUMCLS setting used at your installation, consult your
system programmer.
If NUMCLS(PRIM) is in effect at your installation, use the following table to find the
values that the compiler considers valid for the sign.
Table 7. NUMCLS(PRIM) and valid signs
NUMPROC(NOPFD) NUMPROC(PFD)
Signed C, D, F C, D, +0 (positive zero)
Unsigned F F
Separate sign +, - +, -, +0 (positive zero)
If NUMCLS(ALT) is in effect at your installation, use the following table to find the
values that the compiler considers valid for the sign.
Table 8. NUMCLS(ALT) and valid signs
NUMPROC(NOPFD) NUMPROC(PFD)
Signed A to F C, D, +0 (positive zero)
Unsigned F F
Separate sign +, - +, -, +0 (positive zero)
RELATED REFERENCES
NUMPROC on page 339
Performing arithmetic
You can use any of several COBOL language features (including COMPUTE,
arithmetic expressions, numeric intrinsic functions, and math and date callable
services) to perform arithmetic. Your choice depends on whether a feature meets
your particular needs.
RELATED TASKS
Using COMPUTE and other arithmetic statements
Using arithmetic expressions on page 57
Using numeric intrinsic functions on page 57
Using math-oriented callable services on page 58
Using date callable services on page 60
You might also prefer to use the DIVIDE statement (with its REMAINDER phrase) for
division in which you want to process a remainder. The REM intrinsic function also
provides the ability to process a remainder.
When you perform arithmetic calculations, you can use national decimal data
items as operands just as you use zoned decimal data items. You can also use
national floating-point data items as operands just as you use display
floating-point operands.
RELATED CONCEPTS
Fixed-point contrasted with floating-point arithmetic on page 62
Appendix A, Intermediate results and arithmetic precision, on page 675
RELATED TASKS
Defining numeric data on page 43
Arithmetic expressions can consist of a single numeric literal, a single numeric data
item, or a single intrinsic function reference. They can also consist of several of
these items connected by arithmetic operators.
Operators at the same level of precedence are evaluated from left to right;
however, you can use parentheses to change the order of evaluation. Expressions
in parentheses are evaluated before the individual operators are evaluated.
Parentheses, whether necessary or not, make your program easier to read.
RELATED CONCEPTS
Fixed-point contrasted with floating-point arithmetic on page 62
Appendix A, Intermediate results and arithmetic precision, on page 675
Numeric intrinsic functions return a signed numeric value, and are treated as
temporary numeric data items.
You can use intrinsic functions to perform several different arithmetic operations,
as outlined in the following table.
You can reference one function as the argument of another. A nested function is
evaluated independently of the outer function (except when the compiler
determines whether a mixed function should be evaluated using fixed-point or
floating-point instructions).
You can reference all the elements of a table (or array) as function arguments by
using the ALL subscript.
You can also use the integer special registers as arguments wherever integer
arguments are allowed.
RELATED CONCEPTS
Fixed-point contrasted with floating-point arithmetic on page 62
Appendix A, Intermediate results and arithmetic precision, on page 675
RELATED REFERENCES
ARITH on page 309
When you compile with the default option ARITH(COMPAT), COBOL floating-point
intrinsic functions return long (64-bit) results. When you compile with option
For example (considering the first row of the table below), if you compile using
ARITH(COMPAT), CEESDACS returns the same result as ACOS. If you compile using
ARITH(EXTEND), CEESQACS returns the same result as ACOS.
Table 11. Compatibility of math intrinsic functions and callable services
Corresponding Corresponding Results same for intrinsic
COBOL intrinsic long-precision Language extended-precision Language function and callable
function Environment callable service Environment callable service service?
ACOS CEESDACS CEESQACS Yes
ASIN CEESDASN CEESQASN Yes
ATAN CEESDATN CEESQATN Yes
COS CEESDCOS CEESQCOS Yes
LOG CEESDLOG CEESQLOG Yes
LOG10 CEESDLG1 CEESQLG1 Yes
1
RANDOM CEERAN0 none No
REM CEESDMOD CEESQMOD Yes
SIN CEESDSIN CEESQSIN Yes
SQRT CEESDSQT CEESQSQT Yes
TAN CEESDTAN CEESQTAN Yes
1. RANDOM returns a long (64-bit) floating-point result even if you pass it a 31-digit argument and compile with
ARITH(EXTEND).
Both the RANDOM intrinsic function and CEERAN0 service generate random
numbers between zero and one. However, because each uses its own algorithm,
RANDOM and CEERAN0 produce different random numbers from the same seed.
Even for functions that produce the same results, how you use intrinsic functions
and Language Environment callable services differs. The rules for the data types
required for intrinsic function arguments are less restrictive. For numeric intrinsic
functions, you can use arguments that are of any numeric data type. When you
invoke a Language Environment callable service with a CALL statement, however,
you must ensure that the parameters match the numeric data types (generally
COMP-1 or COMP-2) required by that service.
RELATED CONCEPTS
Fixed-point contrasted with floating-point arithmetic on page 62
Appendix A, Intermediate results and arithmetic precision, on page 675
RELATED TASKS
Using Language Environment callable services on page 667
When the default setting of INTDATE(ANSI) is in effect, COBOL uses January 1, 1601
as day 1. The following table compares the results when INTDATE(ANSI) is in effect.
Table 13. INTDATE(ANSI) and compatibility of date intrinsic functions and callable
services
Language Environment callable
COBOL intrinsic function service Results
INTEGER-OF-DATE CEECBLDY Compatible
DATE-OF-INTEGER CEEDATE with picture string YYYYMMDD Incompatible
DAY-OF-INTEGER CEEDATE with picture string YYYYDDD Incompatible
INTEGER-OF-DATE CEEDAYS Incompatible
RELATED TASKS
Using Language Environment callable services on page 667
RELATED REFERENCES
INTDATE on page 331
Where the examples below show zoned decimal data items, national decimal items
could instead be used. (Signed national decimal items, however, require that the
SIGN SEPARATE clause be in effect.)
Finance
Business investment decisions frequently require computing the present value of
expected future cash inflows to evaluate the profitability of a planned investment.
The present value of an amount that you expect to receive at a given time in the
future is that amount, which, if invested today at a given interest rate, would
accumulate to that future amount.
Mathematics
The following COBOL statement demonstrates that you can nest intrinsic
functions, use arithmetic expressions as arguments, and perform previously
complex calculations simply:
Compute Z = Function Log(Function Sqrt (2 * X + 1)) + Function Rem(X 2)
Here in the addend the intrinsic function REM (instead of a DIVIDE statement with a
REMAINDER clause) returns the remainder of dividing X by 2.
Statistics
Intrinsic functions make calculating statistical information easier. Assume you are
analyzing various city taxes and want to calculate the mean, median, and range
(the difference between the maximum and minimum taxes):
01 Tax-S Pic 99v999 value .045.
01 Tax-T Pic 99v999 value .02.
01 Tax-W Pic 99v999 value .035.
01 Tax-B Pic 99v999 value .03.
01 Ave-Tax Pic 99v999.
01 Median-Tax Pic 99v999.
01 Tax-Range Pic 99v999.
. . .
Compute Ave-Tax = Function Mean (Tax-S Tax-T Tax-W Tax-B)
Compute Median-Tax = Function Median (Tax-S Tax-T Tax-W Tax-B)
Compute Tax-Range = Function Range (Tax-S Tax-T Tax-W Tax-B)
RELATED TASKS
Converting to numbers (NUMVAL, NUMVAL-C) on page 117
Many statements in a program could involve arithmetic. For example, each of the
following types of COBOL statements requires some arithmetic evaluation:
v General arithmetic
compute report-matrix-col = (emp-count ** .5) + 1
add report-matrix-min to report-matrix-max giving report-matrix-tot
Floating-point evaluations
In general, if your arithmetic coding has either of the characteristics listed below, it
is evaluated in floating-point arithmetic:
v An operand or result field is floating point.
An operand is floating point if you code it as a floating-point literal or if you
code it as a data item that is defined as USAGE COMP-1, USAGE COMP-2, or external
floating point (USAGE DISPLAY or USAGE NATIONAL with a floating-point PICTURE).
An operand that is a nested arithmetic expression or a reference to a numeric
intrinsic function results in floating-point arithmetic when any of the following
conditions is true:
An argument in an arithmetic expression results in floating point.
The function is a floating-point function.
The function is a mixed function with one or more floating-point arguments.
v An exponent contains decimal places.
An exponent contains decimal places if you use a literal that contains decimal
places, give the item a PICTURE that contains decimal places, or use an arithmetic
expression or function whose result has decimal places.
Fixed-point evaluations
In general, if an arithmetic operation contains neither of the characteristics listed
above for floating point, the compiler causes it to be evaluated in fixed-point
arithmetic. In other words, arithmetic evaluations are handled as fixed point only if
all the operands are fixed point, the result field is defined to be fixed point, and
none of the exponents represent values with decimal places. Nested arithmetic
expressions and function references must also represent fixed-point values.
Implicit comparisons (no relational operator used) are not handled as a unit,
however; the two comparands are treated separately as to their evaluation in
floating-point or fixed-point arithmetic. In the following example, five arithmetic
expressions are evaluated independently of one another's attributes, and then are
compared to each other.
evaluate (a + d)
when (b + e) thru c
when (f / g) thru (h * i)
. . .
end-evaluate
RELATED REFERENCES
Arithmetic expressions in nonarithmetic statements on page 683
Assume that you define the data items for an employee table in the following
manner:
01 employee-table.
05 emp-count pic 9(4).
05 employee-record occurs 1 to 1000 times
depending on emp-count.
10 hours pic +9(5)e+99.
. . .
01 report-matrix-col pic 9(3).
01 report-matrix-min pic 9(3).
01 report-matrix-max pic 9(3).
01 report-matrix-tot pic 9(3).
01 average-hours pic 9(3)v9.
01 whole-hours pic 9(4).
To specify the symbols for displaying financial information, use the CURRENCY SIGN
clause (in the SPECIAL-NAMES paragraph in the CONFIGURATION SECTION) with the
PICTURE characters that relate to those symbols. In the following example, the
PICTURE character $ indicates that the currency sign $US is to be used:
Currency Sign is "$US" with Picture Symbol "$".
. . .
77 Invoice-Amount Pic $$,$$9.99.
. . .
Display "Invoice amount is " Invoice-Amount.
In this example, if Invoice-Amount contained 1500.00, the display output would be:
Invoice amount is $US1,500.00
By using more than one CURRENCY SIGN clause in your program, you can allow for
multiple currency signs to be displayed.
You can use a hexadecimal literal to indicate the currency sign value. Using a
hexadecimal literal could be useful if the data-entry method for the source
program does not allow the entry of the intended characters easily. The following
example shows the hexadecimal value X9F used as the currency sign:
Currency Sign X9F with Picture Symbol U.
. . .
01 Deposit-Amount Pic UUUUU9.99.
If there is no corresponding character for the euro sign on your keyboard, you
need to specify it as a hexadecimal value in the CURRENCY SIGN clause. The
hexadecimal value for the euro sign is either X9F or X5A depending on the code
page in use, as shown in the following table.
Table 14. Hexadecimal values of the euro sign
Code page Modified
CCSID Applicable countries from Euro sign
1140 USA, Canada, Netherlands, Portugal, Australia, 037 X'9F'
New Zealand
1141 Austria, Germany 273 X'9F'
1142 Denmark, Norway 277 X'5A'
1143 Finland, Sweden 278 X'5A'
1144 Italy 280 X'9F'
1145 Spain, Latin America - Spanish 284 X'9F'
1146 UK 285 X'9F'
1147 France 297 X'9F'
RELATED REFERENCES
CURRENCY on page 317
CURRENCY SIGN clause (Enterprise COBOL Language Reference)
The exchange rate used in this example is for illustrative purposes only.
In the example above, SAMPLE-TABLE-ONE is the group item that contains the table.
TABLE-COLUMN names the table element of a one-dimensional table that occurs three
times.
Rather than defining repetitious items as separate, consecutive entries in the DATA
DIVISION, you use the OCCURS clause in the DATA DIVISION entry to define a table.
This practice has these advantages:
v The code clearly shows the unity of the items (the table elements).
v You can use subscripts and indexes to refer to the table elements.
v You can easily repeat data items.
Tables are important for increasing the speed of a program, especially a program
that looks up records.
RELATED CONCEPTS
Complex OCCURS DEPENDING ON on page 81
RELATED TASKS
Defining a table (OCCURS)
Nesting tables on page 69
Referring to an item in a table on page 70
Putting values into a table on page 73
Creating variable-length tables (DEPENDING ON) on page 78
| Searching a table on page 85
| Sorting a table on page 88
Processing table items using intrinsic functions on page 89
Working with unbounded tables and groups on page 90
Handling tables efficiently on page 654
If a table is to contain only Unicode (UTF-16) data, and you want the group item
that contains the table to behave like an elementary category national item in most
operations, code the GROUP-USAGE NATIONAL clause for the group item:
01 table-nameN Group-Usage National.
05 element-nameN OCCURS m TIMES.
10 elementN1 Pic nn.
10 elementN2 Pic S99 Sign Is Leading, Separate.
. . .
You must code the ASCENDING or DESCENDING KEY phrase of the OCCURS clause to do
| a binary search (SEARCH ALL) of a table. You can use a format 2 SORT statement to
| order the table according to its defined keys, thereby making the table searchable
| by the SEARCH ALL statement. Note that SEARCH ALL will return unpredictable
| results if the table has not been ordered according to the keys.
RELATED CONCEPTS
National groups on page 133
RELATED TASKS
Nesting tables on page 69
Referring to an item in a table on page 70
Putting values into a table on page 73
Creating variable-length tables (DEPENDING ON) on page 78
Using national groups on page 134
Doing a binary search (SEARCH ALL) on page 87
Defining numeric data on page 43
RELATED REFERENCES
OCCURS clause (Enterprise COBOL Language Reference)
SIGN clause (Enterprise COBOL Language Reference)
ASCENDING KEY and DESCENDING KEY phrases
Nesting tables
To create a two-dimensional table, define a one-dimensional table in each
occurrence of another one-dimensional table.
In a two-dimensional table, the two subscripts correspond to the row and column
numbers. In a three-dimensional table, the three subscripts correspond to the
depth, row, and column numbers.
RELATED TASKS
Defining a table (OCCURS) on page 67
Referring to an item in a table on page 70
Putting values into a table on page 73
Creating variable-length tables (DEPENDING ON) on page 78
Searching a table on page 85
Processing table items using intrinsic functions on page 89
Handling tables efficiently on page 654
Example: subscripting
The following example shows valid references to SAMPLE-TABLE-THREE that use
literal subscripts. The spaces are required in the second example.
TABLE-COLUMN (2, 2, 1)
TABLE-COLUMN (2 2 1)
In either table reference, the first value (2) refers to the second occurrence within
TABLE-DEPTH, the second value (2) refers to the second occurrence within TABLE-ROW,
and the third value (1) refers to the first occurrence within TABLE-COLUMN.
RELATED TASKS
Subscripting on page 71
Example: indexing
The following example shows how displacements to elements that are referenced
with indexes are calculated.
RELATED TASKS
Indexing on page 72
RELATED TASKS
Subscripting
Indexing on page 72
Subscripting
The lowest possible subscript value is 1, which references the first occurrence of a
table element. In a one-dimensional table, the subscript corresponds to the row
number.
You can use a literal or a data-name as a subscript. If a data item that has a literal
subscript is of fixed length, the compiler resolves the location of the data item.
When you use a data-name as a variable subscript, you must describe the
data-name as an elementary numeric integer. The most efficient format is
COMPUTATIONAL (COMP) with a PICTURE size that is smaller than five digits. You
cannot use a subscript with a data-name that is used as a subscript. The code
generated for the application resolves the location of a variable subscript at run
time.
You can change part of a table element rather than the whole element. To do so,
refer to the character position and length of the substring to be changed. For
example:
01 ANY-TABLE.
05 TABLE-ELEMENT PIC X(10)
OCCURS 3 TIMES VALUE "ABCDEFGHIJ".
. . .
MOVE "??" TO TABLE-ELEMENT (1) (3 : 2).
The MOVE statement in the example above moves the string '??' into table element
number 1, beginning at character position 3, for a length of 2 characters.
RELATED TASKS
Indexing on page 72
Indexing
You create an index by using the INDEXED BY phrase of the OCCURS clause to
identify an index-name.
The compiler calculates the value contained in the index as the occurrence number
(subscript) minus 1, multiplied by the length of the table element. Therefore, for
the fifth occurrence of TABLE-ITEM, the binary value contained in INX-A is (5 - 1) * 8,
or 32.
You can use an index-name to reference another table only if both table
descriptions have the same number of table elements, and the table elements are of
the same length.
You can use the USAGE IS INDEX clause to create an index data item, and can use
an index data item with any table. For example, INX-B in the following code is an
index data item:
77 INX-B USAGE IS INDEX.
. . .
SET INX-A TO 10
SET INX-B TO INX-A.
PERFORM VARYING INX-A FROM 1 BY 1 UNTIL INX-A > INX-B
DISPLAY TABLE-ITEM (INX-A)
. . .
END-PERFORM.
The index-name INX-A is used to traverse table TABLE-ITEM above. The index data
item INX-B is used to hold the index of the last element of the table. The advantage
of this type of coding is that calculation of offsets of table elements is minimized,
and no conversion is necessary for the UNTIL condition.
You can use the SET statement to assign to an index data item the value that you
stored in an index-name, as in the statement SET INX-B TO INX-A above. For
example, when you load records into a variable-length table, you can store the
index value of the last record into a data item defined as USAGE IS INDEX. Then
you can test for the end of the table by comparing the current index value with the
index value of the last record. This technique is useful when you look through or
process a table.
RELATED TASKS
Subscripting on page 71
Putting values into a table
Searching a table on page 85
Processing table items using intrinsic functions on page 89
Handling tables efficiently on page 654
RELATED REFERENCES
INDEXED BY phrase (Enterprise COBOL Language Reference)
INDEX phrase (Enterprise COBOL Language Reference)
SET statement (Enterprise COBOL Language Reference)
RELATED TASKS
Loading a table dynamically
Loading a variable-length table on page 80
Initializing a table (INITIALIZE)
Assigning values when you define a table (VALUE) on page 75
Assigning values to a variable-length table on page 81
To load a table, use the PERFORM statement and either subscripting or indexing.
When reading data to load your table, test to make sure that the data does not
exceed the space allocated for the table. Use a named value (rather than a literal)
for the maximum item count. Then, if you make the table bigger, you need to
change only one value instead of all references to a literal.
RELATED REFERENCES
PERFORM statement (Enterprise COBOL Language Reference)
For example, to move the value 3 into each of the elementary numeric data items
in a table called TABLE-ONE, shown below, you can code the following statement:
INITIALIZE TABLE-ONE REPLACING NUMERIC DATA BY 3.
When you use the INITIALIZE statement to initialize a table, the table is processed
as a group item (that is, with group semantics); elementary data items within the
group are recognized and processed. For example, suppose that TABLE-ONE is an
alphanumeric group that is defined like this:
01 TABLE-ONE.
02 Trans-out Occurs 20.
05 Trans-code Pic X Value "R".
05 Part-number Pic XX Value "13".
05 Trans-quan Pic 99 Value 10.
05 Price-fields.
10 Unit-price Pic 99V Value 50.
10 Discount Pic 99V Value 25.
10 Sales-Price Pic 999 Value 375.
. . .
Initialize TABLE-ONE Replacing Numeric Data By 3
Alphanumeric Data By "X"
The table below shows the content that each of the twenty 12-byte elements
Trans-out(n) has before execution and after execution of the INITIALIZE statement
shown above:
You can similarly use an INITIALIZE statement to load a table that is defined as a
national group. For example, if TABLE-ONE shown above specified the GROUP-USAGE
NATIONAL clause, and Trans-code and Part-number had N instead of X in their
PICTURE clauses, the following statement would have the same effect as the
INITIALIZE statement above, except that the data in TABLE-ONE would instead be
encoded in UTF-16:
Initialize TABLE-ONE Replacing Numeric Data By 3
National Data By N"X"
You can use the REPLACING phrase of the INITIALIZE statement similarly to
initialize all of the elementary ALPHABETIC, DBCS, ALPHANUMERIC-EDITED,
NATIONAL-EDITED, and NUMERIC-EDITED data items in a table.
The INITIALIZE statement cannot assign values to a variable-length table (that is, a
table that was defined using the OCCURS DEPENDING ON clause).
RELATED TASKS
Initializing a structure (INITIALIZE) on page 30
Assigning values when you define a table (VALUE) on page 75
Assigning values to a variable-length table on page 81
Looping through a table on page 103
Using data items and group items on page 24
Using national groups on page 134
RELATED TASKS
Initializing each table item individually
Initializing a table at the group level on page 76
Initializing all occurrences of a given table element on page 76
Initializing a structure (INITIALIZE) on page 30
Use the following technique, which is shown in the example code below:
| 1. Define a record (such as Error-Flag-Table below) that contains the items that
are to be in the table.
2. Set the initial value of each item in a VALUE clause.
3. Code a REDEFINES entry to make the record into a table.
***********************************************************
*** E R R O R F L A G T A B L E ***
***********************************************************
01 Error-Flag-Table Value Spaces.
88 No-Errors Value Spaces.
05 Type-Error Pic X.
05 Shift-Error Pic X.
05 Home-Code-Error Pic X.
05 Work-Code-Error Pic X.
05 Name-Error Pic X.
05 Initials-Error Pic X.
05 Duplicate-Error Pic X.
05 Not-Found-Error Pic X.
01 Filler Redefines Error-Flag-Table.
05 Error-Flag Occurs 8 Times
Indexed By Flag-Index Pic X.
In the example above, the VALUE clause at the 01 level initializes each of the table
items to the same value. Each table item could instead be described with its own
VALUE clause to initialize that item to a distinct value.
RELATED TASKS
Initializing a structure (INITIALIZE) on page 30
Assigning values to a variable-length table on page 81
In the following example, the alphanumeric group data item TABLE-ONE uses a
VALUE clause that initializes each of the four elements of TABLE-TWO:
01 TABLE-ONE VALUE "1234".
05 TABLE-TWO OCCURS 4 TIMES PIC X.
In the following example, the national group data item Table-OneN uses a VALUE
clause that initializes each of the three elements of the subordinate data item
Table-TwoN (each of which is implicitly USAGE NATIONAL). Note that you can
initialize a national group data item with a VALUE clause that uses an alphanumeric
literal, as shown below, or a national literal.
01 Table-OneN Group-Usage National Value "AB12CD34EF56".
05 Table-TwoN Occurs 3 Times Indexed By MyI.
10 ElementOneN Pic nn.
10 ElementTwoN Pic 99.
RELATED REFERENCES
OCCURS clause (Enterprise COBOL Language Reference)
GROUP-USAGE clause (Enterprise COBOL Language Reference)
For example, the code above causes all the X elements (1 through 5) to be
initialized to AA, all the Y elements (1 through 5) to be initialized to 19, and all the
Z elements (1 through 5) to be initialized to BB. T-OBJ is then set to 3.
RELATED TASKS
Assigning values to a variable-length table on page 81
RELATED REFERENCES
OCCURS clause (Enterprise COBOL Language Reference)
In the example above, X is called the ODO subject, and Y is called the ODO object.
You can also specify unbounded tables and groups, see Variable-length tables in
the Enterprise COBOL Language Reference for details.
The following example shows a group item (REC-1) that contains both the subject
and object of the OCCURS DEPENDING ON clause. The way the length of the group
item is determined depends on whether it is sending or receiving data.
WORKING-STORAGE SECTION.
01 MAIN-AREA.
03 REC-1.
05 FIELD-1 PIC 9.
05 FIELD-2 OCCURS 1 TO 5 TIMES
DEPENDING ON FIELD-1 PIC X(05).
01 REC-2.
03 REC-2-DATA PIC X(50).
If you want to move REC-1 (the sending item in this case) to REC-2, the length of
REC-1 is determined immediately before the move, using the current value in
FIELD-1. If the content of FIELD-1 conforms to its PICTURE clause (that is, if FIELD-1
contains a zoned decimal item), the move can proceed based on the actual length
of REC-1. Otherwise, the result is unpredictable. You must ensure that the ODO
object has the correct value before you initiate the move.
When you do a move to REC-1 (the receiving item in this case), the length of REC-1
is determined using the maximum number of occurrences. In this example, five
occurrences of FIELD-2, plus FIELD-1, yields a length of 26 bytes. In this case, you
do not need to set the ODO object (FIELD-1) before referencing REC-1 as a receiving
item. However, the sending field's ODO object (not shown) must be set to a valid
numeric value between 1 and 5 for the ODO object of the receiving field to be
validly set by the move.
However, if you do a move to REC-1 (again the receiving item) where REC-1 is
followed by a variably located group (a type of complex ODO), the actual length of
REC-1 is calculated immediately before the move, using the current value of the
ODO object (FIELD-1). In the following example, REC-1 and REC-2 are in the same
record, but REC-2 is not subordinate to REC-1 and is therefore variably located:
01 MAIN-AREA
03 REC-1.
05 FIELD-1 PIC 9.
05 FIELD-3 PIC 9.
05 FIELD-2 OCCURS 1 TO 5 TIMES
DEPENDING ON FIELD-1 PIC X(05).
03 REC-2.
05 FIELD-4 OCCURS 1 TO 5 TIMES
DEPENDING ON FIELD-3 PIC X(05).
The compiler issues a message that lets you know that the actual length was used.
This case requires that you set the value of the ODO object before using the group
item as a receiving field.
The following example shows how to define a variable-length table when the ODO
object (LOCATION-TABLE-LENGTH below) is outside the group:
RELATED CONCEPTS
Complex OCCURS DEPENDING ON on page 81
RELATED TASKS
Assigning values to a variable-length table on page 81
Loading a variable-length table
Preventing overlay when adding elements to a variable table on page 84
Finding the length of data items on page 122
RELATED REFERENCES
OCCURS DEPENDING ON clause (Enterprise COBOL Language Reference)
Variable-length tables (Enterprise COBOL Language Reference)
If you define the entire table by using the DEPENDING ON phrase, all the elements
are initialized using the maximum defined value of the ODO (OCCURS DEPENDING
ON) object.
If the ODO object is initialized by a VALUE clause, it is logically initialized after the
ODO subject has been initialized.
01 TABLE-THREE VALUE "3ABCDE".
05 X PIC 9.
05 Y OCCURS 5 TIMES
DEPENDING ON X PIC X.
For example, in the code above, the ODO subject Y(1) is initialized to 'A', Y(2) to
'B', . . ., Y(5) to 'E', and finally the ODO object X is initialized to 3. Any subsequent
reference to TABLE-THREE (such as in a DISPLAY statement) refers to X and the first
three elements, Y(1) through Y(3), of the table.
RELATED TASKS
Assigning values when you define a table (VALUE) on page 75
RELATED REFERENCES
OCCURS DEPENDING ON clause (Enterprise COBOL Language Reference)
The basic forms of complex ODO permitted by the compiler are as follows:
v Variably located item or group: A data item described by an OCCURS clause with
the DEPENDING ON phrase is followed by a nonsubordinate elementary or group
data item.
RELATED TASKS
Preventing index errors when changing ODO object value on page 83
Preventing overlay when adding elements to a variable table on page 84
RELATED REFERENCES
Effects of change in ODO object value on page 83
OCCURS DEPENDING ON clause (Enterprise COBOL Language Reference)
Definition: In the example, COUNTER-1 is an ODO object, that is, it is the object of
the DEPENDING ON clause of RECORD-1. RECORD-1 is said to be an ODO subject.
Similarly, COUNTER-2 is the ODO object of the corresponding ODO subject,
RECORD-2.
The types of complex ODO occurrences shown in the example above are as
follows:
(1) A variably located item: EMPLOYEE-NUMBER is a data item that follows, but is
not subordinate to, a variable-length table in the same level-01 record.
(2) A variably located table: TABLE-2 is a table that follows, but is not
subordinate to, a variable-length table in the same level-01 record.
(3) A table with variable-length elements: TABLE-2 is a table that contains a
subordinate data item, RECORD-2, whose number of occurrences varies
depending on the content of its ODO object.
(4) An index-name, INDX, for a table that has variable-length elements.
(5) An element, TABLE-ITEM, of a table that has variable-length elements.
For example:
v The size of any group that contains the relevant ODO clause reflects the new
value of the ODO object.
v A MOVE to a group that contains the ODO subject is made based on the new
value of the ODO object.
v The location of any nonsubordinate items that follow the item described with
the ODO clause is affected by the new value of the ODO object. (To preserve the
contents of the nonsubordinate items, move them to a work area before the
value of the ODO object changes, then move them back.)
The value of an ODO object can change when you move data to the ODO object or
to the group in which it is contained. The value can also change if the ODO object
is contained in a record that is the target of a READ statement.
RELATED TASKS
Preventing index errors when changing ODO object value
Preventing overlay when adding elements to a variable table on page 84
When you change the value of an ODO object, the byte offset in an associated
complex-ODO index is no longer valid because the table length has changed.
Unless you take precautions, you will have unexpected results if you then code a
reference to the index-name such as:
The following code shows how to save and restore the index-name (shown in
Example: complex ODO on page 82) when the ODO object COUNTER-2 changes.
77 INTEGER-DATA-ITEM-1 PIC 99.
. . .
SET INDX TO 5.
* INDX is valid at this point.
SET INTEGER-DATA-ITEM-1 TO INDX.
* INTEGER-DATA-ITEM-1 now has the
* occurrence number that corresponds to INDX.
MOVE NEW-VALUE TO COUNTER-2.
* INDX is not valid at this point.
SET INDX TO INTEGER-DATA-ITEM-1.
* INDX is now valid, containing the offset
* that corresponds to INTEGER-DATA-ITEM-1, and
* can be used with the expected results.
RELATED REFERENCES
SET statement (Enterprise COBOL Language Reference)
In the following example, suppose you want to add an element to the table
VARY-FIELD-1, whose number of elements depends on the ODO object CONTROL-1.
VARY-FIELD-1 is followed by the nonsubordinate variably located data item
GROUP-ITEM-1, whose elements could potentially be overlaid.
WORKING-STORAGE SECTION.
01 VARIABLE-REC.
05 FIELD-1 PIC X(10).
05 CONTROL-1 PIC S99.
05 CONTROL-2 PIC S99.
05 VARY-FIELD-1 OCCURS 1 TO 10 TIMES
Each element of VARY-FIELD-1 has 5 bytes, and each element of VARY-FIELD-2 has 9
bytes. If CONTROL-1 and CONTROL-2 both contain the value 3, you can picture storage
for VARY-FIELD-1 and VARY-FIELD-2 as follows:
VARY-FIELD-1(1)
VARY-FIELD-1(2)
VARY-FIELD-1(3)
VARY-FIELD-2(1)
VARY-FIELD-2(2)
VARY-FIELD-2(3)
You can picture the updated storage for VARY-FIELD-1 and VARY-FIELD-2 as follows:
VARY-FIELD-1(1)
VARY-FIELD-1(2)
VARY-FIELD-1(3)
VARY-FIELD-1(4)
VARY-FIELD-2(1)
VARY-FIELD-2(2)
VARY-FIELD-2(3)
Note that the fourth element of VARY-FIELD-1 did not overlay the first element of
VARY-FIELD-2.
Searching a table
COBOL provides two search techniques for tables: serial and binary.
To do serial searches, use SEARCH and indexing. For variable-length tables, you can
use PERFORM with subscripting or indexing.
A binary search can be considerably more efficient than a serial search. For a serial
search, the number of comparisons is of the order of n, the number of entries in
RELATED TASKS
Doing a serial search (SEARCH)
Doing a binary search (SEARCH ALL) on page 87
The conditions in the WHEN phrase are evaluated in the order in which they appear:
v If none of the conditions is satisfied, the index is increased to correspond to the
next table element, and the WHEN conditions are evaluated again.
v If one of the WHEN conditions is satisfied, the search ends. The index remains
pointing to the table element that satisfied the condition.
v If the entire table has been searched and no conditions were met, the AT END
imperative statement is executed if there is one. If you did not code AT END,
control passes to the next statement in the program.
You can reference only one level of a table (a table element) with each SEARCH
statement. To search multiple levels of a table, use nested SEARCH statements.
Delimit each nested SEARCH statement with END-SEARCH.
Performance: If the found condition comes after some intermediate point in the
table, you can speed up the search by using the SET statement to set the index to
begin the search after that point. Arranging the table so that the data used most
often is at the beginning of the table also enables more efficient serial searching. If
the table is large and is presorted, a binary search is more efficient.
RELATED REFERENCES
SEARCH statement (Enterprise COBOL Language Reference)
Each dimension of the table has its own index (set to 1, 4, and 1, respectively). The
innermost table (TABLE-ENTRY3) has an ascending key.
01 TABLE-ONE.
05 TABLE-ENTRY1 OCCURS 10 TIMES
INDEXED BY TE1-INDEX.
10 TABLE-ENTRY2 OCCURS 10 TIMES
INDEXED BY TE2-INDEX.
15 TABLE-ENTRY3 OCCURS 5 TIMES
ASCENDING KEY IS KEY1
INDEXED BY TE3-INDEX.
20 KEY1 PIC X(5).
20 KEY2 PIC X(10).
. . .
PROCEDURE DIVISION.
. . .
SET TE1-INDEX TO 1
SET TE2-INDEX TO 4
To use the SEARCH ALL statement to search a table, the table must specify the
ASCENDING or DESCENDING KEY phrases of the OCCURS clause, or both, and must
already be ordered on the key or keys that are specified in the ASCENDING and
| DESCENDING KEY phrases. You can use a format 2 SORT statement to order the table
| according to its defined keys, thereby making the table searchable by the SEARCH
| ALL statement. Note that SEARCH ALL will return unpredictable results if the table
| has not been ordered according to the keys.
In the WHEN phrase of the SEARCH ALL statement, you can test any key that is named
in the ASCENDING or DESCENDING KEY phrases for the table, but you must test all
preceding keys, if any. The test must be an equal-to condition, and the WHEN phrase
must specify either a key (subscripted by the first index-name associated with the
table) or a condition-name that is associated with the key. The WHEN condition can
be a compound condition that is formed from simple conditions that use AND as the
only logical connective.
Each key and its object of comparison must be compatible according to the rules
for comparison of data items. Note though that if a key is compared to a national
literal or identifier, the key must be a national data item.
RELATED TASKS
Defining a table (OCCURS) on page 67
RELATED REFERENCES
SEARCH statement (Enterprise COBOL Language Reference)
General relation conditions (Enterprise COBOL Language Reference)
If an entry is found in which each of the three keys is equal to the value to which
it is compared (VALUE-1, VALUE-2, and VALUE-3, respectively), PART-1 of that entry is
moved to OUTPUT-AREA. If no matching key is found in the entries in TABLE-A, the
NOENTRY routine is performed.
| Sorting a table
| You can sort a table by using the format 2 SORT statement. It is part of the 2002
| COBOL Standard.
| The format 2 SORT statement sorts table elements according to the specified table
| keys, and it is especially useful for tables used with SEARCH ALL. You can specify
| the keys for sorting as part of the table definition, which can also be used in the
| SEARCH ALL statement. Alternatively, you can also specify the keys for sorting as
| part of the SORT statement, either if you want to sort the table using different keys
| than those specified in the table definition, or if the table has no keys specified.
| With the format 2 SORT statement, you don't need to use the input and output
| procedures as you do with the format 1 SORT statement.
| See the following example in which the table is sorted based on specified keys:
| WORKING-STORAGE SECTION.
| 01 GROUP-ITEM.
| 05 TABL OCCURS 10 TIMES
| 10 ELEM-ITEM1 PIC X.
| 10 ELEM-ITEM2 PIC X.
| 10 ELEM-ITEM3 PIC X.
| ...
| PROCEDURE DIVISION.
| ...
| SORT TABL DESCENDING ELEM-ITEM2 ELEM-ITEM3.
| IF TABL (1)...
You might often need to iteratively process the data in tables. For intrinsic
functions that accept multiple arguments, you can use the subscript ALL to
reference all the items in the table or in a single dimension of the table. The
iteration is handled automatically, which can make your code shorter and simpler.
You can mix scalars and array arguments for functions that accept multiple
arguments:
Compute Table-Median = Function Median(Arg1 Table-One(ALL))
RELATED TASKS
Using intrinsic functions (built-in functions) on page 38
Converting data items (intrinsic functions) on page 116
Evaluating data items (intrinsic functions) on page 119
RELATED REFERENCES
Intrinsic functions (Enterprise COBOL Language Reference)
The following example computes various salary values for all the employees
whose salaries are encoded in Employee-Table:
01 Employee-Table.
05 Emp-Count Pic s9(4) usage binary.
05 Emp-Record Occurs 1 to 500 times
depending on Emp-Count.
10 Emp-Name Pic x(20).
10 Emp-Idme Pic 9(9).
10 Emp-Salary Pic 9(7)v99.
. . .
Procedure Division.
Compute Max-Salary = Function Max(Emp-Salary(ALL))
To work with unbounded tables and groups in a single program, do these steps:
1. In the LINKAGE SECTION, define an unbounded table (with the syntax of OCCURS
n TO UNBOUNDED), which will be part of an unbounded group.
2. In the WORKING-STORAGE SECTION or LOCAL-STORAGE SECTION, define the OCCURS
DEPENDING ON objects.
3. In the PROCEDURE DIVISION, do these steps to process unbounded groups:
a. Set the OCCURS DEPENDING ON objects.
b. Use the LENGTH special register or the LENGTH intrinsic function to compute
the total size of the group.
c. Use the CALL statement to call a storage allocation service, such as the
Language Environment service CEEGTST. Allocate enough memory for the
total length of the group. You will need a pointer to this memory (the
CEEGTST service returns a pointer).
d. Use the SET statement to establish addressability. For example, SET ADDRESS
OF group TO pointer.
4. Use the unbounded table and its containing unbounded group according to the
following rules:
v You can reference unbounded tables in COBOL syntax anywhere a table can
be referenced.
v You can reference unbounded groups in COBOL syntax anywhere an
alphanumeric or national group can be referenced, with the following
exceptions:
You cannot specify unbounded groups as a BY CONTENT argument in a CALL
statement.
You cannot specify unbounded groups as data-name-2 on the PROCEDURE
DIVISION RETURNING phrase.
You cannot specify unbounded groups as arguments to intrinsic functions,
except as an argument to the LENGTH intrinsic function.
RELATED REFERENCES
Example: Using unbounded tables for parsing XML documents
Variable-length tables (Enterprise COBOL Language Reference)
OCCURS DEPENDING ON clause (Enterprise COBOL Language Reference)
The following examples illustrate the first method. See the XML schema example,
and note that elements B and C have a maxOccurs value of unbounded, and thus can
occur an unlimited number of times in the sequence within element G. In the XML
document example, element B in fact occurs three times, and element C occurs five
times.
In the XML processing program example, the processing procedure for the first XML
PARSE statement simply computes the number of occurrences of elements B and C.
After allocating the required storage, the program executes a second XML PARSE
statement to process the XML payload.
XML schema
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://example.org"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="G">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="A" type="xsd:string" maxOccurs="1" />
<xsd:element name="B" type="xsd:int" maxOccurs="unbounded" />
<xsd:element name="C" type="xsd:int" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
XML document
<?xml version="1.0" encoding="UTF-8"?>
<p:G xmlns:p="http://example.org" >
<A>Hello</A>
<B>1</B>
<B>2</B>
<B>3</B>
<C>1</C>
<C>2</C>
<C>3</C>
<C>4</C>
<C>5</C>
</p:G>
RELATED TASKS
Working with unbounded tables and groups on page 90
These controls include the IF, EVALUATE, and PERFORM statements, and the use of
switches and flags.
RELATED TASKS
Selecting program actions
Repeating program actions on page 101
The IF and EVALUATE statements in COBOL test one or more data items by means
of a conditional expression.
RELATED TASKS
Coding a choice of actions
Coding conditional expressions on page 98
RELATED REFERENCES
IF statement (Enterprise COBOL Language Reference)
EVALUATE statement (Enterprise COBOL Language Reference)
When one of two processing choices is no action, code the IF statement with or
without ELSE. Because the ELSE clause is optional, you can code the IF statement as
follows:
IF condition-q
statement-1
END-IF
Such coding is suitable for simple cases. For complex logic, you probably need to
use the ELSE clause. For example, suppose you have nested IF statements in which
there is an action for only one of the processing choices. You could use the ELSE
clause and code the null branch of the IF statement with the CONTINUE statement:
The EVALUATE statement is an expanded form of the IF statement that allows you to
avoid nesting IF statements, a common source of logic errors and debugging
problems.
RELATED TASKS
Using nested IF statements
Using the EVALUATE statement on page 95
Coding conditional expressions on page 98
However, use nested IF statements sparingly. The logic can be difficult to follow,
although explicit scope terminators and indentation can help. If a program has to
test a variable for more than two values, EVALUATE is probably a better choice.
The following figure shows the logic structure of the pseudocode above.
RELATED REFERENCES
Explicit scope terminators (Enterprise COBOL Language Reference)
You can also use the EVALUATE statement to cause multiple conditions to lead to the
same processing, as shown in these examples:
In an EVALUATE statement, the operands before the WHEN phrase are referred to as
selection subjects, and the operands in the WHEN phrase are called the selection objects.
Selection subjects can be identifiers, literals, conditional expressions, or the word
TRUE or FALSE. Selection objects can be identifiers, literals, conditional or arithmetic
expressions, or the word TRUE, FALSE, or ANY.
You can separate multiple selection subjects with the ALSO phrase. You can separate
multiple selection objects with the ALSO phrase. The number of selection objects
within each set of selection objects must be equal to the number of selection
subjects, as shown in this example:
The execution of the EVALUATE statement ends when one of the following
conditions occurs:
v The statements associated with the selected WHEN phrase are performed.
v The statements associated with the WHEN OTHER phrase are performed.
v No WHEN conditions are satisfied.
WHEN phrases are tested in the order that they appear in the source program.
Therefore, you should order these phrases for the best performance. First code the
WHEN phrase that contains selection objects that are most likely to be satisfied, then
the next most likely, and so on. An exception is the WHEN OTHER phrase, which must
come last.
RELATED TASKS
Coding a choice of actions on page 93
RELATED REFERENCES
EVALUATE statement (Enterprise COBOL Language Reference)
General relation conditions (Enterprise COBOL Language Reference)
This example shows how you can code several conditions in a range of values to
lead to the same processing action by coding the THRU phrase. Operands in a THRU
phrase must be of the same class.
In this example, CARPOOL-SIZE is the selection subject; 1, 2, and 3 THRU 6 are the
selection objects:
EVALUATE CARPOOL-SIZE
WHEN 1
MOVE "SINGLE" TO PRINT-CARPOOL-STATUS
WHEN 2
MOVE "COUPLE" TO PRINT-CARPOOL-STATUS
WHEN 3 THRU 6
MOVE "SMALL GROUP" TO PRINT-CARPOOL STATUS
WHEN OTHER
MOVE "BIG GROUP" TO PRINT-CARPOOL STATUS
END-EVALUATE
The following example shows that you can code multiple WHEN phrases if several
conditions should lead to the same action. Doing so gives you more flexibility than
using only the THRU phrase, because the conditions do not have to evaluate to
values in a range nor have the same class.
EVALUATE MARITAL-CODE
WHEN "M"
ADD 2 TO PEOPLE-COUNT
WHEN "S"
WHEN "D"
WHEN "W"
ADD 1 TO PEOPLE-COUNT
END-EVALUATE
This example shows the use of the ALSO phrase to separate two selection subjects
(True ALSO True) and to separate the two corresponding selection objects within
each set of selection objects (for example, When A + B < 10 Also C = 10).
Both selection objects in a WHEN phrase must satisfy the TRUE, TRUE condition before
the associated action is performed. If both objects do not evaluate to TRUE, the next
WHEN phrase is processed.
Identification Division.
Program-ID. MiniEval.
Environment Division.
Configuration Section.
Source-Computer. IBM-390.
Data Division.
Working-Storage Section.
01 Age Pic 999.
01 Sex Pic X.
01 Description Pic X(15).
01 A Pic 999.
01 B Pic 9999.
01 C Pic 9999.
01 D Pic 9999.
01 E Pic 99999.
01 F Pic 999999.
Procedure Division.
PN01.
Evaluate True Also True
When Age < 13 Also Sex = "M"
Move "Young Boy" To Description
When Age < 13 Also Sex = "F"
Move "Young Girl" To Description
When Age > 12 And Age < 20 Also Sex = "M"
Move "Teenage Boy" To Description
When Age > 12 And Age < 20 Also Sex = "F"
Move "Teenage Girl" To Description
When Age > 19 Also Sex = "M"
RELATED CONCEPTS
Switches and flags on page 99
RELATED TASKS
Defining switches and flags on page 99
Resetting switches and flags on page 100
Checking for incompatible data (numeric class test) on page 54
Comparing national (UTF-16) data on page 147
Testing for valid DBCS characters on page 151
RELATED REFERENCES
General relation conditions (Enterprise COBOL Language Reference)
Flags and switches make your code easier to change. If you need to change the
values for a condition, you have to change only the value of that level-88
condition-name.
For example, suppose a program uses a condition-name to test a field for a given
salary range. If the program must be changed to check for a different salary range,
you need to change only the value of the condition-name in the DATA DIVISION.
You do not need to make changes in the PROCEDURE DIVISION.
RELATED TASKS
Defining switches and flags
Resetting switches and flags on page 100
To test for more than two values with flags, assign more than one condition-name
to a field by using multiple level-88 items.
The reader can easily follow your code if you choose meaningful condition-names
and if the values assigned to them have some association with logical values.
Example: switches
Example: flags on page 100
Example: switches
The following examples show how you can use level-88 items to test for various
binary-valued (on-off) conditions in your program.
For example, to test for the end-of-file condition for an input file named
Transaction-File, you can use the following data definitions:
WORKING-STORAGE SECTION.
01 Switches.
05 Transaction-EOF-Switch Pic X value space.
88 Transaction-EOF value "y".
Example: flags
The following examples show how you can use several level-88 items together
with an EVALUATE statement to determine which of several conditions in a program
is true.
Consider for example a program that updates a master file. The updates are read
from a transaction file. The records in the file contain a field that indicates which
of the three functions is to be performed: add, change, or delete. In the record
description of the input file, code a field for the function code using level-88 items:
01 Transaction-Input Record
05 Transaction-Type Pic X.
88 Add-Transaction Value "A".
88 Change-Transaction Value "C".
88 Delete-Transaction Value "D".
The code in the PROCEDURE DIVISION for testing these condition-names to determine
which function is to be performed might look like this:
Evaluate True
When Add-Transaction
Perform Add-Master-Record-Paragraph
When Change-Transaction
Perform Update-Existing-Record-Paragraph
When Delete-Transaction
Perform Delete-Master-Record-Paragraph
End-Evaluate
When you use the SET condition-name TO TRUE statement, the switch or flag is set to
the original value that it was assigned in its data description. For a level-88 item
that has multiple values, SET condition-name TO TRUE assigns the first value (A in the
example below):
88 Record-is-Active Value "A" "O" "S"
Using the SET statement and meaningful condition-names makes it easier for
readers to follow your code.
For example, the SET statement in the following example has the same effect as
coding the statement Move "y" to Transaction-EOF-Switch:
01 Switches
05 Transaction-EOF-Switch Pic X Value space.
88 Transaction-EOF Value "y".
. . .
Procedure Division.
000-Do-Main-Logic.
The following example shows how to assign a value to a field in an output record
based on the transaction code of an input record:
01 Input-Record.
05 Transaction-Type Pic X(9).
01 Data-Record-Out.
05 Data-Record-Type Pic X.
88 Record-Is-Active Value "A".
88 Record-Is-Suspended Value "S".
88 Record-Is-Deleted Value "D".
05 Key-Field Pic X(5).
. . .
Procedure Division.
Evaluate Transaction-Type of Input-Record
When "ACTIVE"
Set Record-Is-Active to TRUE
When "SUSPENDED"
Set Record-Is-Suspended to TRUE
When "DELETED"
Set Record-Is-Deleted to TRUE
End-Evaluate
For example, you can use a data item called SWITCH-OFF to set an on-off switch to
off, as in the following code, which resets a switch to indicate that end-of-file has
not been reached:
01 Switches
05 Transaction-EOF-Switch Pic X Value space.
88 Transaction-EOF Value "y".
01 SWITCH-OFF Pic X Value "n".
. . .
Procedure Division.
. . .
Move SWITCH-OFF to Transaction-EOF-Switch
You can also use a PERFORM statement to execute a paragraph and then implicitly
return control to the next executable statement. In effect, this PERFORM statement is
a way of coding a closed subroutine that you can enter from many different parts
of the program.
RELATED TASKS
Choosing inline or out-of-line PERFORM on page 102
Coding a loop on page 103
Looping through a table on page 103
Executing multiple paragraphs or sections on page 104
In the 1974 COBOL standard, the PERFORM statement is out-of-line and thus requires
a branch to a separate paragraph and an implicit return. If the performed
paragraph is in the subsequent sequential flow of your program, it is also executed
in that logic flow. To avoid this additional execution, place the paragraph outside
the normal sequential flow (for example, after the GOBACK) or code a branch around
it.
In the example above, when control reaches the PERFORM statement, the code for the
paragraph 010-PROCESS-ONE-MONTH is executed 12 times before control is transferred
to the INSPECT statement.
Use the PERFORM . . . WITH TEST AFTER . . . UNTIL statement if you want to
execute the paragraph at least once, and test before any subsequent execution. This
statement is equivalent to a do-until structure:
In the following example, the implicit WITH TEST BEFORE phrase provides a
do-while structure:
PERFORM 010-PROCESS-ONE-MONTH
UNTIL MONTH GREATER THAN 12
INSPECT . . .
When control reaches the PERFORM statement, the condition MONTH GREATER THAN 12
is tested. If the condition is satisfied, control is transferred to the INSPECT
statement. If the condition is not satisfied, 010-PROCESS-ONE-MONTH is executed, and
the condition is tested again. This cycle continues until the condition tests as true.
(To make your program easier to read, you might want to code the WITH TEST
BEFORE clause.)
Thus you use the PERFORM statement to control looping through a table. You can
use either of these forms:
PERFORM . . . WITH TEST AFTER . . . . VARYING . . . UNTIL . . .
PERFORM . . . [WITH TEST BEFORE] . . . VARYING . . . UNTIL . . .
When control reaches the PERFORM statement above, WS-DATA-IX is set equal to 1
and the PERFORM statement is executed. Then the condition WS-DATA-IX = 12 is
tested. If the condition is true, control drops through to the INSPECT statement. If
the condition is false, WS-DATA-IX is increased by 1, the PERFORM statement is
executed, and the condition is tested again. This cycle of execution and testing
continues until WS-DATA-IX is equal to 12.
The loop above controls input-checking for the 12 fields of item WS-DATA. Empty
fields are not allowed in the application, so the section of code loops and issues
error messages as appropriate.
When you use the PERFORM . . . THRU statement, code a paragraph-EXIT statement
to clearly indicate the end point of a series of paragraphs.
RELATED TASKS
Processing table items using intrinsic functions on page 89
RELATED TASKS
Joining data items (STRING)
Splitting data items (UNSTRING) on page 107
Manipulating null-terminated strings on page 110
Referring to substrings of data items on page 111
Tallying and replacing data items (INSPECT) on page 115
Converting data items (intrinsic functions) on page 116
Evaluating data items (intrinsic functions) on page 119
Chapter 7, Processing data in an international environment, on page 125
The STRING statement transfers data into a receiving data item in the order that you
indicate. In the STRING statement you also specify:
v A delimiter for each set of sending fields that, if encountered, causes those
sending fields to stop being transferred (DELIMITED BY phrase)
v (Optional) Action to be taken if the receiving field is filled before all of the
sending data has been processed (ON OVERFLOW phrase)
v (Optional) An integer data item that indicates the leftmost character position
within the receiving field into which data should be transferred (WITH POINTER
phrase)
The receiving data item must not be an edited item, or a display or national
floating-point item. If the receiving data item has:
v USAGE DISPLAY, each identifier in the statement except the POINTER identifier
must have USAGE DISPLAY, and each literal in the statement must be
alphanumeric
v USAGE NATIONAL, each identifier in the statement except the POINTER identifier
must have USAGE NATIONAL, and each literal in the statement must be national
v USAGE DISPLAY-1, each identifier in the statement except the POINTER identifier
must have USAGE DISPLAY-1, and each literal in the statement must be DBCS
RELATED TASKS
Handling errors in joining and splitting strings on page 240
RELATED REFERENCES
STRING statement (Enterprise COBOL Language Reference)
The record RCD-01 contains the following information (the symbol b indicates a
blank space):
J.B.bSMITHbbbbb
444bSPRINGbST.,bCHICAGO,bILL.bbbbbb
A14275
$4,736.85
$2,400.00
09/22/76
$2,336.85
10/22/76
In the PROCEDURE DIVISION, these settings occur before the STRING statement:
v RPT-LINE is set to SPACES.
v LINE-POS, the data item to be used as the POINTER field, is set to 4.
The sending items that specify DELIMITED BY SIZE are moved in their entirety to
the receiving field. Because BAL-DUE is delimited by DEC-POINT, the moving of
BAL-DUE to the receiving field stops when a decimal point (the value of DEC-POINT)
is encountered.
STRING results
When the STRING statement is performed, items are moved into RPT-LINE as shown
in the table below.
Item Positions
LINE-NO 4-8
Space 9
CUST-INFO 10 - 59
INV-NO 60 - 65
Space 66
DATE-DUE 67 - 74
Space 75
Portion of BAL-DUE that precedes the decimal point 76 - 81
After the STRING statement is performed, the value of LINE-POS is 82, and RPT-LINE
has the values shown below.
The sending data item and the delimiters in the DELIMITED BY phrase must be of
category alphabetic, alphanumeric, alphanumeric-edited, DBCS, national, or
national-edited.
RELATED CONCEPTS
Unicode and the encoding of language characters on page 129
RELATED TASKS
Handling errors in joining and splitting strings on page 240
RELATED REFERENCES
UNSTRING statement (Enterprise COBOL Language Reference)
Classes and categories of data (Enterprise COBOL Language Reference)
In the PROCEDURE DIVISION, these settings occur before the UNSTRING statement:
v A period (.) is placed in DBY-1 for use as a delimiter.
v CHAR-CT (the POINTER field) is set to 3.
v The value zero (0) is placed in FLDS-FILLED (the TALLYING field).
v Data is read into record INV-RCD, whose format is as shown below.
Because the POINTER field CHAR-CT has value 3 before the UNSTRING statement is
performed, the two character positions of the CONTROL-CHARS field in INV-RCD are
ignored.
UNSTRING results
When the UNSTRING statement is performed, the following steps take place:
1. Positions 3 through 18 (FOUR-PENNY-NAILS) of INV-RCD are placed in ITEM-NAME,
left justified in the area, and the four unused character positions are padded
with spaces. The value 16 is placed in CTR-1.
2. Because ALL SPACES is coded as a delimiter, the five contiguous space characters
in positions 19 through 23 are considered to be one occurrence of the delimiter.
3. Positions 24 through 29 (707890) are placed in INV-NO. The delimiter character
slash (/) is placed in DLTR-1, and the value 6 is placed in CTR-2.
After the UNSTRING statement is performed, the fields contain the values shown
below.
Field Value
DISPLAY-REC 707890 FOUR-PENNY-NAILS 000379
WORK-REC 475120000122BBA
CHAR-CT (the POINTER field) 55
FLDS-FILLED (the TALLYING field) 6
RELATED TASKS
Handling null-terminated strings on page 486
RELATED REFERENCES
Alphanumeric literals (Enterprise COBOL Language Reference)
You code a reference modifier in parentheses immediately after the data item. As
the example shows, a reference modifier can contain two values that are separated
by a colon, in this order:
The reference-modifier position and length for an item that has USAGE DISPLAY are
expressed in terms of single-byte characters. The reference-modifier position and
length for items that have USAGE DISPLAY-1 or NATIONAL are expressed in terms of
DBCS character positions and national character positions, respectively.
If you omit the length in a reference modifier (coding only the ordinal position of
the first character, followed by a colon), the substring extends to the end of the
item. Omit the length where possible as a simpler and less error-prone coding
technique.
You can refer to substrings of USAGE DISPLAY data items, including alphanumeric
groups, alphanumeric-edited data items, numeric-edited data items, display
floating-point data items, and zoned decimal data items, by using reference
modifiers. When you reference-modify any of these data items, the result is of
category alphanumeric. When you reference-modify an alphabetic data item, the
result is of category alphabetic.
You can refer to substrings of USAGE NATIONAL data items, including national
groups, national-edited data items, numeric-edited data items, national
floating-point data items, and national decimal data items, by using reference
modifiers. When you reference-modify any of these data items, the result is of
category national. For example, suppose that you define a national decimal data
item as follows:
01 NATL-DEC-ITEM Usage National Pic 999 Value 123.
You can code either or both of the two values in a reference modifier as a variable
or as an arithmetic expression.
Each number in the reference modifier must have a value of at least 1. The sum of
the two numbers must not exceed the total length of the data item by more than 1
character position so that you do not reference beyond the end of the substring.
The SSRANGE compiler option detects out-of-range reference modifiers, and flags
violations with a runtime message.
RELATED CONCEPTS
Reference modifiers
Unicode and the encoding of language characters on page 129
RELATED TASKS
Referring to an item in a table on page 70
RELATED REFERENCES
SSRANGE on page 357
Reference modification (Enterprise COBOL Language Reference)
Function definitions (Enterprise COBOL Language Reference)
Reference modifiers
Reference modifiers let you easily refer to a substring of a data item.
For example, assume that you want to retrieve the current time from the system
and display its value in an expanded format. You can retrieve the current time
with the ACCEPT statement, which returns the hours, minutes, seconds, and
hundredths of seconds in this format:
HHMMSSss
However, you might prefer to view the current time in this format:
HH:MM:SS
Without reference modifiers, you would have to define data items for both formats.
You would also have to write code to convert from one format to the other.
With reference modifiers, you do not need to provide names for the subfields that
describe the TIME elements. The only data definition you need is for the time as
returned by the system. For example:
01 REFMOD-TIME-ITEM PIC X(8).
RELATED REFERENCES
Reference modification (Enterprise COBOL Language Reference)
The program counts the number of leading spaces and, using arithmetic
expressions in a reference modifier, moves the right-justified characters into
another field, justified to the left:
MOVE SPACES TO LEFTY
MOVE ZERO TO I
INSPECT RIGHTY
TALLYING I FOR LEADING SPACE.
IF I IS LESS THAN LENGTH OF RIGHTY THEN
MOVE RIGHTY ( I + 1 : LENGTH OF RIGHTY - I ) TO LEFTY
END-IF
The MOVE statement transfers characters from RIGHTY, beginning at the position
computed as I + 1 for a length that is computed as LENGTH OF RIGHTY - I, into the
field LEFTY.
RELATED REFERENCES
INTEGER (Enterprise COBOL Language Reference)
INTEGER-PART (Enterprise COBOL Language Reference)
You can specify one of the following data items as the item to be inspected:
v An elementary item described explicitly or implicitly as USAGE DISPLAY, USAGE
DISPLAY-1, or USAGE NATIONAL
v An alphanumeric group item or national group item
RELATED CONCEPTS
Unicode and the encoding of language characters on page 129
RELATED REFERENCES
INSPECT statement (Enterprise COBOL Language Reference)
In the following example, the INSPECT statement examines and replaces characters
in data item DATA-2. The number of times a leading zero (0) occurs in the data item
is accumulated in COUNTR. The first instance of the character A that follows the first
instance of the character C is replaced by the character 2.
77 COUNTR PIC 9 VALUE ZERO.
01 DATA-2 PIC X(11).
. . .
INSPECT DATA-2
TALLYING COUNTR FOR LEADING "0"
REPLACING FIRST "A" BY "2" AFTER INITIAL "C"
In the following example, the INSPECT statement examines and replaces characters
in data item DATA-3. Each character that precedes the first instance of a quotation
mark (") is replaced by the character 0.
77 COUNTR PIC 9 VALUE ZERO.
01 DATA-3 PIC X(8).
. . .
INSPECT DATA-3
REPLACING CHARACTERS BY ZEROS BEFORE INITIAL QUOTE
The following example shows the use of INSPECT CONVERTING with AFTER and
BEFORE phrases to examine and replace characters in data item DATA-4. All
characters that follow the first instance of the character / but that precede the first
instance of the character ? (if any) are translated from lowercase to uppercase.
01 DATA-4 PIC X(11).
. . .
INSPECT DATA-4
CONVERTING
"abcdefghijklmnopqrstuvwxyz" TO
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
AFTER INITIAL "/"
BEFORE INITIAL"?"
You can use the NATIONAL-OF and DISPLAY-OF intrinsic functions to convert to and
from national (Unicode) strings.
RELATED TASKS
Changing case (UPPER-CASE, LOWER-CASE) on page 117
Transforming to reverse order (REVERSE) on page 117
The code above displays the following messages on the system logical output
device:
Hello World!
HELLO WORLD!
hello world!
HELLO WORLD!
The DISPLAY statements do not change the actual contents of Item-1, but affect only
how the letters are displayed. However, the MOVE statement causes uppercase
letters to replace the contents of Item-2.
RELATED TASKS
Assigning input from a screen or file (ACCEPT) on page 34
Displaying values on a screen or in a file (DISPLAY) on page 35
For example, the statement above reverses the order of the characters in
Orig-cust-name. If the starting value is JOHNSONbbb, the value after the statement is
performed is bbbNOSNHOJ, where b represents a blank space.
RELATED CONCEPTS
Unicode and the encoding of language characters on page 129
| When you use NUMVAL or NUMVAL-C, you do not need to statically define numeric
data in a fixed format nor input data in a precise manner. For example, suppose
you define numbers to be entered as follows:
01 X Pic S999V99 leading sign is separate.
. . .
Accept X from Console
The user of the application must enter the numbers exactly as defined by the
PICTURE clause. For example:
+001.23
-300.00
RELATED CONCEPTS
Formats for numeric data on page 47
Data format conversions on page 52
Unicode and the encoding of language characters on page 129
RELATED TASKS
Converting to or from national (Unicode) representation on page 137
RELATED REFERENCES
Conversions and precision on page 52
ARITH on page 309
RELATED CONCEPTS
Unicode and the encoding of language characters on page 129
RELATED TASKS
Converting to or from national (Unicode) representation on page 137
RELATED CONCEPTS
Unicode and the encoding of language characters on page 129
RELATED TASKS
Evaluating single characters for collating sequence
Finding the largest or smallest data item on page 120
Finding the length of data items on page 122
Finding the date of compilation on page 123
You can use a one-character substring of a data item as the argument to ORD:
IF Function Ord(Customer-record(1:1)) IS > 194 THEN . . .
If you know the ordinal position in the collating sequence of a character, and want
to find the character that it corresponds to, use the CHAR function with the integer
ordinal position as the argument. CHAR returns the required character. For example:
INITIALIZE Customer-Name REPLACING ALPHABETIC BY Function Char(65)
To compare numeric items, including those that have USAGE NATIONAL, you can use
MAX, ORD-MAX, MIN, or ORD-MIN. With these intrinsic functions, the algebraic values of
the arguments are compared.
The MAX and MIN functions return the content of one of the arguments that you
supply. For example, suppose that your program has the following data
definitions:
05 Arg1 Pic x(10) Value "THOMASSON ".
05 Arg2 Pic x(10) Value "THOMAS ".
05 Arg3 Pic x(10) Value "VALLEJO ".
The functions ORD-MAX and ORD-MIN return an integer that represents the ordinal
position (counting from the left) of the argument that has the largest or smallest
value in the list of arguments that you supply. If you used the ORD-MAX function in
the example above, the compiler would issue an error message because the
reference to a numeric function is not in a valid place. The following statement is a
valid use of ORD-MAX:
Compute x = Function Ord-max(Arg1 Arg2 Arg3)
The statement above assigns the integer 3 to x if the same arguments are used as
in the previous example. If you used ORD-MIN instead, the integer 2 would be
returned. The examples above might be more realistic if Arg1, Arg2, and Arg3 were
successive elements of an array (table).
If you specify a national item for any argument, you must specify all arguments as
class national.
RELATED TASKS
Performing arithmetic on page 55
Processing table items using intrinsic functions on page 89
Returning variable results with alphanumeric or national functions on page 121
RELATED REFERENCES
MAX (Enterprise COBOL Language Reference)
MIN (Enterprise COBOL Language Reference)
ORD-MAX (Enterprise COBOL Language Reference)
ORD-MIN (Enterprise COBOL Language Reference)
In the following example, the amount of data moved to R3 and the results of the
COMPUTE statement depend on the values and sizes of R1 and R2:
01 R1 Pic x(10) value "e".
01 R2 Pic x(05) value "f".
01 R3 Pic x(20) value spaces.
01 L Pic 99.
. . .
Move Function Max(R1 R2) to R3
Compute L = Function Length(Function Max(R1 R2))
If R1 contained 'g' instead of 'e', the code would have the following results:
v R1 would evaluate as larger than R2.
v The string 'gbbbbbbbbb' would be moved to R3. (The unfilled character positions
in R3 would be padded with spaces.)
v The value 10 would be assigned to L.
If a program uses national data for function arguments, the lengths and values of
the function results could likewise vary. For example, the following code is
identical to the fragment above, but uses national data instead of alphanumeric
data.
01 R1 Pic n(10) national value "e".
01 R2 Pic n(05) national value "f".
01 R3 Pic n(20) national value spaces.
01 L Pic 99 national.
. . .
Move Function Max(R1 R2) to R3
Compute L = Function Length(Function Max(R1 R2))
This code has the following results, which are similar to the first set of results
except that these are for national characters:
v R2 is evaluated to be larger than R1.
v The string NX"0066 0020 0020 0020 0020" (the equivalent in national characters
of 'fbbbb', where b represents a blank space), shown here in hexadecimal notation
with added spaces for readability, is moved to R3. The unfilled character
positions in R3 are padded with national spaces.
v L evaluates to the value 5, the length in national character positions of R2.
RELATED TASKS
Finding the largest or smallest data item on page 120
Performing arithmetic on page 55
RELATED REFERENCES
MAX (Enterprise COBOL Language Reference)
The LENGTH function returns the length of a national item (a literal, or any item that
has USAGE NATIONAL, including national group items) as an integer equal to the
length of the argument in national character positions. It returns the length of any
other data item as an integer equal to the length of the argument in alphanumeric
character positions.
The following COBOL statement demonstrates moving a data item into the field in
a record that holds customer names:
Move Customer-name To Customer-record(1:Function Length(Customer-name))
You can also use the LENGTH OF special register, which returns the length in bytes
even for national data. Coding either Function Length(Customer-name) or LENGTH
OF Customer-name returns the same result for alphanumeric items: the length of
Customer-name in bytes.
You can use the LENGTH function only where arithmetic expressions are allowed.
However, you can use the LENGTH OF special register in a greater variety of
contexts. For example, you can use the LENGTH OF special register as an argument
to an intrinsic function that accepts integer arguments. (You cannot use an intrinsic
function as an operand to the LENGTH OF special register.) You can also use the
LENGTH OF special register as a parameter in a CALL statement.
RELATED TASKS
Performing arithmetic on page 55
Creating variable-length tables (DEPENDING ON) on page 78
Processing table items using intrinsic functions on page 89
RELATED REFERENCES
LENGTH (Enterprise COBOL Language Reference)
LENGTH OF (Enterprise COBOL Language Reference)
You can instead use the WHEN-COMPILED special register to determine the date and
time of compilation in the following format:
MM/DD/YYhh.mm.ss
The WHEN-COMPILED special register supports only a two-digit year, and does not
carry fractions of a second. You can use this special register only as the sending
field in a MOVE statement.
RELATED REFERENCES
WHEN-COMPILED (Enterprise COBOL Language Reference)
Use these COBOL facilities to code and compile programs that process national
data:
v Data types and literals:
Character data types, defined with the USAGE NATIONAL clause and a PICTURE
clause that defines data of category national, national-edited, or
numeric-edited
Numeric data types, defined with the USAGE NATIONAL clause and a PICTURE
clause that defines a numeric data item (a national decimal item) or an external
floating-point data item (a national floating-point item)
National literals, specified with literal prefix N or NX
Figurative constant ALL national-literal
Figurative constants QUOTE, SPACE, HIGH-VALUE, LOW-VALUE, or ZERO, which have
national character (UTF-16) values when used in national-character contexts
v The COBOL statements shown in the related reference below about COBOL
statements and national data
v Intrinsic functions:
NATIONAL-OF to convert an alphanumeric or double-byte character set (DBCS)
character string to USAGE NATIONAL (UTF-16)
DISPLAY-OF to convert a national character string to USAGE DISPLAY in a
selected code page (EBCDIC, ASCII, EUC, or UTF-8)
The other intrinsic functions shown in the related reference below about
intrinsic functions and national data
v The GROUP-USAGE NATIONAL clause to define groups that contain only USAGE
NATIONAL data items and that behave like elementary category national items in
most operations
v Compiler options:
CODEPAGE to specify the code page to use for alphanumeric and DBCS data in
your program
NSYMBOL to control whether national or DBCS processing is used for the N
symbol in literals and PICTURE clauses
You can also take advantage of implicit conversions of alphanumeric or DBCS data
items to national representation. The compiler performs such conversions (in most
cases) when you move these items to national data items, or compare these items
with national data items.
RELATED CONCEPTS
Unicode and the encoding of language characters on page 129
National groups on page 133
RELATED TASKS
Using national data (Unicode) in COBOL on page 130
Converting to or from national (Unicode) representation on page 137
RELATED REFERENCES
COBOL statements and national data
Intrinsic functions and national data on page 128
CODEPAGE on page 313
NSYMBOL on page 338
Classes and categories of data (Enterprise COBOL Language Reference)
Data categories and PICTURE rules (Enterprise COBOL Language Reference)
MOVE statement (Enterprise COBOL Language Reference)
General relation conditions (Enterprise COBOL Language Reference)
RELATED TASKS
Defining numeric data on page 43
Displaying numeric data on page 45
Using national data (Unicode) in COBOL on page 130
Comparing national (UTF-16) data on page 147
RELATED REFERENCES
CODEPAGE on page 313
Classes and categories of data (Enterprise COBOL Language Reference)
You can use national decimal arguments wherever zoned decimal arguments are
allowed. You can use national floating-point arguments wherever display
floating-point arguments are allowed. (See the related reference below about
arguments for a complete list of intrinsic functions that can take integer or numeric
arguments.)
RELATED TASKS
Defining numeric data on page 43
Using national data (Unicode) in COBOL on page 130
RELATED REFERENCES
Arguments (Enterprise COBOL Language Reference)
Classes and categories of data (Enterprise COBOL Language Reference)
A character set is a defined set of characters, but is not associated with a coded
representation. A coded character set (also referred to in this documentation as a code
page) is a set of unambiguous rules that relate the characters of the set to their
coded representation. Each code page has a name and is like a table that sets up
the symbols for representing a character set; each symbol is associated with a
unique bit pattern, or code point. Each code page also has a coded character set
identifier (CCSID), which is a value from 1 to 65,536.
Unicode has several encoding schemes, called Unicode Transformation Format (UTF),
such as UTF-8, UTF-16, and UTF-32. Enterprise COBOL uses UTF-16 (CCSID 1200)
in big-endian format as the representation for national literals and data items that
have USAGE NATIONAL.
UTF-8 represents ASCII invariant characters a-z, A-Z, 0-9, and certain special
characters such as ' @ , . + - = / * ( ) the same way that they are represented in
ASCII. UTF-16 represents these characters as NX00nn, where Xnn is the
representation of the character in ASCII.
One or more encoding units are used to represent a character from a coded
character set. For UTF-16, an encoding unit takes 2 bytes of storage. Any character
RELATED TASKS
Converting to or from national (Unicode) representation on page 137
RELATED REFERENCES
Storage of character data on page 137
Character sets and code pages (Enterprise COBOL Language Reference)
In addition, you can define national groups that contain only data items that
explicitly or implicitly have USAGE NATIONAL, and that behave in the same way as
elementary category national data items in most operations.
RELATED CONCEPTS
Unicode and the encoding of language characters on page 129
National groups on page 133
RELATED TASKS
Defining national data items
Using national literals on page 131
Using national-character figurative constants on page 132
Defining national numeric data items on page 133
Using national groups on page 134
Converting to or from national (Unicode) representation on page 137
Comparing national (UTF-16) data on page 147
RELATED REFERENCES
Storage of character data on page 137
Classes and categories of data (Enterprise COBOL Language Reference)
To define a category national data item, code a PICTURE clause that contains only
one or more PICTURE symbols N.
To define a national-edited data item, code a PICTURE clause that contains at least
one of each of the following symbols:
v Symbol N
v Simple insertion editing symbol B, 0, or /
To define a numeric-edited data item of class national, code a PICTURE clause that
defines a numeric-edited item (for example, -$999.99) and code a USAGE NATIONAL
clause. You can use a numeric-edited data item that has USAGE NATIONAL in the
same way that you use a numeric-edited item that has USAGE DISPLAY.
You can also define a data item as numeric-edited by coding the BLANK WHEN ZERO
clause for an elementary item that is defined as numeric by its PICTURE clause.
If you code a PICTURE clause but do not code a USAGE clause for data items that
contain only one or more PICTURE symbols N, you can use the compiler option
NSYMBOL(NATIONAL) to ensure that such items are treated as national data items
instead of as DBCS items.
RELATED TASKS
Displaying numeric data on page 45
RELATED REFERENCES
NSYMBOL on page 338
BLANK WHEN ZERO clause (Enterprise COBOL Language Reference)
If you compile with the option NSYMBOL(DBCS), the literal prefix character N
specifies a DBCS literal, not a national literal.
To specify a national literal as a hexadecimal value, use the prefix NX. You can use
either of these notations:
v NX"hexadecimal-digits"
v NXhexadecimal-digits
Each of the following MOVE statements sets the national data item Y to the UTF-16
value of the characters 'AB':
Do not use alphanumeric hexadecimal literals in contexts that call for national
literals, because such usage is easily misunderstood. For example, the following
statement also results in moving the UTF-16 characters 'AB' (not the hexadecimal bit
pattern C1C2) to Y, where Y is defined as USAGE NATIONAL:
Move X"C1C2" to Y
RELATED TASKS
Using literals on page 25
RELATED REFERENCES
NSYMBOL on page 338
National literals (Enterprise COBOL Language Reference)
You can use the figurative constants QUOTE, SPACE, HIGH-VALUE, LOW-VALUE, or ZERO
in a context that requires national characters, such as a MOVE statement, an implicit
move, or a relation condition that has national operands. In these contexts, the
figurative constant represents a national-character (UTF-16) value.
When you use the figurative constant HIGH-VALUE in a context that requires
national characters, its value is NXFFFF. When you use LOW-VALUE in a context
that requires national characters, its value is NX0000.
Restrictions: You must not use HIGH-VALUE or the value assigned from HIGH-VALUE
in a way that results in conversion of the value from one data representation to
another (for example, between USAGE DISPLAY and USAGE NATIONAL). XFF (the
value of HIGH-VALUE in an alphanumeric context when the EBCDIC collating
sequence is being used) does not represent a valid EBCDIC character, and NXFFFF
does not represent a valid national character. Conversion of such a value to
another representation results in a substitution character being used (not XFF or
NXFFFF). Consider the following example:
01 natl-data PIC NN Usage National.
01 alph-data PIC XX.
. . .
MOVE HIGH-VALUE TO natl-data, alph-data
IF natl-data = alph-data. . .
The IF statement above evaluates as false even though each of its operands was set
to HIGH-VALUE. Before an elementary alphanumeric operand is compared to a
national operand, the alphanumeric operand is treated as though it were moved to
a temporary national data item, and the alphanumeric characters are converted to
RELATED TASKS
Converting to or from national (Unicode) representation on page 137
Comparing national (UTF-16) data on page 147
RELATED REFERENCES
Figurative constants (Enterprise COBOL Language Reference)
DISPLAY-OF (Enterprise COBOL Language Reference)
Support for Unicode: Using Unicode Services
To define a national decimal item, code a PICTURE clause that contains only the
symbols 9, P, S, and V. If the PICTURE clause contains S, the SIGN IS SEPARATE
clause must be in effect for that item.
You can use national decimal items in the same way that you use zoned decimal
items. You can use national floating-point items in the same way that you use
display floating-point items.
RELATED TASKS
Defining numeric data on page 43
Displaying numeric data on page 45
RELATED REFERENCES
SIGN clause (Enterprise COBOL Language Reference)
National groups
National groups, which are specified either explicitly or implicitly with the
GROUP-USAGE NATIONAL clause, contain only data items that have USAGE NATIONAL. In
most cases, a national group item is processed as though it were redefined as an
elementary category national item described as PIC N(m), where m is the number
of national (UTF-16) characters in the group.
For some operations on national groups, however (just as for some operations on
alphanumeric groups), group semantics apply. Such operations (for example, MOVE
CORRESPONDING and INITIALIZE) recognize or process the elementary items within
the national group.
Where possible, use national groups instead of alphanumeric groups that contain
USAGE NATIONAL items. National groups provide several advantages for the
processing of national data compared to the processing of national data within
alphanumeric groups:
v When you move a national group to a longer data item that has USAGE NATIONAL,
the receiving item is padded with national characters. By contrast, if you move
an alphanumeric group that contains national characters to a longer
USAGE NATIONAL groups: A group item can specify the USAGE NATIONAL clause at the
group level as a convenient shorthand for the USAGE of each of the elementary data
items within the group. Such a group is not a national group, however, but an
alphanumeric group, and behaves in many operations, such as moves and
compares, like an elementary data item of USAGE DISPLAY (except that no editing or
conversion of data occurs).
RELATED TASKS
Assigning values to group data items (MOVE) on page 33
Joining data items (STRING) on page 105
Splitting data items (UNSTRING) on page 107
Tallying and replacing data items (INSPECT) on page 115
Using national groups
RELATED REFERENCES
GROUP-USAGE clause (Enterprise COBOL Language Reference)
The following data description entry specifies that a level-01 group and its
subordinate groups are national group items:
01 Nat-Group-1 GROUP-USAGE NATIONAL.
02 Group-1.
04 Month PIC 99.
04 DayOf PIC 99.
04 Year PIC 9999.
02 Group-2 GROUP-USAGE NATIONAL.
04 Amount PIC 9(4).99 USAGE NATIONAL.
In the example above, Alpha-Group-1 and Group-1 are alphanumeric groups; USAGE
DISPLAY is implied for the subordinate items in Group-1. (If Alpha-Group-1 specified
USAGE NATIONAL at the group level, USAGE NATIONAL would be implied for each of
the subordinate items in Group-1. However, Alpha-Group-1 and Group-1 would be
alphanumeric groups, not national groups, and would behave like alphanumeric
groups during operations such as moves and compares.) Group-2 is a national
group, and USAGE NATIONAL is implied for the numeric-edited item Amount.
RELATED CONCEPTS
National groups on page 133
RELATED TASKS
Using national groups as elementary items
Using national groups as group items on page 136
RELATED REFERENCES
GROUP-USAGE clause (Enterprise COBOL Language Reference)
RELATED TASKS
Assigning values to group data items (MOVE) on page 33
Comparing national data and alphanumeric-group operands on page 149
Using national groups as group items
RELATED REFERENCES
MOVE statement (Enterprise COBOL Language Reference)
In the following example, an INITIALIZE statement that acts upon national group
item Group-OneN causes the value 15 in national characters to be moved to only the
numeric items in the group:
01 Group-OneN Group-Usage National.
05 Trans-codeN Pic N Value "A".
05 Part-numberN Pic NN Value "XX".
05 Trans-quanN Pic 99 Value 10.
. . .
Initialize Group-OneN Replacing Numeric Data By 15
The table below summarizes the cases where national groups are processed with
group semantics.
Table 17. National group items that are processed with group semantics
Language feature Uses of national group items Comment
CORRESPONDING phrase Specify a national group item for Elementary items within the
of the ADD, SUBTRACT, processing as a group in national group are processed
or MOVE statement accordance with the rules of the like elementary items that
CORRESPONDING phrase. have USAGE NATIONAL within
an alphanumeric group.
Host variable in EXEC Specify a national group item as a The national group item is in
SQL statement host variable. effect shorthand for the set of
host variables that are
subordinate to the group item.
INITIALIZE statement Specify a national group for Elementary items within the
processing as a group in national group are initialized
accordance with the rules of the like elementary items that
INITIALIZE statement. have USAGE NATIONAL within
an alphanumeric group.
Name qualification Use the name of a national group Follow the same rules for
item to qualify the names of qualification as for an
elementary data items and of alphanumeric group.
subordinate group items in the
national group.
RELATED TASKS
Initializing a structure (INITIALIZE) on page 30
Initializing a table (INITIALIZE) on page 73
Assigning values to elementary data items (MOVE) on page 32
Assigning values to group data items (MOVE) on page 33
Finding the length of data items on page 122
Generating XML output on page 561
Using national group items in SQL statements on page 434
RELATED REFERENCES
Qualification (Enterprise COBOL Language Reference)
RENAMES clause (Enterprise COBOL Language Reference)
1. Use the CODEPAGE compiler option to specify the EBCDIC code page that is applicable to
alphanumeric or DBCS data.
2. Most characters are represented in UTF-16 using one encoding unit. In particular, the
following characters are represented using a single UTF-16 encoding unit per character:
v COBOL characters A-Z, a-z, 0-9, space, + - * / = $ , ; . " ( ) > < :'
v All characters that are converted from an EBCDIC or ASCII code page
RELATED CONCEPTS
Unicode and the encoding of language characters on page 129
You can explicitly convert to and from national data items by using the intrinsic
functions NATIONAL-OF and DISPLAY-OF, respectively. By using these intrinsic
functions, you can specify a code page for the conversion that is different from the
code page that is in effect with the CODEPAGE compiler option.
RELATED TASKS
Converting alphanumeric, DBCS, and integer to national (MOVE)
Converting alphanumeric or DBCS to national (NATIONAL-OF) on page 139
Converting national to alphanumeric (DISPLAY-OF) on page 139
Overriding the default code page on page 140
Comparing national (UTF-16) data on page 147
RELATED REFERENCES
CODEPAGE on page 313
Conversion exceptions on page 140
You can move the following kinds of data to category national or national-edited
data items, and thus convert the data to national representation:
v Alphabetic
v Alphanumeric
v Alphanumeric-edited
v DBCS
v Integer of USAGE DISPLAY
v Numeric-edited of USAGE DISPLAY
You can likewise move the following kinds of data to numeric-edited data items
that have USAGE NATIONAL:
v Alphanumeric
v Display floating-point (floating-point of USAGE DISPLAY)
v Numeric-edited of USAGE DISPLAY
v Integer of USAGE DISPLAY
For complete rules about moves to national data, see the related reference about
the MOVE statement.
For example, the MOVE statement below moves the alphanumeric literal "AB" to the
national data item UTF16-Data:
01 UTF16-Data Pic N(2) Usage National.
. . .
Move "AB" to UTF16-Data
After the MOVE statement above, UTF16-Data contains NX00410042, the national
representation of the alphanumeric characters 'AB'.
RELATED TASKS
Assigning values to elementary data items (MOVE) on page 32
Assigning values to group data items (MOVE) on page 33
Displaying numeric data on page 45
Coding for use of DBCS support on page 150
RELATED REFERENCES
MOVE statement (Enterprise COBOL Language Reference)
RELATED TASKS
Processing UTF-8 data on page 141
Processing Chinese GB 18030 data on page 146
Processing alphanumeric data items that contain DBCS data on page 152
RELATED REFERENCES
CODEPAGE on page 313
NATIONAL-OF (Enterprise COBOL Language Reference)
If you omit the second argument, the output code page is the one that was in
effect with the CODEPAGE compiler option when the source was compiled.
If you specify an EBCDIC or ASCII code page that combines single-byte character
set (SBCS) and DBCS characters, the returned string might contain a mixture of
SBCS and DBCS characters. The DBCS substrings are delimited by shift-in and
shift-out characters if the code page in effect for the function is an EBCDIC code
page.
RELATED TASKS
Processing UTF-8 data on page 141
Processing Chinese GB 18030 data on page 146
RELATED REFERENCES
DISPLAY-OF (Enterprise COBOL Language Reference)
If you specify a code page as an argument to the DISPLAY-OF intrinsic function, and
the code page differs from the code page that is in effect with the CODEPAGE
compiler option, do not use the function result in any operations that involve
implicit conversion (such as an assignment to, or comparison with, a national data
item). Such operations assume the EBCDIC code page that is specified with the
CODEPAGE compiler option.
RELATED REFERENCES
CODEPAGE on page 313
Conversion exceptions
Implicit or explicit conversion between national data and alphanumeric data can
fail and generate a severity-3 Language Environment condition.
Failure can occur if the code page that you specified implicitly or explicitly is not a
valid code page.
A character that does not have a counterpart in the target CCSID does not result in
a conversion exception. Such a character is converted to a substitution character in
the target code page.
RELATED REFERENCES
CODEPAGE on page 313
The example above works correctly because the input code page is specified.
Data-in-Greek is converted as data represented in CCSID 00875 (Greek). However,
the following statement results in an incorrect conversion unless all the characters
in the item happen to be among those that have a common representation in both
the Greek and the English code pages:
Move Data-in-Greek to Data-in-Unicode
If you can correctly set the CODEPAGE compiler option to CCSID 00875 (that is, the
rest of your program also handles EBCDIC data in Greek), you can code the same
example correctly as follows:
CBL CODEPAGE(00875)
* . . .
01 Data-in-Unicode pic N(100) usage national.
01 Data-in-Greek pic X(100).
* . . .
Read Greek-file into Data-in-Greek
* . . . process Data-in-Greek here ...
* . . . or do the following (if need to process data in Unicode):
Move Data-in-Greek to Data-in-Unicode
* . . . process Data-in-Unicode
Move function Display-of(Data-in-Unicode) to Data-in-Greek
Write Greek-record from Data-in-Greek
National data is encoded in UTF-16, which uses one encoding unit for almost all
commonly encountered characters. With this property, you can use string
operations such as reference modification on the national data. If it is more
convenient to retain the UTF-8 encoding, use the Unicode intrinsic functions to
assist with processing the data. For details, see Using intrinsic functions to
process UTF-8 encoded data on page 142.
Usage note: Use care if you use reference modification to refer to data encoded in
UTF-8. UTF-8 characters are encoded with a varying number of bytes per
character. Avoid operations that might split a multibyte character.
RELATED TASKS
Referring to substrings of data items on page 111
Converting to or from national (Unicode) representation on page 137
Parsing XML documents encoded in UTF-8 on page 541
Using intrinsic functions to process UTF-8 encoded data on page 142
The following code fragment illustrates UTF-8 validity checking, and the use of the
auxiliary functions:
checkUTF-8-validity.
Compute u = function UVALID(UTF-8-testStr)
If u not = 0
Display checkUTF-8-validity failure:
Display The UTF-8 representation is not valid,
starting at byte u .
Compute v = function ULENGTH(UTF-8-testStr(1:u - 1))
Compute u = function UPOS(UTF-8-testStr v)
Compute w = function UWIDTH(UTF-8-testStr v)
Display The v th and last valid code point starts
at byte u for w bytes.
End-if.
In the following string, the sequence that starts with x'F5' is not valid UTF-8
because no byte can have a value in the range x'F5' to x'FF':
x6162D0B0E4BA8CF5646364
The following code fragment illustrates checking for the presence of a Unicode
supplementary code point, requiring a 4-byte representation in UTF-8:
RELATED REFERENCES
CODEPAGE on page 313
GB 18030 characters can be encoded in either UTF-16 or in code page CCSID 1392.
Code page 1392 is an ASCII multibyte code page that uses 1, 2, or 4 bytes per
character. A subset of the GB 18030 characters can be encoded in the Chinese ASCII
code page, CCSID 1386, or in the Chinese EBCDIC code page, CCSID 1388.
Enterprise COBOL does not have explicit support for GB 18030, but does support
the processing of GB 18030 characters in several ways. You can:
When you need to process Chinese GB 18030 data that requires conversion, first
convert the input data to UTF-16 in a national data item. After you process the
national data item, convert it back to Chinese GB 18030 for output. For the
conversions, use the intrinsic functions NATIONAL-OF and DISPLAY-OF, respectively,
and specify code page 1388 or 1392 as the second argument of each function.
RELATED TASKS
Converting to or from national (Unicode) representation on page 137
Coding for use of DBCS support on page 150
RELATED REFERENCES
Storage of character data on page 137
You can code conditional expressions that use national data in the following
statements:
v EVALUATE
v IF
v INSPECT
v PERFORM
v SEARCH
v STRING
v UNSTRING
For full details about comparing national data items to other data items, see the
related references.
RELATED TASKS
Comparing two class national operands on page 148
Comparing class national and class numeric operands on page 148
Comparing national numeric and other numeric operands on page 149
RELATED REFERENCES
Relation conditions (Enterprise COBOL Language Reference)
General relation conditions (Enterprise COBOL Language Reference)
National comparisons (Enterprise COBOL Language Reference)
Group comparisons (Enterprise COBOL Language Reference)
Either operand (or both) can be any of the following types of items:
v A national group
v An elementary category national or national-edited data item
v A numeric-edited data item that has USAGE NATIONAL
When you compare two class national operands that have the same length, they
are determined to be equal if all pairs of the corresponding characters are equal.
Otherwise, comparison of the binary values of the first pair of unequal characters
determines the operand with the larger binary value.
When you compare operands that have unequal lengths, the shorter operand is
treated as if it were padded on the right with default UTF-16 space characters
(NX0020) to the length of the longer operand.
The PROGRAM COLLATING SEQUENCE clause does not affect the comparison of two
class national operands.
RELATED CONCEPTS
National groups on page 133
RELATED TASKS
Using national groups on page 134
RELATED REFERENCES
National comparisons (Enterprise COBOL Language Reference)
You can also compare national literals or class national data items to floating-point
data items (that is, display floating-point or national floating-point items).
Numeric operands are converted to national (UTF-16) representation if they are not
already in national representation. A comparison is made of the national character
values of the operands.
You can compare the algebraic values of numeric operands regardless of their
USAGE. Thus you can compare a national decimal item or a national floating-point
item with a binary item, an internal-decimal item, a zoned decimal item, a display
floating-point item, or any other numeric item.
RELATED TASKS
Defining national numeric data items on page 133
RELATED REFERENCES
General relation conditions (Enterprise COBOL Language Reference)
These operands are treated as if they were moved to an elementary national data
item. The characters are converted to national (UTF-16) representation, and the
comparison proceeds with two national character operands.
RELATED TASKS
Using national-character figurative constants on page 132
RELATED REFERENCES
National comparisons (Enterprise COBOL Language Reference)
When the IF statement above is executed, the 10 bytes of the national literal
N"AB123" are compared byte by byte to the content of Group-XN. The items compare
equally, and "EQUAL" is displayed.
RELATED TASKS
| Defining DBCS data
Using DBCS literals
Testing for valid DBCS characters on page 151
Processing alphanumeric data items that contain DBCS data on page 152
Appendix B, Converting double-byte character set (DBCS) data, on page 685
RELATED REFERENCES
DBCS on page 318
You can specify a DBCS data item by using the USAGE DISPLAY-1 clause. When you
use PICTURE symbol G, you must specify USAGE DISPLAY-1. When you use PICTURE
symbol N but omit the USAGE clause, USAGE DISPLAY-1 or USAGE NATIONAL is implied
depending on the setting of the NSYMBOL compiler option.
| If you use a VALUE clause with the USAGE clause in the definition of a DBCS item,
you must specify a DBCS literal or the figurative constant SPACE or SPACES.
For the purpose of handling reference modifications, each character in a DBCS data
item is considered to occupy the number of bytes that corresponds to the
code-page width (that is, 2).
RELATED REFERENCES
NSYMBOL on page 338
That is, you can specify a DBCS literal in either of these ways:
v Ndbcs characters (provided that the compiler option NSYMBOL(DBCS) is in effect)
v Gdbcs characters
The shift-out (SO) control character X0E must immediately follow the opening
delimiter, and the shift-in (SI) control character X0F must immediately precede
the closing delimiter.
In addition to DBCS literals, you can use alphanumeric literals to specify any
character in one of the supported code pages. However, any string of DBCS
characters that is within an alphanumeric literal must be delimited by the SO and
SI characters, and the DBCS compiler option must be in effect for the SO and SI
characters to be recognized as shift codes.
You cannot continue an alphanumeric literal that contains DBCS characters. The
length of a DBCS literal is likewise limited by the available space in Area B on a
single source line. The maximum length of a DBCS literal is thus 28 double-byte
characters.
RELATED TASKS
Using figurative constants on page 26
RELATED REFERENCES
DBCS on page 318
NSYMBOL on page 338
QUOTE/APOST on page 348
DBCS literals (Enterprise COBOL Language Reference)
The Kanji class test is done by checking characters for the range X41 through
X7E in the first byte and X41 through XFE in the second byte, plus the space
character X4040.
The DBCS class test tests for valid graphic characters for the code page.
The DBCS class test is done by checking characters for the range X41 through
XFE in both the first and second byte of each character, plus the space character
X4040.
RELATED TASKS
Coding conditional expressions on page 98
RELATED REFERENCES
Class condition (Enterprise COBOL Language Reference)
RELATED TASKS
Joining data items (STRING) on page 105
Splitting data items (UNSTRING) on page 107
Referring to substrings of data items on page 111
Converting to or from national (Unicode) representation on page 137
The source of the information and the target for the results can be one or more of
the following items:
v Another program
v Direct-access storage device
v Magnetic tape
v Printer
v Terminal
v Card reader or punch
Your COBOL program does not directly handle physical records. It processes
logical records. A logical record can correspond to a complete physical record, part
of a physical record, or to parts or all of one or more physical records. Your
COBOL program handles logical records exactly as you have defined them.
RELATED CONCEPTS
File organization and input-output devices
RELATED TASKS
Choosing file organization and access mode on page 155
Allocating files on page 157
Checking for input or output errors on page 158
With IBM Enterprise COBOL for z/OS, requests to the operating system for the
storage and retrieval of records from input-output devices are handled by the two
access methods QSAM and VSAM, and the z/OS UNIX file system.
The device type upon which you elect to store your data could affect the choices of
file organization available to you. Direct-access storage devices provide greater
flexibility in the file organization options. Sequential-only devices limit
organization options but have other characteristics, such as the portability of tapes,
that might be useful.
Sequential-only devices
Terminals, printers, card readers, and punches are called unit-record devices
because they process one line at a time. Therefore, you must also process
records one at a time sequentially in your program when it reads from or
writes to unit-record devices.
On tape, records are ordered sequentially, so your program must process
them sequentially. Use QSAM physical sequential files when processing
tape files. The records on tape can be fixed length or variable length.
Direct-access storage devices
Direct-access storage devices hold many records. The record arrangement
of files stored on these devices determines the ways that your program can
process the data. When using direct-access devices, you have greater
flexibility within your program, because your can use several types of file
organization:
v Sequential (VSAM or QSAM)
v Line sequential (z/OS UNIX)
RELATED TASKS
Allocating files on page 157
Chapter 9, Processing QSAM files, on page 159
Chapter 10, Processing VSAM files, on page 185
Chapter 11, Processing line-sequential files, on page 213
Choosing file organization and access mode
1. The data itself is in variable format but can be read into and written from COBOL
fixed-length records.
RELATED REFERENCES
Format for coding input and output on page 156
Control characters in line-sequential files on page 214
RELATED TASKS
Chapter 9, Processing QSAM files, on page 159
Chapter 10, Processing VSAM files, on page 185
Chapter 11, Processing line-sequential files, on page 213
Allocating files
For any type of file (sequential, line sequential, indexed, or relative) in your z/OS
or z/OS UNIX applications, you can define the external name with either a
ddname or an environment-variable name. The external name is the name in the
assignment-name of the ASSIGN clause.
If the file is in the z/OS UNIX file system, you can use either a DD definition or an
environment variable to define the file by specifying its path name with the PATH
keyword.
The environment-variable name must be uppercase. The allowable attributes for its
value depend on the organization of the file being defined.
Because you can define the external name in either of two ways, the COBOL run
time goes through the following steps to find the definition of the file:
1. If the ddname is explicitly allocated, it is used. The definition can be from a DD
statement in JCL, an ALLOCATE command from TSO/E, or a user-initiated
dynamic allocation.
2. If the ddname is not explicitly allocated and an environment variable of the
same name is set, the value of the environment variable is used.
The file is dynamically allocated using the attributes specified by the
environment variable. At a minimum, you must specify either the PATH() or
DSN() option. All options and attributes must be in uppercase, except for the
path-name suboption of the PATH option, which is case sensitive. You cannot
specify a temporary data-set name in the DSN() option.
File status code 98 results from any of the following cases:
v The contents (including a value of null or all blanks) of the environment
variable are not valid.
v The dynamic allocation of the file fails.
v The dynamic deallocation of the file fails.
The COBOL run time deallocates all dynamic allocations at run unit termination,
except for implicit CBLQDA allocations.
RELATED TASKS
Setting and accessing environment variables on page 454
Defining and allocating QSAM files on page 174
Dynamically creating QSAM files on page 171
Allocating VSAM files on page 206
Using a FILE STATUS clause, test the file status key after each input or output
statement, and call an error-handling procedure if a nonzero file status code is
returned. With VSAM files, you can use a second data item in the FILE STATUS
clause to get additional VSAM status code information.
Another way of handling errors in input and output operations is to code ERROR
(synonymous with EXCEPTION) declaratives.
RELATED TASKS
Handling errors in input and output operations on page 241
Coding ERROR declaratives on page 244
Using file status keys on page 245
Your program can process these files only sequentially, retrieving (with the READ
statement) records in the same order as they are in the file. Each record is placed
after the preceding record. To process QSAM files in your program, use COBOL
language statements that:
v Identify and describe the QSAM files in the ENVIRONMENT DIVISION and the DATA
DIVISION.
v Process the records in these files in the PROCEDURE DIVISION.
After you have created a record, you cannot change its length or its position in the
file, and you cannot delete it. You can, however, update QSAM files on
direct-access storage devices (using REWRITE), though not in the z/OS UNIX file
system.
You can also access byte-stream files in the z/OS UNIX file system using QSAM.
These files are binary byte-oriented sequential files with no record structure. The
record definitions that you code in your COBOL program and the length of the
variables that you read into and write from determine the amount of data
transferred.
RELATED CONCEPTS
z/OS DFSMS: Using Data Sets (Access methods)
RELATED TASKS
Defining QSAM files and records in COBOL
Coding input and output statements for QSAM files on page 170
Handling errors in QSAM files on page 174
Working with QSAM files on page 174
Accessing z/OS UNIX files using QSAM on page 181
Processing QSAM ASCII files on tape on page 182
RELATED TASKS
Establishing record formats
Setting block sizes on page 167
You can code a record format of F, V, S, or U in the RECORDING MODE clause. COBOL
determines the record format from the RECORD clause or from the record
descriptions associated with the FD entry for the file. If you want the records to be
blocked, code the BLOCK CONTAINS clause in the FD entry.
The following example shows how the FD entry might look for a file that has
fixed-length records:
FILE SECTION.
FD COMMUTER-FILE-MST
RECORDING MODE IS F
BLOCK CONTAINS 0 RECORDS
RECORD CONTAINS 80 CHARACTERS.
01 COMMUTER-RECORD-MST.
05 COMMUTER-NUMBER PIC X(16).
05 COMMUTER-DESCRIPTION PIC X(64).
A recording mode of S is not supported for files in the z/OS UNIX file system. The
above example is appropriate for such a file.
RELATED CONCEPTS
Logical records
RELATED TASKS
Requesting fixed-length format on page 161
Requesting variable-length format on page 162
Requesting spanned format on page 164
Requesting undefined format on page 166
Defining QSAM files and records in COBOL on page 159
RELATED REFERENCES
FILE SECTION entries on page 12
Logical records
COBOL uses the term logical record in a slightly different way than z/OS QSAM.
For format-V and format-S files, a QSAM logical record includes a 4-byte prefix in
front of the user data portion of the record that is not included in the definition of
a COBOL logical record.
For format-F and format-U files, and for byte-stream files in the z/OS UNIX file
system, the definitions of QSAM logical record and COBOL logical record are
identical.
RELATED REFERENCES
Layout of format-F records on page 162
Layout of format-V records on page 163
Layout of format-S records on page 166
Layout of format-U records on page 167
You can omit the RECORDING MODE clause. The compiler determines the recording
mode to be F if the length of the largest level-01 record associated with the file is
not greater than the block size coded in the BLOCK CONTAINS clause, and you take
one of the following actions:
v Use the RECORD CONTAINS integer clause (format-1 RECORD clause) to indicate the
length of the record in bytes.
When you use this clause, the file is always fixed format with record length
integer even if there are multiple level-01 record description entries with different
lengths associated with the file.
v Omit the RECORD CONTAINS integer clause, but code the same fixed size and no
OCCURS DEPENDING ON clause for all level-01 record description entries associated
with the file. This fixed size is the record length.
In an unblocked format-F file, the logical record is the same as the block.
In a blocked format-F file, the number of logical records in a block (the blocking
factor) is constant for every block in the file except the last block, which might be
shorter.
RELATED CONCEPTS
Logical records on page 160
RELATED TASKS
Requesting variable-length format on page 162
Requesting spanned format on page 164
Requesting undefined format on page 166
Establishing record formats on page 160
RELATED REFERENCES
Layout of format-F records on page 162
RELATED CONCEPTS
Logical records on page 160
RELATED TASKS
Requesting fixed-length format on page 161
z/OS DFSMS: Using Data Sets (Fixed-length record formats)
RELATED REFERENCES
Layout of format-V records on page 163
Layout of format-S records on page 166
Layout of format-U records on page 167
Use RECORDING MODE V for both. You can omit the RECORDING MODE clause. The
compiler determines the recording mode to be V if the largest level-01 record
associated with the file is not greater than the block size set in the BLOCK CONTAINS
clause, and you take one of the following actions:
v Use the RECORD IS VARYING clause (format-3 RECORD clause).
If you provide values for integer-1 and integer-2 (RECORD IS VARYING FROM
integer-1 TO integer-2), the maximum record length is the value coded for integer-2
regardless of the lengths coded in the level-01 record description entries
associated with the file. The integer sizes indicate the minimum and maximum
record lengths in numbers of bytes regardless of the USAGE of the data items in
the record.
If you omit integer-1 and integer-2, the maximum record length is determined to
be the size of the largest level-01 record description entry associated with the
file.
v Use the RECORD CONTAINS integer-1 TO integer-2 clause (format-2 RECORD clause).
Make integer-1 and integer-2 match the minimum length and the maximum
length in bytes of the level-01 record description entries associated with the file.
The maximum record length is the integer-2 value.
v Omit the RECORD clause, but code multiple level-01 records (associated with the
file) that are of different sizes or contain an OCCURS DEPENDING ON clause.
The maximum record length is determined to be the size of the largest level-01
record description entry associated with the file.
When you specify a READ statement for a format-V file followed by a MOVE of the
level-01 record, the actual record length is not used. The program will attempt to
move the number of bytes described by the level-01 record description. If this
number exceeds the actual record length and extends outside the area addressable
by the program, results are unpredictable. If the number of bytes described by the
level-01 record description is shorter than the physical record read, truncation of
bytes beyond the level-01 description occurs. To find the actual length of a
variable-length record, specify data-name-1 in format 3 of the RECORD clause of the
File Definition (FD).
RELATED TASKS
Requesting fixed-length format on page 161
Requesting spanned format on page 164
Requesting undefined format on page 166
Establishing record formats on page 160
RELATED REFERENCES
FILE SECTION entries on page 12
Layout of format-V records
Enterprise COBOL Migration Guide (Moving from the
VS COBOL II run time)
Format-V QSAM records have control fields that precede the data. The QSAM
logical record length is determined by adding 4 bytes (for the control fields) to the
record length defined in your program. However, you must not include these 4
bytes in the description of the record and record length.
Block Size
QSAM Logical Record
Data Record
(Level -01 Record)
4 4 Variable 4 Variable
bytes bytes bytes bytes bytes
LL BB ll bb Data ll bb Data
'CC' 'cc' 'cc'
The operating system provides the control bytes when the file is written; the
control byte fields do not appear in the description of the logical record in the DATA
DIVISION of your program. COBOL allocates input and output buffers that are
large enough to accommodate the control bytes. These control fields in the buffer
are not available for you to use in your program. When variable-length records are
written on unit record devices, control bytes are neither printed nor punched. They
appear however on other external storage devices, as well as in buffer areas of
storage. If you move V-mode records from an input buffer to a WORKING-STORAGE
area, the records will be moved without the control bytes.
RELATED CONCEPTS
Logical records on page 160
RELATED TASKS
Requesting variable-length format on page 162
RELATED REFERENCES
Layout of format-F records on page 162
Layout of format-S records on page 166
Layout of format-U records on page 167
You can code RECORDING MODE S for spanned records in QSAM files that are
assigned to magnetic tape or to direct access devices. Do not request spanned
records for files in the z/OS UNIX file system. You can omit the RECORDING MODE
clause. The compiler determines the recording mode to be S if the maximum
record length (in bytes) plus 4 is greater than the block size set in the BLOCK
CONTAINS clause.
For files with format S in your program, the compiler determines the maximum
record length with the same rules as are used for format V. The length is based on
your usage of the RECORD clause.
When creating files that contain format-S records and a record is larger than the
remaining space in a block, COBOL writes a segment of the record to fill the block.
The rest of the record is stored in the next block or blocks depending on its length.
COBOL supports QSAM spanned records up to 32,760 bytes in length.
When retrieving files that have format-S records, a program can retrieve only
complete records.
Benefits of format-S files: You can efficiently use external storage and still
organize your files with logical record lengths by defining files with format-S
records:
Format-S files and READ INTO: When you specify a READ INTO statement for a
format-S file, the compiler generates a MOVE statement that uses the size of the
record that it just read for that file. If the record just read does not correspond to
the level-01 record description, you might not get the result that you expect. All
other rules of the MOVE statement apply.
RELATED CONCEPTS
Logical records on page 160
Spanned blocked and unblocked files
RELATED TASKS
Requesting fixed-length format on page 161
Requesting variable-length format on page 162
Requesting undefined format on page 166
Establishing record formats on page 160
RELATED REFERENCES
FILE SECTION entries on page 12
Layout of format-S records on page 166
A spanned blocked QSAM file is made up of blocks, each containing one or more
logical records or segments of logical records. A spanned unblocked file is made
up of physical blocks, each containing one logical record or one segment of a
logical record.
In a spanned blocked file, a logical record can be either fixed or variable in length,
and its size can be smaller than, equal to, or larger than the physical block size.
There are no required relationships between logical records and physical block
sizes.
In a spanned unblocked file, the logical records can be either fixed or variable in
length. When the physical block contains one logical record, the block length is
determined by the logical record size. When a logical record has to be segmented,
the system always writes the largest physical block possible. The system segments
the logical record when the entire logical record cannot fit on a track.
RELATED CONCEPTS
Logical records on page 160
RELATED TASKS
Requesting spanned format on page 164
Each block is preceded by a 4-byte block descriptor field ('BDF' in the image
above). There is only one block descriptor field at the beginning of each physical
block.
You do not describe these fields in the DATA DIVISION, and the fields are not
available for you to use in your COBOL program.
RELATED TASKS
Requesting spanned format on page 164
RELATED REFERENCES
Layout of format-F records on page 162
Layout of format-V records on page 163
Layout of format-U records on page 167
When you use format-U files, each block of storage is one logical record. A read of
a format-U file returns the entire block as a record. A write to a format-U file
writes a record out as a block. The compiler determines the recording mode to be
U only if you code RECORDING MODE U.
It is recommended that you not use format U to update or extend a file that was
written with a different record format. If you use format U to update a file that
was written with a different format, the RECFM value in the data-set label could be
changed or the data set could contain records written in different formats.
The record length is determined in your program based on how you use the
RECORD clause:
v If you use the RECORD CONTAINS integer clause (format-1 RECORD clause), the record
length is the integer value regardless of the lengths of the level-01 record
description entries associated with the file. The integer size indicates the number
of bytes in a record regardless of the USAGE of its data items.
v If you use the RECORD IS VARYING clause (format-3 RECORD clause), the record
length is determined based on whether you code integer-1 and integer-2.
If you code integer-1 and integer-2 (RECORD IS VARYING FROM integer-1 TO
integer-2), the maximum record length is the integer-2 value regardless of the
lengths of the level-01 record description entries associated with the file. The
Format-U files and READ INTO: When you specify a READ INTO statement for a
format-U file, the compiler generates a MOVE statement that uses the size of the
record that it just read for that file. If the record just read does not correspond to
the level-01 record description, you might not get the result that you expect. All
other rules of the MOVE statement apply.
RELATED TASKS
Requesting fixed-length format on page 161
Requesting variable-length format on page 162
Requesting spanned format on page 164
Establishing record formats on page 160
RELATED REFERENCES
FILE SECTION entries on page 12
Layout of format-U records
With format-U, each block of external storage is handled as a logical record. There
are no record-length or block-length fields.
RELATED CONCEPTS
Logical records on page 160
RELATED TASKS
Requesting undefined format on page 166
RELATED REFERENCES
Layout of format-F records on page 162
Layout of format-V records on page 163
Layout of format-S records on page 166
If you set the block size explicitly in the BLOCK CONTAINS clause, the size must not
be greater than the maximum block size for the device. If you specify the
CHARACTERS phrase of the BLOCK CONTAINS clause, size must indicate the number of
bytes in a record regardless of the USAGE of the data items in the record. The block
size that is set for a format-F file must be an integral multiple of the record length.
If your program uses QSAM files on tape, use a physical block size of at least 12 to
18 bytes. Otherwise, the block will be skipped over when a parity check occurs
during one of the following actions:
v Reading a block of records of fewer than 12 bytes
v Writing a block of records of fewer than 18 bytes
Larger blocks generally give you better performance. Blocks of only a few kilobytes
are particularly inefficient; you should choose a block size of at least tens of
kilobytes. If you specify record blocking and omit the block size, the system will
pick a block size that is optimal for device utilization and for data transfer speed.
Letting z/OS determine block size: To maximize performance, do not explicitly set
the block size for a blocked file in your COBOL source program. For new blocked
data sets, it is simpler to allow z/OS to supply a system-determined block size. To
use this feature, follow these guidelines:
v Code BLOCK CONTAINS 0 in your source program or compile with the BLOCK0
option. For details about BLOCK0, see BLOCK0 on page 310.
v Do not code RECORD CONTAINS 0 in your source program.
v Do not code a BLKSIZE value in the JCL DD statement.
Setting block size explicitly: If you prefer to set a block size explicitly, your
program will be most flexible if you follow these guidelines:
v Code BLOCK CONTAINS 0 in your source program.
v Code a BLKSIZE value in the ddname definition (the JCL DD statement).
For extended-format data sets on z/OS, z/OS DFSMS adds a 32-byte block suffix
to the physical record. If you specify a block size explicitly (using JCL or ISPF), do
not include the size of this block suffix in the block size. This block suffix is not
available for you to use in your program. z/OS DFSMS allocates the space used to
read in the block suffix. However, when you calculate how many blocks of an
extended-format data set will fit on a track of a direct-access device, you need to
include the size of the block suffix in the block size.
If you specify a block size that is larger than 32760 directly in the BLOCK CONTAINS
clause or indirectly with the use of BLOCK CONTAINS n RECORDS, the OPEN of the data
set fails with file status code 90 unless you define the data set to be on tape.
When you omit the BLKSIZE from the ddname definition, the block size is
automatically obtained by the system from the data-set label.
The LBI is not used in all cases. An attempt to use a block size greater than 32760
in the following cases is diagnosed at compile time or results in a failure at OPEN:
v Spanned records
v OPEN I-O
Using a block size that exceeds 32760 might result in your not being able to read
the tape on another system. A tape that you create with a block size greater than
32760 can be read only on a system that has a tape device that supports block sizes
greater than 32760. If you specify a block size that is too large for the file, the
device, or the operating system level, a runtime message is issued.
The block-size limit is the first nonzero value that the compiler finds by checking
these items.
If no BLKSIZE or BLKSZLIM value is available from any source, the system limits
BLKSIZE to 32760. You can then enable block sizes larger than 32760 in one of two
ways:
v Specify a BLKSZLIM value greater than 32760 in the DD statement for the file and
use BLOCK CONTAINS 0 in your COBOL source.
v Specify a value greater than 32760 for the BLKSIZE in the DD statement or in the
BLOCK CONTAINS clause in your COBOL source.
BLKSZLIM is device-independent.
Block size and the DCB RECFM subparameter: Under z/OS, you can code the S
or T option in the DCB RECFM subparameter:
v Use the S (standard) option in the DCB RECFM subparameter for a format-F record
with only standard blocks (ones that have no truncated blocks or unfilled tracks
in the file, except for the last block of the file). S is also supported for records on
tape. It is ignored if the records are not on DASD or tape.
Using this standard block option might improve input-output performance,
especially for direct-access devices.
v The T (track overflow) option for QSAM files is no longer useful.
RELATED TASKS
Defining QSAM files and records in COBOL on page 159
z/OS DFSMS: Using Data Sets
RELATED TASKS
Opening QSAM files
Dynamically creating QSAM files on page 171
Adding records to QSAM files on page 172
Updating QSAM files on page 172
Writing QSAM files to a printer or spooled data set on page 172
Closing QSAM files on page 173
RELATED REFERENCES
OPEN statement (Enterprise COBOL Language Reference)
READ statement (Enterprise COBOL Language Reference)
WRITE statement (Enterprise COBOL Language Reference)
REWRITE statement (Enterprise COBOL Language Reference)
CLOSE statement (Enterprise COBOL Language Reference)
File status key (Enterprise COBOL Language Reference)
Code CLOSE WITH LOCK so that the file cannot be opened again while the program
is running.
Use the REVERSED option of the OPEN statement to process tape files in reverse order.
The file is positioned at the end, and READ statements read the data records in
reverse order, starting with the last record. The REVERSED option is supported only
for files that have fixed-length records.
RELATED TASKS
Dynamically creating QSAM files
Ensuring that file attributes match your program on page 178
RELATED REFERENCES
OPEN statement (Enterprise COBOL Language Reference)
The QSAM file is implicitly created if you use the runtime option CBLQDA and one
of the following circumstances exists:
v An optional file is being opened as EXTEND or I-O.
Optional files are files that are not necessarily available each time the program is
run. You define a file that is being opened in INPUT, I-O, or EXTEND mode as
optional by coding the SELECT OPTIONAL clause in the FILE-CONTROL paragraph.
v The file is being opened for OUTPUT, regardless of the OPTIONAL phrase.
The file is allocated with the system default attributes established at your
installation and the attributes coded in the SELECT clause and FD entry in your
program.
Do not confuse this implicit allocation mechanism with the explicit dynamic
allocation of files by means of environment variables. Explicit dynamic allocation
requires that a valid environment variable be set. CBLQDA support is used only
when the QSAM file is unavailable as defined above, which includes no valid
environment variable being set.
RELATED TASKS
Opening QSAM files on page 170
To add records to a file opened as I-O, you must first close the file and open it as
EXTEND.
RELATED REFERENCES
READ statement (Enterprise COBOL Language Reference)
WRITE statement (Enterprise COBOL Language Reference)
Replace an existing record with another record of the same length by doing these
steps:
1. Open the file as I-O.
2. Use REWRITE to update an existing record. (The last file processing statement
before REWRITE must have been a successful READ statement.)
You cannot open as I-O an extended format data set that you allocate in
compressed format.
RELATED REFERENCES
REWRITE statement (Enterprise COBOL Language Reference)
Controlling the page size: Use the LINAGE clause of the FD entry to control the size
of your printed page: the number of lines in the top and bottom margins and in
the footing area of the page. When you use the LINAGE clause, COBOL handles the
file as if you had also requested the ADV compiler option.
If you use the LINAGE clause in combination with WRITE BEFORE|AFTER ADVANCING
nn LINES, be careful about the values you set. With the ADVANCING nn LINES phrase,
COBOL first calculates the sum of LINAGE-COUNTER plus nn. Subsequent actions
depend on the size of nn. The END-OF-PAGE imperative phrase is performed after
the LINAGE-COUNTER is increased. Consequently, the LINAGE-COUNTER could be
pointing to the next logical page instead of to the current footing area when the
END-OF-PAGE phrase is performed.
BEFORE ADVANCING prints the record before the page is advanced. AFTER ADVANCING
prints the record after the page is advanced.
Specify the number of lines the page is advanced with an integer (or an identifier
with a mnemonic-name) following ADVANCING. If you omit the ADVANCING phrase from
a WRITE statement, the effect is as if you had coded:
AFTER ADVANCING 1 LINE
RELATED REFERENCES
WRITE statement (Enterprise COBOL Language Reference)
If you do not close a QSAM file, the file is automatically closed for you under the
following conditions:
v When the run unit ends normally, the run time closes all open files that are
defined in any COBOL programs in the run unit.
v If the run unit ends abnormally and the TRAP(ON) runtime option is in effect, the
run time closes all open files that are defined in any COBOL programs in the
run unit.
v When Language Environment condition handling has completed and the
application resumes in a routine other than where the condition occurred, the
run time closes all open files that are defined in any COBOL programs in the
run unit that might be called again and reentered.
You can change the location where the program resumes running (after a
condition is handled) by moving the resume cursor with the Language
Environment CEEMRCR callable service or by using language constructs such as
a C longjmp.
v When you use CANCEL for a COBOL subprogram, the run time closes any open
nonexternal files that are defined in that program.
v When a COBOL subprogram with the INITIAL attribute returns control, the run
time closes any open nonexternal files that are defined in that program.
v When a thread of a multithreaded application ends, both external and
nonexternal files that you opened from within that same thread are closed.
File status key data items in the DATA DIVISION are set when these implicit CLOSE
operations are performed, but your EXCEPTION/ERROR declarative is not invoked.
Errors: If you open a QSAM file in a multithreaded application, you must close it
from the same thread of execution from which the file was opened. Attempting to
close the file from a different thread results in a close failure with file-status
condition 90.
RELATED REFERENCES
CLOSE statement (Enterprise COBOL Language Reference)
COBOL provides these ways for you to intercept and handle certain QSAM input
and output errors:
v End-of-file phrase (AT END)
v EXCEPTION/ERROR declarative
v FILE STATUS clause
v INVALID KEY phrase
If you do not code a FILE STATUS key or a declarative, serious QSAM processing
errors will cause a message to be issued and a Language Environment condition to
be signaled, which will cause an abend if you specify the runtime option
ABTERMENC(ABEND).
If you use the FILE STATUS clause or the EXCEPTION/ERROR declarative, code
EROPT=ACC in the DCB of the DD statement for that file. Otherwise, your COBOL
program will not be able to continue processing after some error conditions.
If you use the FILE STATUS clause, be sure to check the key and take appropriate
action based on its value. If you do not check the key, your program might
continue, but the results will probably not be what you expected.
RELATED TASKS
Handling errors in input and output operations on page 241
RELATED TASKS
Defining and allocating QSAM files
Retrieving QSAM files on page 177
Ensuring that file attributes match your program on page 178
Using striped extended-format QSAM data sets on page 180
RELATED REFERENCES
Allocation of buffers for QSAM files on page 181
When you use an environment variable, the name must be in uppercase. Specify
the MVS data set in one of these ways:
v DSN(data-set-name)
v DSN(data-set-name(member-name))
You can optionally specify the following attributes in any order after DSN:
v A disposition value, one of: NEW, OLD, SHR, or MOD
v TRACKS or CYL
v SPACE(nnn,mmm)
v VOL(volume-serial)
v UNIT(type)
v KEEP, DELETE, CATALOG, or UNCATALOG
v STORCLAS(storage-class)
v MGMTCLAS(management-class)
v DATACLAS(data-class)
You can use either an environment variable or a DD definition to define a file in the
z/OS UNIX file system. To do so, define one of the following items with a name
that matches the external name in the ASSIGN clause:
v A DD allocation that uses PATH=absolute-path-name and FILEDATA=BINARY
v An environment variable with a value PATH(pathname), where pathname is an
absolute path name (starting with /)
For compatibility with releases of COBOL before COBOL for OS/390 & VM
Version 2 Release 2, you can also specify FILEDATA=TEXT when using a DD allocation
for z/OS UNIX files, but this use is not recommended. To process text files in the
z/OS UNIX file system, use LINE SEQUENTIAL organization. If you do use QSAM to
process text files in the z/OS UNIX file system, you cannot use environment
variables to define the files.
When you define a QSAM file, use the parameters as shown below.
Table 20. QSAM file allocation
What you want to do DD parameter to use EV keyword to use
Name the file. DSNAME (data-set name) DSN
Select the type and quantity of UNIT UNIT for type only
input-output devices to be
allocated for the file.
Give instructions for the volume in VOLUME (or let the system VOL
which the file will reside and for choose an output volume)
volume mounting.
Allocate the type and amount of SPACE SPACE for the amount of
space the file needs. (Only for space (primary and
direct-access storage devices.) secondary only); TRACKS or
CYL for the type of space
Specify the type and some of the LABEL n/a
contents of the label associated
with the file.
Indicate whether you want to DISP NEW, OLD, SHR, MOD plus
catalog, pass, or keep the file after KEEP, DELETE, CATALOG, or
the job step is completed. UNCATALOG
Some of the information about the QSAM file must always be coded in the
FILE-CONTROL paragraph, the FD entry, and other COBOL clauses. Other
information must be coded in the DD statement or environment variable for output
files. For input files, the system can obtain information from the file label (for
standard label files). If DCB information is provided in the DD statement for input
files, it overrides information on the data-set label. For example, the amount of
space allocated for a new direct-access device file can be set in the DD statement by
the SPACE parameter.
You cannot express certain characteristics of QSAM files in the COBOL language,
but you can code them in the DD statement for the file by using the DCB parameter.
Use the subparameters of the DCB parameter to provide information that the system
needs for completing the data set definition, including the following items:
v Block size (BLKSIZE=), if BLOCK CONTAINS 0 RECORDS was coded at compile time
(recommended)
v Options to be executed if an error occurs in reading or writing a record
v TRACK OVERFLOW or standard blocks
v Mode of operation for a card reader or punch
DCB attributes coded for a DD DUMMY do not override those coded in the FD entry of
your COBOL program.
RELATED TASKS
Setting block sizes on page 167
Defining QSAM files and records in COBOL on page 159
Allocating files on page 157
RELATED REFERENCES
Parameters for creating QSAM files on page 177
MVS Program Management: User's Guide and Reference
dataset-name
DSNAME=
dataset-name(member-name)
DSN= &&name
&&name(member-name)
UNIT= ( name[,unitcount] )
VOLUME= ( [PRIVATE] [,RETAIN] [,vol-sequence-num] [,volume-count] ...
VOL=
... ,SER=(volume-serial[,volume-serial]...)
(
,REF= dsname
*.ddname
*.stepname.ddname
*.stepname.procstep.ddname
DCB= ( subparameter-list )
RELATED TASKS
Defining and allocating QSAM files on page 174
If you are using JCL, and you created the file in the current job step or in a
previous job step in the current job, you can refer to the previous DD statement for
most of the data set information. You do, however, need to code DSNAME and DISP.
RELATED REFERENCES
Parameters for retrieving QSAM files on page 178
RELATED TASKS
Retrieving QSAM files on page 177
Mismatches in the attributes for file organization, record format (fixed or variable),
record length, or the code set result in file status code 39 and the failure of the
OPEN statement. An exception exists for files in the z/OS UNIX file system:
mismatches in record format and record length do not cause an error.
To prevent common file status 39 problems, follow the guidelines for processing
existing or new files.
If you have not made a file available with a DD statement or a TSO ALLOCATE
command, and your COBOL program specifies that the file be created, Enterprise
COBOL dynamically allocates the file. When the file is opened, the file attributes
that are coded in your program are used. You do not have to worry about file
attribute conflicts.
RELATED TASKS
Processing existing files on page 179
Processing new files on page 180
Opening QSAM files on page 170
Assume that the existing file in the previous example was format-U instead of
format-V. If the 104 bytes are all user data, you could define the file in your
program with this code:
FILE SECTION.
FD COMMUTER-FILE-MST
RECORDING MODE IS U
RECORD IS VARYING FROM 4 TO 104 CHARACTERS.
01 COMMUTER-RECORD-A PIC X(4).
01 COMMUTER-RECORD-B PIC X(75).
To define fixed-length records in your program, either code the RECORD CONTAINS
integer clause, or omit this clause and code all level-01 record descriptions to be the
same fixed size. In either case, use a value that equals the value of the length
attribute of the data set. If you intend to use the same program to process different
files at run time, and those files have differing fixed lengths, avoid record-length
conflicts by coding RECORD CONTAINS 0.
If the existing file is an ASCII data set (DCB=(OPTCD=Q)), you must use the CODE-SET
clause in the FD entry for the file.
RELATED TASKS
Processing new files on page 180
Requesting fixed-length format on page 161
Requesting variable-length format on page 162
Requesting undefined format on page 166
Opening QSAM files on page 170
Usually you need to code only a minimum of parameters when predefining files.
But if you need to explicitly set a length attribute for the data set (for example, you
are using an ISPF allocation panel, or your DD statement is for a batch job in which
the program uses RECORD CONTAINS 0), follow these guidelines:
v For format-V and format-S files, set a length attribute that is 4 bytes larger than
that defined in the program.
v For format-F and format-U files, set a length attribute that is the same as that
defined in the program.
v If you open the file as OUTPUT and write it to a printer, the compiler might add 1
byte to the record length to account for the carriage-control character, depending
on the ADV compiler option and the language used in your program. In such a
case, take the added byte into account when coding the LRECL value.
For example, if your program contains the following code for a file that has
variable-length records, the LRECL value in the DD statement or allocation should be
54.
FILE SECTION.
FD COMMUTER-FILE-MST
RECORDING MODE IS V
RECORD CONTAINS 10 TO 50 CHARACTERS.
01 COMMUTER-RECORD-A PIC X(10).
01 COMMUTER-RECORD-B PIC X(50).
RELATED TASKS
Processing existing files on page 179
Requesting fixed-length format on page 161
Requesting variable-length format on page 162
Requesting undefined format on page 166
Opening QSAM files on page 170
Dynamically creating QSAM files on page 171
RELATED REFERENCES
FILE SECTION entries on page 12
A striped extended-format QSAM data set is an extended-format QSAM data set that
is spread over multiple volumes, thus allowing parallel data access.
For you to gain the maximum benefit from using QSAM striped data sets, z/OS
DFSMS needs to be able to allocate the required number of buffers above the 16
MB line. When you develop applications that contain files allocated to QSAM
striped data sets, follow these guidelines:
Note that all striped data sets are extended-format data sets, but not all
extended-format data sets are striped.
RELATED TASKS
z/OS DFSMS: Using Data Sets
Most QSAM files have buffers allocated above the 16 MB line. Exceptions are:
v Programs running in AMODE 24.
v Programs compiled with the DATA(24) and RENT options.
v Programs compiled with the NORENT option.
v EXTERNAL files when the ALL31(OFF) runtime option is specified. To specify the
ALL31(ON) runtime option, all programs in the run unit must be capable of
running in 31-bit addressing mode.
v Files allocated to the TSO terminal.
v A file with format-S (spanned) records, if the file is any of the following ones:
An EXTERNAL file (even if ALL31(ON) is specified)
A file specified in a SAME RECORD AREA clause of the I-O-CONTROL paragraph
A blocked file that is opened I-O and updated using the REWRITE statement
RELATED CONCEPTS
Storage and its addressability on page 39
RELATED TASKS
Using striped extended-format QSAM data sets on page 180
Usage notes
v File status 39 (fixed file attribute conflict) is not enforced for either of the
following types of conflicts:
Record-length conflict
Record-type conflict (fixed as opposed to variable)
v A READ returns the number of bytes of the maximum logical record size for the
file except for the last record, which might be shorter.
For example, suppose that a file definition has level-01 record descriptions of 3,
5, and 10 bytes long, and you write the following three records: 'abc', 'defgh',
and 'ijklmnopqr', in that order. The first READ of this file returns 'abcdefghij', the
second READ returns 'klmnopqr ', and the third READ results in the AT END
condition.
For compatibility with releases of IBM COBOL before COBOL for OS/390 & VM
Version 2 Release 2, you can also specify FILEDATA=TEXT when using a DD allocation
for z/OS UNIX files, but this use is not recommended. To process text files in the
z/OS UNIX file system, use LINE SEQUENTIAL organization. If you use QSAM to
process text files in the z/OS UNIX file system, you cannot use environment
variables to define the files.
RELATED TASKS
Allocating files on page 157
Defining and allocating QSAM files on page 174
z/OS DFSMS: Using Data Sets (Using HFS data sets)
In addition, if your program processes signed numeric data items from ASCII files,
define the numeric data as zoned decimal items with separate signs, that is, as
USAGE DISPLAY and with the SEPARATE phrase of the SIGN clause.
The CODEPAGE compiler option has no effect on the code page used for conversions
between ASCII and EBCDIC for ASCII tape support. For information about how
CCSIDs used for the ASCII tape support are selected and what the default CCSIDs
are, see the z/OS DFSMS documentation.
If you use variable-length records, you cannot explicitly code format D; instead,
code RECORDING MODE V. The format information is internally converted to D mode.
D-mode records have a 4-byte record descriptor for each record.
Defining the ddname: Under z/OS, processing ASCII files requires special JCL
coding. Code these subparameters of the DCB parameter in the DD statement:
BUFOFF=[L|n]
L A 4-byte block prefix that contains the block length (including the
block prefix)
n The length of the block prefix:
v For input, from 0 through 99
v For output, either 0 or 4
Use this value if you coded BLOCK CONTAINS 0.
BLKSIZE=n
n The size of the block, including the length of the block prefix
LABEL=[AL|AUL|NL]
AL American National Standard (ANS) labels
AUL ANS and user labels
NL No labels
OPTCD=Q
Q This value is required for ASCII files and is the default if the file is
created using Enterprise COBOL.
RELATED REFERENCES
z/OS DFSMS: Using Data Sets (Character data conversion)
The following table shows how VSAM terms differ from COBOL terms and other
terms that you might be familiar with.
Table 22. Comparison of VSAM, COBOL, and non-VSAM terminology
VSAM term COBOL term Similar non-VSAM term
Data set File Data set
Entry-sequenced data set (ESDS) Sequential file QSAM data set
Key-sequenced data set (KSDS) Indexed file ISAM data set
Relative-record data set (RRDS) Relative file BDAM data set
Control interval Block
Control interval size (CISZ) Block size
Buffers (BUFNI/BUFND) BUFNO
Access method control block (ACB) Data control block (DCB)
Cluster (CL) Data set
Cluster definition Data-set allocation
AMP parameter of JCL DD statement DCB parameter of JCL DD statement
Record size Record length
The term file in this VSAM documentation refers to either a COBOL file or a
VSAM data set.
RELATED CONCEPTS
VSAM files on page 186
RELATED TASKS
Defining VSAM file organization and records on page 187
Coding input and output statements for VSAM files on page 193
Handling errors in VSAM files on page 201
Protecting VSAM files with a password on page 202
RELATED REFERENCES
z/OS DFSMS: Using Data Sets
z/OS DFSMS Macro Instructions for Data Sets
z/OS DFSMS: Access Method Services for Catalogs
| Allocation of record areas for VSAM files on page 209
| Extended addressability support on page 211
VSAM files
The physical organization of VSAM data sets differs considerably from the
organizations used by other access methods.
VSAM data sets are held in control intervals (CI) and control areas (CA). The size
of the CI and CA is normally determined by the access method; and the way in
which they are used is not visible to you.
The following table compares the characteristics of the different types of VSAM
data sets.
Table 23. Comparison of VSAM data-set types
Entry-sequenced data set Key-sequenced data set Relative-record data set
Characteristic (ESDS) (KSDS) (RRDS)
Order of records Order in which they are Collating sequence by key Order of relative record
written field number
Access Sequential By key through an index By relative record number,
which is handled like a key
Alternate indexes Can have one or more Can have one or more Cannot have alternate indexes
alternate indexes, although alternate indexes
not supported in COBOL
Relative byte address RBA cannot change. RBA can change. RRN cannot change.
(RBA) and relative
record number (RRN)
of a record
Space for adding Uses space at the end of Uses distributed free space For fixed-length RRDS, uses
records the data set for inserting records and empty slots in the data set
changing their lengths in
place For variable-length RRDS, uses
distributed free space and
changes the lengths of added
records in place
Space from deleting You cannot delete a record, Space from a deleted or Space from a deleted record
records but you can reuse its space shortened record is can be reused.
for a record of the same automatically reclaimed in a
length. control interval.
Spanned records Can have spanned records Can have spanned records Cannot have spanned records
Reuse as work file Can be reused unless it has Can be reused unless it has Can be reused
an alternate index, is an alternate index, is
associated with key ranges, associated with key ranges, or
or exceeds 123 extents per exceeds 123 extents per
volume volume
RELATED TASKS
Specifying sequential organization for VSAM files on page 188
Specifying indexed organization for VSAM files on page 188
Specifying relative organization for VSAM files on page 190
Defining VSAM files on page 203
Important: You can process VSAM data sets in Enterprise COBOL programs only
after you define them by using access method services.
Table 24. VSAM file organization, access mode, and record format
Sequential Random Dynamic Fixed Variable
File organization access access access length length
VSAM sequential Yes No No Yes Yes
(ESDS)
VSAM indexed Yes Yes Yes Yes Yes
(KSDS)
VSAM relative Yes Yes Yes Yes Yes
(RRDS)
RELATED TASKS
Specifying sequential organization for VSAM files
Specifying indexed organization for VSAM files
Specifying relative organization for VSAM files on page 190
Specifying access modes for VSAM files on page 191
Defining record lengths for VSAM files on page 191
Using file status keys on page 245
Using VSAM status codes (VSAM files only) on page 246
Defining VSAM files on page 203
After you place a record in the file, you cannot shorten, lengthen, or delete it.
However, you can update (REWRITE) a record if the length does not change. New
records are added at the end of the file.
The following example shows typical FILE-CONTROL entries for a VSAM sequential
file (ESDS):
SELECT S-FILE
ASSIGN TO SEQUENTIAL-AS-FILE
ORGANIZATION IS SEQUENTIAL
ACCESS IS SEQUENTIAL
FILE STATUS IS FSTAT-CODE VSAM-CODE.
RELATED CONCEPTS
VSAM files on page 186
The following example shows the statements for a VSAM indexed file (KSDS) that
is accessed dynamically. In addition to the primary key, COMMUTER-NO, an alternate
key, LOCATION-NO, is specified:
SELECT I-FILE
ASSIGN TO INDEXED-FILE
ORGANIZATION IS INDEXED
ACCESS IS DYNAMIC
RECORD KEY IS IFILE-RECORD-KEY
ALTERNATE RECORD KEY IS IFILE-ALTREC-KEY
FILE STATUS IS FSTAT-CODE VSAM-CODE.
RELATED CONCEPTS
VSAM files on page 186
RELATED TASKS
Using alternate keys
Using an alternate index
RELATED REFERENCES
RECORD KEY clause (Enterprise COBOL Language Reference)
Classes and categories of data (Enterprise COBOL Language Reference)
Alternate keys do not need to be unique. More than one record could be accessed
if alternate keys are coded to allow duplicates. For example, you could access the
file through employee department rather than through employee number.
You define the alternate key in your COBOL program with the ALTERNATE RECORD
KEY clause:
ALTERNATE RECORD KEY IS data-name
In the example above, data-name is the name of the alternate key field as you
define it in the record description entry in the DATA DIVISION. Alternate key data
items, like prime key data items, can be class alphabetic, alphanumeric, DBCS,
numeric, or national. The collation of alternate keys is based on the binary value of
the keys regardless of the class or category of the keys.
The AIX contains one record for each value of a given alternate key. The records
are in sequential order by alternate-key value. Each record contains the
corresponding primary keys of all records in the associated indexed files that
contain the alternate-key value.
The following example shows a relative-record data set (RRDS) that is accessed
randomly by the value in the relative key:
SELECT R-FILE
ASSIGN TO RELATIVE-FILE
ORGANIZATION IS RELATIVE
ACCESS IS RANDOM
RELATIVE KEY IS RFILE-RELATIVE-KEY
FILE STATUS IS FSTAT-CODE VSAM-CODE.
You can use a randomizing routine to associate a key value in each record with the
relative record number for that record. Although there are many techniques to
convert a record key to a relative record number, the most commonly used is the
division/remainder technique. With this technique, you divide the key by a value
equal to the number of slots in the data set to produce a quotient and remainder.
When you add one to the remainder, the result is a valid relative record number.
RELATED CONCEPTS
VSAM files on page 186
Fixed-length and variable-length RRDS
RELATED TASKS
Using variable-length RRDS
Defining VSAM files on page 203
When you load an RRDS that has fixed-length records, you have the option of
skipping over slots and leaving them empty. When you load an RRDS that has
variable-length records, you can skip over relative record numbers.
Do these steps:
1. Define the file with the ORGANIZATION IS RELATIVE clause.
2. Use FD entries to describe the records with variable-length sizes.
3. Use the NOSIMVRD runtime option.
4. Define the VSAM file through access-method services as an RRDS.
RELATED REFERENCES
z/OS DFSMS: Access Method Services for Catalogs
For random access, code ACCESS IS RANDOM in the FILE-CONTROL entry. Records in
indexed files are then accessed according to the value you place in a key field.
Records in relative files are accessed according to the value you place in the
relative key.
For dynamic access, code ACCESS IS DYNAMIC in the FILE-CONTROL entry. Dynamic
access is a mixed sequential-random access in the same program. Using dynamic
access, you can write one program to perform both sequential and random
processing, accessing some records in sequential order and others by their keys.
RELATED TASKS
Reading records from a VSAM file on page 198
If your program processes those employees who earn between $15.00 and $20.00
per hour and those who earn $25.00 per hour and above, using dynamic access of
VSAM files, the program would:
1. Retrieve the first record randomly (with a random-retrieval READ) based on the
key of 1500.
2. Read sequentially (using READ NEXT) until the salary field exceeds 2000.
3. Retrieve the next record randomly, based on a key of 2500.
4. Read sequentially until the end of the file.
RELATED TASKS
Reading records from a VSAM file on page 198
RELATED TASKS
Defining fixed-length records
Defining variable-length records
Enterprise COBOL Migration Guide
RELATED REFERENCES
FILE SECTION entries on page 12
RELATED REFERENCES
RECORD clause (Enterprise COBOL Language Reference)
When you specify a READ INTO statement for a format-V file, the record size that is
read for that file is used in the MOVE statement generated by the compiler.
Consequently, you might not get the result you expect if the record read in does
not correspond to the level-01 record description. All other rules of the MOVE
statement apply. For example, when you specify a MOVE statement for a format-V
record read in by the READ statement, the size of the record corresponds to its
level-01 record description.
RELATED REFERENCES
RECORD clause (Enterprise COBOL Language Reference)
All of the following factors determine which input and output statements you can
use for a given VSAM data set:
v Access mode (sequential, random, or dynamic)
v File organization (ESDS, KSDS, or RRDS)
v Mode of OPEN statement (INPUT, OUTPUT, I-O, or EXTEND)
The following table shows the possible combinations of statements and open
modes for sequential files (ESDS). The X indicates that you can use a statement
with the open mode shown at the top of the column.
The following table shows the possible combinations of statements and open
modes that you can use with indexed (KSDS) files and relative (RRDS) files. The X
indicates that you can use the statement with the open mode shown at the top of
the column.
Table 28. I/O statements for VSAM relative and indexed files
COBOL
Access mode statement OPEN INPUT OPEN OUTPUT OPEN I-O OPEN EXTEND
Sequential OPEN X X X X
WRITE X X
START X X
READ X X
REWRITE X
DELETE X
CLOSE X X X X
Random OPEN X X X
WRITE X X
START
READ X X
REWRITE X
DELETE X
CLOSE X X X
Dynamic OPEN X X X
WRITE X X
START X X
READ X X
REWRITE X
DELETE X
CLOSE X X X
The fields that you code in the FILE STATUS clause are updated by VSAM after
each input-output statement to indicate the success or failure of the operation.
RELATED TASKS
Opening a file (ESDS, KSDS, or RRDS)
Reading records from a VSAM file on page 198
Updating records in a VSAM file on page 199
Adding records to a VSAM file on page 199
Replacing records in a VSAM file on page 200
Deleting records from a VSAM file on page 200
Closing VSAM files on page 200
RELATED REFERENCES
File status key (Enterprise COBOL Language Reference)
Subsequent READ or READ NEXT requests use the established file position indicator
location and update it.
The file position indicator is not used or affected by the output statements WRITE,
REWRITE, or DELETE. The file position indicator has no meaning for random
processing.
RELATED TASKS
Reading records from a VSAM file on page 198
Whether a file is available or optional affects OPEN processing, file creation, and the
resulting file status key. For example, if you open in EXTEND, I-O, or INPUT mode a
nonexistent non-OPTIONAL file, the result is an OPEN error, and file status 35 is
returned. If the file is OPTIONAL, however, the same OPEN statement returns file
status 05, and, for open modes EXTEND and I-O, creates the file.
An OPEN operation works successfully only if you set fixed file attributes in the DD
statement or data-set label for a file, and specify consistent attributes for the file in
the SELECT clause and FD entries of your COBOL program. Mismatches in the
following items result in a file status key 39 and the failure of the OPEN statement:
v Attributes for file organization (sequential, relative, or indexed)
v Prime record key
v Alternate record keys
v Maximum record size
v Record type (fixed or variable)
How you code the OPEN statement for a VSAM file depends on whether the file is
empty (a file that has never contained records) or loaded. For either type of file,
your program should check the file status key after each OPEN statement.
RELATED REFERENCES
Statements to load records into a VSAM file on page 197
Depending on the type of file that you are opening, use one of the following
statements:
v OPEN OUTPUT for ESDS files.
v OPEN OUTPUT or OPEN EXTEND for KSDS and RRDS files. (Either coding has the
same effect.) If you coded the file for random or dynamic access and the file is
optional, you can use OPEN I-O.
Optional files are files that are not necessarily available each time a program is run.
You can define files opened in INPUT, I-O, or OUTPUT mode as optional by defining
them with the SELECT OPTIONAL clause in the FILE-CONTROL paragraph.
Initially loading a file sequentially: Initially loading a file means writing records
into the file for the first time. Doing so is not the same as writing records into a
file from which all previous records have been deleted. To initially load a VSAM
file:
1. Open the file.
2. Use sequential processing (ACCESS IS SEQUENTIAL). (Sequential processing is
faster than random or dynamic processing.)
3. Use WRITE to add a record to the file.
Using OPEN OUTPUT to load a VSAM file significantly improves the performance of
your program. Using OPEN I-O or OPEN EXTEND has a negative effect on the
performance of your program.
When you load VSAM indexed files sequentially, you optimize both loading
performance and subsequent processing performance, because sequential
processing maintains user-defined free space. Future insertions will be more
efficient.
With ACCESS IS SEQUENTIAL, you must write the records in ascending RECORD KEY
order.
When you load VSAM relative files sequentially, the records are placed in the file
in the ascending order of relative record numbers.
Initially loading a file randomly or dynamically: You can use random or dynamic
processing to load a file, but they are not as efficient as sequential processing.
Because VSAM does not support random or dynamic processing, COBOL has to
perform some extra processing to enable you to use ACCESS IS RANDOM or ACCESS
IS DYNAMIC with OPEN OUTPUT or OPEN I-O. These steps prepare the file for use and
give it the status of a loaded file because it has been used at least once.
When you are loading an extended-format VSAM data set, file status 30 will occur
for the OPEN if z/OS DFSMS system-managed buffering sets the buffering to local
shared resources (LSR). To successfully load the VSAM data set in this case, specify
ACCBIAS=USER in the DD AMP parameter for the VSAM data set to bypass
system-managed buffering.
Loading a VSAM data set with access method services: You can load or update a
VSAM data set by using the access method services REPRO command. Use REPRO
whenever possible.
RELATED TASKS
Opening a loaded file (a file with records)
RELATED REFERENCES
Statements to load records into a VSAM file
z/OS DFSMS: Access Method Services for Catalogs (REPRO)
RELATED TASKS
Opening an empty file on page 196
Updating records in a VSAM file on page 199
If you open a VSAM key-sequenced file as EXTEND, each record you add must have
a record key higher than the highest record in the file.
RELATED REFERENCES
Statements to load records into a VSAM file on page 197
z/OS DFSMS: Access Method Services for Catalogs
You can retrieve records in VSAM sequential files only in the sequence in which
they were written.
You can retrieve records in VSAM indexed and relative record files in any of the
following ways:
Sequentially
According to the ascending order of the key you are using, the RECORD KEY
or the ALTERNATE RECORD KEY, beginning at the current position of the file
position indicator for indexed files, or according to ascending relative
record locations for relative files
Randomly
In any order, depending on how you set the RECORD KEY or ALTERNATE
RECORD KEY or the RELATIVE KEY before your READ request
Dynamically
Mixed sequential and random
With dynamic access, you can switch between reading a specific record directly
and reading records sequentially, by using READ NEXT for sequential retrieval and
READ for random retrieval (by key).
When you want to read sequentially, beginning at a specific record, use START
before the READ NEXT statement to set the file position indicator to point to a
particular record. When you code START followed by READ NEXT, the next record is
read and the file position indicator is reset to the next record. You can move the
file position indicator randomly by using START, but all reading is done
sequentially from that point.
START file-name KEY IS EQUAL TO ALTERNATE-RECORD-KEY
When a direct READ is performed for a VSAM indexed file, based on an alternate
index for which duplicates exist, only the first record in the data set (base cluster)
with that alternate key value is retrieved. You need a series of READ NEXT
statements to retrieve each of the data set records with the same alternate key. A
file status code of 02 is returned if there are more records with the same alternate
key value to be read; a code of 00 is returned when the last record with that key
value has been read.
RELATED CONCEPTS
File position indicator on page 195
RELATED TASKS
Specifying access modes for VSAM files on page 191
or or or
RELATED REFERENCES
Statements to load records into a VSAM file on page 197
Adding records sequentially: Use ACCESS IS SEQUENTIAL and code the WRITE
statement to add records sequentially to the end of a VSAM file that has been
opened with either OUTPUT or EXTEND.
For indexed files, you must write new records in ascending key sequence. If you
open the file EXTEND, the record keys of the records to be added must be higher
than the highest primary record key on the file when you opened the file.
For sequential files, the length of the replacement record must be the same as the
length of the original record. For indexed files or variable-length relative files, you
can change the length of the record you replace.
To replace a record randomly or dynamically, you do not have to first READ the
record. Instead, locate the record you want to replace as follows:
v For indexed files, move the record key to the RECORD KEY data item, and then
issue the REWRITE.
v For relative files, move the relative record number to the RELATIVE KEY data
item, and then issue the REWRITE.
When you use ACCESS IS SEQUENTIAL or the file contains spanned records, your
program must first read the record to be deleted. The DELETE then removes the
record that was read. If the DELETE is not preceded by a successful READ, the
deletion is not done and the status key value is set to 92.
When you use ACCESS IS RANDOM or ACCESS IS DYNAMIC, your program does not
have to first read the record to be deleted. To delete a record, move the key of the
record to be deleted to the RECORD KEY data item, and then issue the DELETE. Your
program should check the file status key after each DELETE statement.
If you do not close a VSAM file, the file is automatically closed for you under the
following conditions:
v When the run unit ends normally, all open files defined in any COBOL
programs in the run unit are closed.
v When the run unit ends abnormally, if the TRAP(ON) runtime option has been set,
all open files defined in any COBOL programs in the run unit are closed.
v When Language Environment condition handling has completed and the
application resumes in a routine other than where the condition occurred, open
files defined in any COBOL programs in the run unit that might be called again
and reentered are closed.
File status key data items in the DATA DIVISION are set when these implicit CLOSE
operations are performed, but your EXCEPTION/ERROR declarative is not invoked.
Errors: If you open a VSAM file in a multithreaded application, you must close it
from the same thread of execution. Attempting to close the file from a different
thread results in a close failure with file-status condition 90.
All OPEN and CLOSE errors with a VSAM file, whether logical errors in your
program or input/output errors on the external storage media, return control to
your COBOL program even if you coded no DECLARATIVE and no FILE STATUS
clause.
If any other input or output statement operation fails, you choose whether your
program will continue running after a less-than-severe error.
COBOL provides these ways for you to intercept and handle certain VSAM input
and output errors:
v End-of-file phrase (AT END)
v EXCEPTION/ERROR declarative
v FILE STATUS clause (file status key and VSAM status code)
v INVALID KEY phrase
You should define a status key for each VSAM file that you define in your
program. Check the status key value after each input or output request, especially
OPEN and CLOSE.
If you do not code a file status key or a declarative, serious VSAM processing
errors will cause a message to be issued and a Language Environment condition to
be signaled, which will cause an abend if you specify the runtime option
ABTERMENC(ABEND).
RELATED TASKS
Handling errors in input and output operations on page 241
Using VSAM status codes (VSAM files only) on page 246
RELATED REFERENCES
z/OS DFSMS Macro Instructions for Data Sets (VSAM macro return and
reason codes)
If your program only retrieves records and does not update them, you need only
the read password. If your program loads files or updates them, you need to
specify the update password that was cataloged.
For indexed files, the PASSWORD data item for the RECORD KEY must contain the valid
password before the file can be successfully opened.
Working with VSAM data sets under z/OS and z/OS UNIX
Be aware of special coding considerations for VSAM files under z/OS and z/OS
UNIX for access method services (IDCAMS) commands, environment variables,
and JCL.
A VSAM file is unavailable if it has never contained a record, even if you have
defined the file.
You always get a return code of zero on completion of the OPEN statement for a
VSAM sequential file.
Use the access method services REPRO command to empty a file. Deleting records in
this manner resets the high-use relative byte address (RBA) of the file to zero. The
file is effectively empty and appears to COBOL as if it never contained a record.
RELATED TASKS
Defining files to the operating system on page 8
Defining VSAM files
Creating alternate indexes on page 204
Allocating VSAM files on page 206
Sharing VSAM files through RLS on page 207
A VSAM cluster is a logical definition for a VSAM data set and has one or two
components:
v The data component of a VSAM cluster contains the data records.
v The index component of a VSAM key-sequenced cluster consists of the index
records.
Use the DEFINE CLUSTER access-method services command to define VSAM data
sets (clusters). This process includes creating an entry in an integrated catalog
without any data transfer. Define the following information about the cluster:
v Name of the entry
v Name of the catalog to contain this definition and its password (can use default
name)
v Organization (sequential, indexed, or relative)
v Device and volumes that the data set will occupy
v Space required for the data set
v Record size and control interval sizes (CISIZE)
v Passwords (if any) required for future access
Depending on what kind of data set is in the cluster, also define the following
information for each cluster:
v For VSAM indexed data sets (KSDS), specify length and position of the prime
key in the records.
v For VSAM fixed-length relative-record data sets (RRDS), specify the record size
as greater than or equal to the maximum size COBOL record:
RELATED TASKS
Creating alternate indexes
Allocating VSAM files on page 206
Specifying relative organization for VSAM files on page 190
RELATED REFERENCES
z/OS DFSMS: Access Method Services for Catalogs
Because an alternate index is, in practice, a VSAM data set that contains pointers to
the keys of a VSAM data set, you must define the alternate index and the alternate
index path (the entity that establishes the relationship between the alternate index
and the prime index). After you define an alternate index, make a catalog entry to
establish the relationship (or path) between the alternate index and its base cluster.
This path allows you to access the records of the base cluster through the alternate
keys.
RELATED TASKS
Using an alternate index on page 189
RELATED REFERENCES
Language Environment Programming Reference (AIXBLD (COBOL only))
Using JCL:
//MASTERA DD DSNAME=clustername,DISP=OLD (1)
//MASTERA1 DD DSNAME=path1,DISP=OLD (2)
//MASTERA2 DD DSNAME=path2,DISP=OLD (3)
RELATED TASKS
Creating alternate indexes on page 204
Allocation of VSAM files (indexed, relative, and sequential) follows the general
rules for the allocation of COBOL files.
When you use an environment variable to allocate a VSAM file, the variable name
must be in uppercase. Usually the input and data buffers are the only variables
that you are concerned about. You must specify these options in the order shown,
but no others:
1. DSN(dsname), where dsname is the name of the base cluster
2. OLD or SHR
The basic DD statement that you need for VSAM files and the corresponding export
command are these:
//ddname DD DSN=dsname,DISP=SHR,AMP=AMORG
export evname="DSN(dsname),SHR"
In either case, dsname must be the same as the name used in the access method
services DEFINE CLUSTER or DEFINE PATH command. DISP must be OLD or SHR
because the data set is already cataloged. If you specify MOD when using JCL, the
data set is treated as OLD.
AMP is a VSAM JCL parameter that supplements the information that the program
supplies about the data set. AMP takes effect when your program opens the VSAM
file. Any information that you set through the AMP parameter takes precedence over
the information that is in the catalog or that the program supplies. The AMP
parameter is required only under the following circumstances:
v You use a dummy VSAM data set. For example,
//ddname DD DUMMY,AMP=AMORG
v You request additional index or data buffers. For example,
//ddname DD DSN=VSAM.dsname,DISP=SHR,
// AMP=(BUFNI=4,BUFND=8)
You cannot specify AMP if you allocate a VSAM data set with an environment
variable.
For a VSAM base cluster, specify the same system-name (ddname or environment
variable name) that you specify in the ASSIGN clause after the SELECT clause.
For example, if the system-name of a base cluster is ABCD, the system-name for the
first alternate index path defined for the file in your program is ABCD1, the
system-name for the second alternate index path is ABCD2, and so on.
If the length of the base cluster system-name together with the sequence number
exceeds eight characters, the base cluster portion of the system-name is truncated
on the right to reduce the concatenated result to eight characters. For example, if
the system-name of a base cluster is ABCDEFGH, the system name of the first
alternate index path is ABCDEFG1, the tenth is ABCDEF10, and so on.
RELATED TASKS
Allocating files on page 157
RELATED REFERENCES
MVS Program Management: User's Guide and Reference
Use RLS=CR when consistent read protocols are required, and RLS=NRI when no read
integrity protocols are required. You cannot specify RLS if you allocate your VSAM
data set with an environment variable
RELATED TASKS
Preventing update problems with VSAM files in RLS mode
Handling errors in VSAM files in RLS mode on page 208
RELATED REFERENCES
Restrictions when using RLS on page 208
If the COBOL file is defined as ACCESS RANDOM, VSAM releases the exclusive lock
on the record after a WRITE or REWRITE statement is executed or a READ statement is
executed for another record. When a WRITE or REWRITE is done, VSAM writes the
record immediately.
Specifying RLS=CR locks a record and prevents an update to it until another READ is
requested for another record. While a lock on the record being read is in effect,
other users can request a READ for the same record, but they cannot update the
record until the read lock is released. When you specify RLS=NRI, no lock will be in
effect when a READ for input is executed. Another user might update the record.
The locking rules for RLS=CR can cause the application to wait for availability of a
record lock. This wait might slow down the READ for input. You might need to
modify your application logic to use RLS=CR. Do not use the RLS parameter for
batch jobs that update nonrecoverable spheres until you are sure that the
application functions correctly in a multiple-updater environment.
When you open a VSAM data set in RLS mode for INPUT or I-O processing, it is
good to issue an OPEN or START immediately before a READ. If there is a delay
between the OPEN or START and the READ, another user might add records before the
record on which the application is positioned after the OPEN or START. The COBOL
run time points explicitly to the beginning of the VSAM data set at the time when
OPEN was requested, but another user might add records that would alter the true
beginning of the VSAM data set if the READ is delayed.
All other RLS mode errors return a VSAM return code of 4, 8, or 12.
RELATED TASKS
Using VSAM status codes (VSAM files only) on page 246
If you specify the DATA(24) compiler option, the VSAM record areas and other
dynamic storage areas are allocated in storage below 16 MB.
Programs that pass data in VSAM file records as CALL...USING parameters to AMODE
24 subprograms are impacted. You can recompile such programs with the DATA(24)
compiler option, or use the Language Environment HEAP runtime option, to ensure
that the records are addressable by the AMODE 24 programs.
RELATED REFERENCES
z/OS DFSMS: Access Method Services for Catalogs
| With extended addressability support, you can define larger VSAM data sets
| outside of COBOL. The 4 GB VSAM architectural limit for data set size imposed
| by using the 4-byte field for the relative byte address (RBA) is eliminated.
| To use the extended addressability, the VSAM data set must be Storage
| Management Subsystem (SMS)-managed and be defined as extended format. The
| size limit for a VSAM data set is determined in either of the following ways:
| v Control Interval (CI) size multiplied by 4 GB
| v Volume size multiplied by 59
| For example, a 4 KB CI size yields a maximum data set size of 16 TB, and a 32 KB
| CI size yields a maximum data set size of 128 TB. A 4 KB CI size is preferred by
| many applications for performance reasons. For extended-format data sets that
| grow beyond 4 GB, the processing time does not increase.
| Extended addressability and extended format are not the same concept. Extended
| format is a prerequisite for extended addressability. Extended format is a technique
| that affects the way of storing count key data (CKD) in a 3390/3380 logical track.
| Extended format implements data striping and increases the performance and the
| reliability of an I/O operation. If a data set is allocated as an extended-format data
| set, 32 bytes are added to each physical block.
| RELATED TASKS
| z/OS DFSMS: Using Data Sets
Because line-sequential files are sequential, records are placed one after another
according to entry order. Your program can process these files only sequentially,
retrieving (with the READ statement) records in the same order as they are in the
file. A new record is placed after the preceding record.
After you have created a record, you cannot change its length or its position in the
file, and you cannot delete it.
RELATED TASKS
Defining line-sequential files and records in COBOL
Allocating line-sequential files on page 214
Coding input-output statements for line-sequential files on page 215
Handling errors in line-sequential files on page 218
UNIX System Services User's Guide
The ASSIGN assignment-name clause must not include an organization field (S- or
AS-) before the external name. The ACCESS phrase and the FILE STATUS clause are
optional.
RELATED TASKS
Describing the structure of a line-sequential file on page 214
Allocating line-sequential files on page 214
Coding input-output statements for line-sequential files on page 215
Code the logical size in bytes of the records by using the RECORD clause.
Line-sequential files are stream files. Because of their character-oriented nature, the
physical records are of variable length.
The following examples show how the FD entry might look for a line-sequential
file:
If you code the same fixed size and no OCCURS DEPENDING ON clause for any level-01
record description entries associated with the file, that fixed size is the logical
record length. However, because blanks at the end of a record are not written to
the file, the physical records might be of varying lengths.
RELATED TASKS
Allocating line-sequential files
Coding input-output statements for line-sequential files on page 215
RELATED REFERENCES
Data division--file description entries (Enterprise COBOL Language Reference)
Control characters other than newline are treated as data and are part of the
record.
RELATED TASKS
Allocating files on page 157
Defining line-sequential files and records in COBOL on page 213
RELATED REFERENCES
MVS Program Management: User's Guide and Reference
RELATED TASKS
Defining line-sequential files and records in COBOL on page 213
Describing the structure of a line-sequential file on page 214
Opening line-sequential files on page 216
Reading records from line-sequential files on page 216
Adding records to line-sequential files on page 217
Closing line-sequential files on page 217
Handling errors in line-sequential files on page 218
RELATED REFERENCES
OPEN statement (Enterprise COBOL Language Reference)
READ statement (Enterprise COBOL Language Reference)
Code CLOSE WITH LOCK so that the file cannot be opened again while the program
is running.
RELATED TASKS
Reading records from line-sequential files
Adding records to line-sequential files on page 217
Closing line-sequential files on page 217
Allocating line-sequential files on page 214
RELATED REFERENCES
OPEN statement (Enterprise COBOL Language Reference)
CLOSE statement (Enterprise COBOL Language Reference)
Characters in the file record are read one at a time into the record area until one of
the following conditions occurs:
v The record delimiter (the EBCDIC newline character) is encountered.
The delimiter is discarded and the remainder of the record area is filled with
spaces. (Record area is longer than the file record.)
v The entire record area is filled with characters.
If the next unread character is the record delimiter, it is discarded. The next READ
reads from the first character of the next record. (Record area is the same length
as the file record.)
Otherwise the next unread character is the first character to be read by the next
READ. (Record area is shorter than the file record.)
v End-of-file is encountered.
The remainder of the record area is filled with spaces. (Record area is longer
than the file record.)
RELATED TASKS
Opening line-sequential files
Adding records to line-sequential files on page 217
Closing line-sequential files on page 217
Allocating line-sequential files on page 214
RELATED REFERENCES
OPEN statement (Enterprise COBOL Language Reference)
WRITE statement (Enterprise COBOL Language Reference)
Blanks at the end of the record area are removed, and the record delimiter is
added. The characters in the record area from the first character up to and
including the added record delimiter are written to the file as one record.
Records written to line-sequential files must contain only USAGE DISPLAY and
DISPLAY-1 items. Zoned decimal data items must be unsigned or declared with the
SEPARATE phrase of the SIGN clause if signed.
RELATED TASKS
Opening line-sequential files on page 216
Reading records from line-sequential files on page 216
Closing line-sequential files
Allocating line-sequential files on page 214
RELATED REFERENCES
OPEN statement (Enterprise COBOL Language Reference)
WRITE statement (Enterprise COBOL Language Reference)
If you do not close a line-sequential file, the file is automatically closed for you
under the following conditions:
v When the run unit ends normally.
v When the run unit ends abnormally, if the TRAP(ON) runtime option is set.
v When Language Environment condition handling is completed and the
application resumes in a routine other than where the condition occurred, open
files defined in any COBOL programs in the run unit that might be called again
and reentered are closed.
You can change the location where the program resumes (after a condition is
handled) by moving the resume cursor with the Language Environment
CEEMRCR callable service or using HLL language constructs such as a C
longjmp call.
File status codes are set when these implicit CLOSE operations are performed, but
EXCEPTION/ERROR declaratives are not invoked.
RELATED TASKS
Opening line-sequential files on page 216
Reading records from line-sequential files on page 216
Adding records to line-sequential files
Allocating line-sequential files on page 214
RELATED REFERENCES
CLOSE statement (Enterprise COBOL Language Reference)
COBOL provides these language elements for intercepting and handling certain
line-sequential input and output errors:
v End-of-file phrase (AT END)
v EXCEPTION/ERROR declarative
v FILE STATUS clause
If you do not use one of these techniques, an error in processing input or output
raises a Language Environment condition.
If you use the FILE STATUS clause, be sure to check the key and take appropriate
action based on its value. If you do not check the key, your program might
continue, but the results will probably not be what you expected.
RELATED TASKS
Coding input-output statements for line-sequential files on page 215
Handling errors in input and output operations on page 241
| Note: The SORT statement, sort processes, and sort restrictions that are described in
| this topic relate to the format 1 SORT statement only. For more information about
| sorting a table by using the format 2 SORT statement, see Sorting a table on page
| 88.
SORT statement
Accepts input (from a file or an internal procedure) that is not in sequence,
and produces output (to a file or an internal procedure) in a requested
sequence. You can add, delete, or change records before or after they are
sorted.
MERGE statement
Compares records from two or more sequenced files and combines them in
order. You can add, delete, or change records after they are merged.
A program can contain any number of sort and merge operations. They can be the
same operation performed many times or different operations. However, one
operation must finish before another begins.
With Enterprise COBOL, your IBM licensed program for sorting and merging must
be DFSORT or an equivalent. Where DFSORT is mentioned, you can use any
equivalent sort or merge product.
COBOL programs that contain SORT or MERGE statements can reside above or below
the 16 MB line.
Restrictions:
v You cannot run a COBOL program that contains SORT or MERGE statements under
z/OS UNIX. This restriction includes BPXBATCH.
v You cannot use SORT or MERGE statements in programs compiled with the THREAD
option. This includes programs that use object-oriented syntax and
multithreaded applications, both of which require the THREAD option.
RELATED CONCEPTS
Sort and merge process on page 220
RELATED TASKS
| Sorting a table on page 88
RELATED REFERENCES
CICS SORT application restrictions on page 237
SORT statement (Enterprise COBOL Language Reference)
MERGE statement (Enterprise COBOL Language Reference)
If there are multiple keys, the records are first sorted according to the content of
the first (or primary) key, then according to the content of the second key, and so
on.
During the merging of two or more files (which must already be sorted), the
records are combined and ordered according to the contents of one or more keys in
each record. You can order the records in either ascending or descending order of
each key. As with sorting, the records are first ordered according to the content of
the primary key, then according to the content of the second key, and so on.
Use MERGE . . . USING to name the files that you want to combine into one
sequenced file. The merge operation compares keys in the records of the input
files, and passes the sequenced records one by one to the RETURN statement of an
output procedure or to the file that you name in the GIVING phrase.
RELATED TASKS
Setting sort or merge criteria on page 227
RELATED REFERENCES
SORT statement (Enterprise COBOL Language Reference)
MERGE statement (Enterprise COBOL Language Reference)
Code as follows:
1. Write one or more SELECT clauses in the FILE-CONTROL paragraph of the
ENVIRONMENT DIVISION to name a sort file. For example:
The file described in an SD entry is the working file used for a sort or merge
operation. You cannot perform any input or output operations on this file and you
do not need to provide a ddname definition for it.
RELATED REFERENCES
FILE SECTION entries on page 12
RELATED TASKS
Coding the input procedure on page 222
Requesting the sort or merge on page 226
RELATED REFERENCES
FILE SECTION entries on page 12
RELATED TASKS
Requesting the sort or merge on page 226
To transfer records to the sort program, all input procedures must contain at least
one RELEASE or RELEASE FROM statement. To release A from X, for example, you can
code:
MOVE X TO A.
RELEASE A.
The following table compares the RELEASE and RELEASE FROM statements.
RELATED REFERENCES
Restrictions on input and output procedures on page 225
RELEASE statement (Enterprise COBOL Language Reference)
RELATED TASKS
Coding the output procedure on page 224
Requesting the sort or merge on page 226
The RETURN statement makes each sorted record available to the output procedure.
(The RETURN statement for a sort file is similar to a READ statement for an input file.)
You can use the AT END and END-RETURN phrases with the RETURN statement. The
imperative statements in the AT END phrase are performed after all the records have
been returned from the sort file. The END-RETURN explicit scope terminator delimits
the scope of the RETURN statement.
If you use RETURN INTO instead of RETURN, the records will be returned to
WORKING-STORAGE, LOCAL-STORAGE, or to an output area.
DFSORT coding: If you use DFSORT and a RETURN statement does not encounter
| an AT END condition before a COBOL program finishes running, the format 1 SORT
statement could end abnormally with DFSORT message IEC025A. To avoid this
situation, be sure to code the RETURN statement with the AT END phrase. In addition,
ensure that the RETURN statement is executed until the AT END condition is
encountered. The AT END condition occurs after the last record is returned to the
program from the sort work file and a subsequent RETURN statement is executed.
RELATED REFERENCES
Restrictions on input and output procedures on page 225
RETURN statement (Enterprise COBOL Language Reference)
RELATED TASKS
Coding the input procedure on page 222
Coding the output procedure on page 224
Language Environment Programming Guide (Preparing to link-edit and run)
RELATED TASKS
Controlling sort behavior on page 234
Using checkpoint/restart with DFSORT on page 236
The compiler determines that the sort work file is variable length if you code one
of the following elements in the SD entry:
v A RECORD IS VARYING clause
v Two or more record descriptions that define records that have different sizes, or
records that contain an OCCURS DEPENDING ON clause
You cannot use RECORDING MODE V for the sort work file because the SD entry does
not allow the RECORDING MODE clause.
RELATED TASKS
Changing DFSORT defaults with control statements on page 235
Controlling sort behavior on page 234
To transfer sorted or merged records from the sort or merge program to another
file without any further processing, use SORT . . . GIVING or MERGE . . . GIVING
and the name of the output file that you declared in a SELECT clause. For example:
The USING or GIVING files in a SORT or MERGE statement can be sequential files
residing in the z/OS UNIX file system.
Example: describing sort and input files for SORT on page 221
If you want an input procedure to be performed on the sort records before they are
sorted, use SORT . . . INPUT PROCEDURE. If you want an output procedure to be
performed on the sorted records, use SORT . . . OUTPUT PROCEDURE. For example:
SORT Sort-Work-1
ON ASCENDING KEY Sort-Key-1
INPUT PROCEDURE EditInputRecords
OUTPUT PROCEDURE FormatData.
Restriction: You cannot use an input procedure with the MERGE statement. The
source of input to the merge operation must be a collection of already sorted files.
However, if you want an output procedure to be performed on the merged
records, use MERGE . . . OUTPUT PROCEDURE. For example:
MERGE Merge-Work
ON ASCENDING KEY Merge-Key
USING Input-File-1 Input-File-2 Input-File-3
OUTPUT PROCEDURE ProcessOutput.
In the FILE SECTION, you must define Merge-Work in an SD entry, and the input files
in FD entries.
RELATED TASKS
Defining sort and merge data sets on page 225
RELATED REFERENCES
SORT statement (Enterprise COBOL Language Reference)
MERGE statement (Enterprise COBOL Language Reference)
| Note: The process of setting sort criteria that is described in this topic relates to
| the format 1 SORT statement only. For more information about sorting a table by
| using the format 2 SORT statement, see Sorting a table on page 88.
Do these steps:
SORT and MERGE keys can be of class alphabetic, alphanumeric, national, or numeric
(but not numeric of USAGE NATIONAL). If it has USAGE NATIONAL, a key can be of
category national or can be a national-edited or numeric-edited data item. A key
cannot be a national decimal data item or a national floating-point data item.
The collation order for national keys is determined by the binary order of the keys.
If you specify a national data item as a key, any COLLATING SEQUENCE phrase in the
SORT or MERGE statement does not apply to that key.
You can mix SORT and MERGE statements in the same COBOL program. A program
can perform any number of sort or merge operations. However, one operation
must end before another can begin.
RELATED TASKS
| Sorting a table on page 88
RELATED REFERENCES
DFSORT Application Programming Guide (SORT control statement)
SORT statement (Enterprise COBOL Language Reference)
MERGE statement (Enterprise COBOL Language Reference)
RELATED TASKS
Requesting the sort or merge on page 226
To override the default sequence, use the COLLATING SEQUENCE phrase of the SORT or
MERGE statement. You can use different collating sequences for each SORT or MERGE
statement in your program.
The PROGRAM COLLATING SEQUENCE clause and the COLLATING SEQUENCE phrase apply
only to keys of class alphabetic or alphanumeric.
When you sort or merge an ASCII file, you have to request the ASCII collating
sequence. To do so, code the COLLATING SEQUENCE phrase of the SORT or MERGE
statement, and define the alphabet-name as STANDARD-1 in the SPECIAL-NAMES
paragraph.
RELATED TASKS
Specifying the collating sequence on page 6
Setting sort or merge criteria on page 227
RELATED REFERENCES
OBJECT-COMPUTER paragraph (Enterprise COBOL Language Reference)
SORT statement (Enterprise COBOL Language Reference)
Classes and categories of data (Enterprise COBOL Language Reference)
RELATED REFERENCES
DFSORT Application Programming Guide (OPTION control statement)
You should test for successful completion after each SORT or MERGE statement. For
example:
SORT SORT-WORK-2
ON ASCENDING KEY SORT-KEY
INPUT PROCEDURE IS 600-SORT3-INPUT-PROC
OUTPUT PROCEDURE IS 700-SORT3-OUTPUT-PROC.
IF SORT-RETURN NOT=0
DISPLAY "SORT ENDED ABNORMALLY. SORT-RETURN = " SORT-RETURN.
. . .
600-SORT3-INPUT-PROC SECTION.
. . .
700-SORT3-OUTPUT-PROC SECTION.
. . .
If you do not reference SORT-RETURN anywhere in your program, the COBOL run
time tests the completion code. If it is 16, COBOL issues a runtime diagnostic
message.
By default, DFSORT diagnostic messages are sent to the SYSOUT data set. If you
want to change this default, use the MSGDDN parameter of the DFSORT OPTION
control card or use the SORT-MESSAGE special register.
If you test SORT-RETURN for one or more (but not necessarily all) SORT or MERGE
statements, the COBOL run time does not check the completion code.
RELATED TASKS
Checking for sort errors with NOFASTSRT on page 233
Controlling sort behavior on page 234
RELATED REFERENCES
DFSORT Application Programming Guide (DFSORT messages and return codes)
Control then returns to the statement following the SORT or MERGE statement.
Usage notes
v You cannot use the DFSORT options SORTIN or SORTOUT if you use FASTSRT. The
FASTSRT compiler option does not apply to line-sequential files you use as USING
or GIVING files.
v If you specify file status and use FASTSRT, file status is ignored during the sort.
RELATED REFERENCES
FASTSRT on page 327
FASTSRT requirements for JCL
FASTSRT requirements for sort input and output files
For the input and output files, the DCB parameter of the DD statement must match
the FD description.
| Note: The sort input and output files that is described in this topic relates to the
| format 1 SORT statement only.
If you code a RELATIVE KEY clause for an output file, it will not be set by the sort.
Performance tip: If you block your input and output records, the sort performance
could be significantly improved.
QSAM requirements
v QSAM files must have a record format of fixed, variable, or spanned.
v A QSAM input file can be empty.
v To use the same QSAM file for both input and output, you must describe the file
using two different DD statements. For example, in the FILE-CONTROL SECTION
you might code this:
SELECT FILE-IN ASSIGN INPUTF.
SELECT FILE-OUT ASSIGN OUTPUTF.
In the DATA DIVISION, you would have an FD entry for both FILE-IN and
FILE-OUT, where FILE-IN and FILE-OUT are identical except for their names.
In the PROCEDURE DIVISION, your SORT statement could look like this:
SORT file-name
ASCENDING KEY data-name-1
USING FILE-IN GIVING FILE-OUT
Then in your JCL, assuming that data set INOUT has been cataloged, you would
code:
A QSAM file that qualifies for FASTSRT can be accessed by the COBOL program
| while the format 1 SORT statement is being performed. For example, if the file is
used for FASTSRT on input, you can access it in an output procedure; if it is used
for FASTSRT on output, you can access it in an input procedure.
VSAM requirements
v A VSAM input file must not be empty.
v VSAM files cannot be password-protected.
v You cannot name the same VSAM file in both the USING and GIVING phrases.
v A VSAM file that qualifies for FASTSRT cannot be accessed by the COBOL
| program until the format 1 SORT statement processing is completed. For example,
if the file qualifies for FASTSRT on input, you cannot access it in an output
procedure and vice versa. (If you do so, OPEN fails.)
RELATED TASKS
DFSORT Application Programming Guide
The code required depends on whether you code a FILE STATUS clause or an ERROR
declarative for the files referenced in the USING and GIVING phrases, as shown in
the table below.
Table 32. Methods for checking for sort errors with NOFASTSRT
FILE STATUS ERROR
clause? declarative? Then do:
No No No special coding. Any failure during the sort process
causes the program to end abnormally.
| Yes No Test the SORT-RETURN special register after the format 1
| SORT statement, and test the file status key. (Not
recommended if you want complete file-status checking,
because the file status code is set but COBOL cannot
check it.)
Maybe Yes In the ERROR declarative, set the SORT-RETURN special
register to 16 to stop the sort process and indicate that it
was not successful. Test the SORT-RETURN special register
| after the format 1 SORT statement.
You can verify sort behavior by examining the contents of special registers after the
sort.
The table below lists those aspects of sort behavior that you can affect by using
special registers or compiler options, and the equivalent sort control statement
keywords if any are available.
Table 33. Methods for controlling sort behavior
Or this control statement
Use this special register or (and keyword if
To set or test compiler option applicable)
Amount of main storage to be SORT-CORE-SIZE special register OPTION (keyword RESINV)
reserved
Amount of main storage to be SORT-CORE-SIZE special register OPTION (keywords
used MAINSIZE or MAINSIZE=MAX)
Modal length of records in a SORT-MODE-SIZE special register SMS=nnnnn
file with variable-length
records
Name of sort control statement SORT-CONTROL special register None
data set (default IGZSRTCD)
Name of sort message file SORT-MESSAGE special register OPTION (keyword MSGDDN)
(default SYSOUT)
Number of sort records SORT-FILE-SIZE special register OPTION (keyword FILSZ)
Sort completion code SORT-RETURN special register None
You can use the SORT-RETURN special register to determine whether the sort or
merge was successful and to stop a sort or merge operation prematurely.
A compiler warning message (W-level) is issued for each sort special register that
you set in a program.
RELATED REFERENCES
Default characteristics of the IGZSRTCD data set
The control statements that you can include in IGZSRTCD (in the order listed) are:
1. SMS=nnnnn, where nnnnn is the length in bytes of the most frequently occurring
record size. (Use only if the SD file is variable length.)
2. OPTION (except keywords SORTIN or SORTOUT).
3. Other DFSORT control statements (except SORT, MERGE, RECORD, or END).
Code control statements between columns 2 and 71. You can continue a control
statement record by ending the line with a comma and starting the next line with a
new keyword. You cannot use labels or comments on a record, and a record itself
cannot be a DFSORT comment statement.
RELATED TASKS
Controlling sort behavior on page 234
DFSORT Application Programming Guide (Using DFSORT program
control statements)
RELATED REFERENCES
Default characteristics of the IGZSRTCD data set
You can use a different ddname by coding it in the SORT-CONTROL special register. If
you defined a ddname for the SORT-CONTROL data set and you receive the message
IGZ0027W, an OPEN failure occurred that you should investigate.
RELATED TASKS
Controlling sort behavior on page 234
DFSORT installation should not allocate all the free space in the region for its
COBOL operation, however. When your program is running, storage must be
available for:
For a specific sort or merge operation, you can override the DFSORT storage
values set at installation. To do so, code the MAINSIZE and RESINV keywords on the
OPTION control statement in the sort control statement data set, or use the
SORT-CORE-SIZE special register.
Be careful not to override the storage allocation to the extent that all the free space
in the region is used for sort operations for your COBOL program.
RELATED TASKS
Controlling sort behavior on page 234
DFSORT Installation and Customization
RELATED REFERENCES
DFSORT Application Programming Guide (OPTION control statement)
If this occurs, you can use the SORT-FILE-SIZE special register to help DFSORT
determine the amount of resource (for example, workspace or hiperspace) needed
for the sort. Set SORT-FILE-SIZE to a reasonable estimate of the number of input
records. This value is passed to DFSORT as its FILSZ=En value.
RELATED TASKS
Controlling sort behavior on page 234
Coding the input procedure on page 222
DFSORT Application Programming Guide
RELATED CONCEPTS
Chapter 32, Interrupts and checkpoint/restart, on page 641
You must have both an input and an output procedure for the SORT statement. In
the input procedure, use the RELEASE statement to transfer records from the
COBOL program to the sort program before the sort is performed. In the output
procedure, use the RETURN statement to transfer records from the sort program to
the COBOL program after the sort is performed.
RELATED TASKS
Coding the input procedure on page 222
Coding the output procedure on page 224
Coding COBOL programs to run under CICS on page 419
RELATED REFERENCES
CICS SORT application restrictions
CICS reserved-word table on page 427
RELATED REFERENCES
CICS reserved-word table on page 427
The error-handling code can take actions such as handling the situation, issuing a
message, or halting the program. You might for example create error-detection
routines for data-entry errors or for errors as your installation defines them. In any
event, coding a warning message is a good idea.
Enterprise COBOL contains special elements to help you anticipate and correct
error conditions:
v User-requested dumps
v ON OVERFLOW in STRING and UNSTRING operations
v ON SIZE ERROR in arithmetic operations
v Elements for handling input or output errors
v ON EXCEPTION or ON OVERFLOW in CALL statements
v User-written routines for handling errors
RELATED TASKS
Handling errors in joining and splitting strings on page 240
Handling errors in arithmetic operations on page 240
Handling errors in input and output operations on page 241
Handling errors when calling programs on page 250
Writing routines for handling errors on page 250
Requesting dumps
You can cause a formatted dump of the Language Environment runtime
environment and the member language libraries at any prespecified point in your
program by coding a call to the Language Environment callable service CEE3DMP.
77 Title-1 Pic x(80) Display.
77 Options Pic x(255) Display.
01 Feedback-code Pic x(12) Display.
. . .
Call "CEE3DMP" Using Title-1, Options, Feedback-code
To have symbolic variables included in the formatted dump, compile with the TEST
compiler option and use the VARIABLES subparameter of CEE3DMP. You can also
request, through runtime options, that a dump be produced for error conditions of
your choosing.
You can cause a system dump at any prespecified point in your program. Request
an abend without cleanup by calling the Language Environment service CEE3ABD
with a cleanup value of zero. This callable service stops the run unit immediately,
and a system dump is requested when the abend is issued.
RELATED REFERENCES
TEST on page 359
Instead, the STRING or UNSTRING operation is not completed, the receiving field
remains unchanged, and control passes to the next sequential statement. If you do
not code the ON OVERFLOW phrase of the STRING or UNSTRING statement, you are not
notified of the incomplete operation.
These are the data values before and after the statement is performed:
Because String-ptr has a value (0) that falls short of the receiving field, an
overflow condition occurs and the STRING operation is not completed. (Overflow
would also occur if String-ptr were greater than 9.) If ON OVERFLOW had not been
specified, you would not be notified that the contents of Item-4 remained
unchanged.
For ON SIZE ERROR to work correctly for fixed-point overflow and decimal
overflow, you must specify the TRAP(ON) runtime option.
The imperative statement of the ON SIZE ERROR clause will be performed and the
result field will not change in these cases:
v Fixed-point overflow
v Division by zero
v Zero raised to the zero power
If division by zero occurs, the program writes a message and halts program
execution.
You can use any of the following techniques for intercepting and handling certain
input or output conditions or errors:
v End-of-file condition (AT END)
v ERROR declaratives
v FILE STATUS clause and file status key
v File system status code
v Imperative-statement phrases in READ or WRITE statements
For VSAM files, if you specify a FILE STATUS clause, you can also test the VSAM
status code to direct your program to error-handling logic.
v INVALID KEY phrase
To have your program continue, you must code the appropriate error-recovery
procedure. You might code, for example, a procedure to check the value of the file
status key. If you do not handle an input or output error in any of these ways, a
severity-3 Language Environment condition is signaled, which causes the run unit
to end if the condition is not handled.
The following figure shows the flow of logic after a VSAM input or output error:
Applicable*
Yes Execute
imperative
imperative
phrase?
statement
No
Associated Execute
Yes
ERROR ERROR
declarative? declarative
No
File-status
Yes Test file**
clause
status key
specified ?
No
*Possible phrases for QSAM are AT END, AT END-OF-PAGE, and INVALID KEY; for line
sequential, AT END.
**You need to write the code to test the file status key.
RELATED TASKS
Using the end-of-file condition (AT END)
Coding ERROR declaratives on page 244
Using file status keys on page 245
Handling errors in QSAM files on page 174
Using VSAM status codes (VSAM files only) on page 246
Handling errors in line-sequential files on page 218
Coding INVALID KEY phrases on page 249
RELATED REFERENCES
File status key (Enterprise COBOL Language Reference)
Any NOT AT END phrase is performed only if the READ statement completes
successfully. If the READ operation fails because of a condition other than
end-of-file, neither the AT END nor the NOT AT END phrase is performed. Instead,
control passes to the end of the READ statement after any associated declarative
procedure is performed.
You might choose not to code either an AT END phrase or an EXCEPTION declarative
procedure, but to code a status key clause for the file instead. In that case, control
passes to the next sequential instruction after the input or output statement that
detected the end-of-file condition. At that place, have some code that takes
appropriate action.
RELATED REFERENCES
AT END phrases (Enterprise COBOL Language Reference)
Place each such procedure in the declaratives section of the PROCEDURE DIVISION.
You can code:
v A single, common procedure for the entire program
v Procedures for each file open mode (whether INPUT, OUTPUT, I-O, or EXTEND)
v Individual procedures for each file
In an ERROR declarative procedure, you can code corrective action, retry the
operation, continue, or end execution. (If you continue processing a blocked file,
though, you might lose the remaining records in a block after the record that
caused the error.) You can use the ERROR declaratives procedure in combination
with the file status key if you want a further analysis of the error.
When this program is running on two threads, the following sequence of events
could occur:
1. Thread 1: Rewrite R1 acquires lock on F1 and encounters I/O error.
2. Thread 1: Enter declarative D1, holding lock on F1.
3. Thread 2: Rewrite R2 acquires lock on F2 and encounters I/O error.
4. Thread 2: Enter declarative D2.
5. Thread 1: Read F2 from declarative D1; wait on F2 lock held by thread 2.
6. Thread 2: Read F1 from declarative D2; wait on F1 lock held by thread 1.
7. Deadlock.
RELATED REFERENCES
EXCEPTION/ERROR declarative (Enterprise COBOL Language Reference)
Your program can check the file status key to discover whether an error occurred,
and, if so, what type of error occurred. For example, suppose that a FILE STATUS
clause is coded like this:
FILE STATUS IS FS-CODE
For VSAM files, you can additionally code a second identifier in the FILE STATUS
clause to get more detailed information about VSAM input or output requests.
You can use the file status key alone or in conjunction with the INVALID KEY
phrase, or to supplement the EXCEPTION or ERROR declarative. Using the file status
key in this way gives you precise information about the results of each input or
output operation.
RELATED TASKS
Using VSAM status codes (VSAM files only)
Coding INVALID KEY phrases on page 249
Finding and handling input-output errors on page 379
RELATED REFERENCES
FILE STATUS clause (Enterprise COBOL Language Reference)
File status key (Enterprise COBOL Language Reference)
The data item data-name-8 specifies the VSAM status code, which you define as a
6-byte alphanumeric group data item that has three subordinate 2-byte binary
fields. The VSAM status code contains meaningful values when the COBOL file
status key is not 0.
RELATED REFERENCES
FILE STATUS clause (Enterprise COBOL Language Reference)
File status key (Enterprise COBOL Language Reference)
z/OS DFSMS Macro Instructions for Data Sets (VSAM macro return and
reason codes)
This example also illustrates how output from this program might look if the file
being processed contained six records.
IDENTIFICATION DIVISION
PROGRAM-ID. EXAMPLE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT VSAMFILE ASSIGN TO VSAMFILE
ORGANIZATION IS INDEXED
IF FS-CODE = "00"
PERFORM READ-NEXT UNTIL FS-CODE NOT = "00"
END-IF.
CLOSE VSAMFILE.
STOP RUN.
READ-NEXT.
READ VSAMFILE NEXT.
DISPLAY "READ NEXT VSAMFILE FS-CODE: " FS-CODE.
IF FS-CODE NOT = "00"
PERFORM VSAM-CODE-DISPLAY
END-IF.
DISPLAY VSAMFILE-REC.
VSAM-CODE-DISPLAY.
DISPLAY "VSAM-CODE ==>"
" RETURN: " VSAM-RETURN-CODE,
" COMPONENT: " VSAM-COMPONENT-CODE,
" REASON: " VSAM-REASON-CODE.
Below is a sample of the output from the example program that checks VSAM
status-code information:
OPEN INPUT VSAMFILE FS-CODE: 00
START VSAMFILE KEY=000005 FS-CODE: 00
READ NEXT VSAMFILE FS-CODE: 00
000005 THIS IS RECORD NUMBER 5
READ NEXT VSAMFILE FS-CODE: 00
000006 THIS IS RECORD NUMBER 6
READ NEXT VSAMFILE FS-CODE: 10
VSAM-CODE ==> RETURN: 08 COMPONENT: 2 REASON: 004
You can also include the INVALID KEY phrase in WRITE requests for QSAM files, but
the phrase has limited meaning for QSAM files. It is used only if you try to write
to a disk that is full.
Use the FILE STATUS clause with the INVALID KEY phrase to evaluate the status key
and determine the specific INVALID KEY condition.
INVALID KEY phrases differ from ERROR declaratives in several ways. INVALID KEY
phrases:
v Operate for only limited types of errors. ERROR declaratives encompass all forms.
v Are coded directly with the input or output statement. ERROR declaratives are
coded separately.
v Are specific for a single input or output operation. ERROR declaratives are more
general.
If you code INVALID KEY in a statement that causes an INVALID KEY condition,
control is transferred to the INVALID KEY imperative statement. Any ERROR
declaratives that you coded are not performed.
If you code a NOT INVALID KEY phrase, it is performed only if the statement
completes successfully. If the operation fails because of a condition other than
INVALID KEY, neither the INVALID KEY nor the NOT INVALID KEY phrase is
performed. Instead, after the program performs any associated ERROR declaratives,
control passes to the end of the statement.
Assume that you have a file that contains master customer records and you need
to update some of these records with information from a transaction update file.
The program reads each transaction record, finds the corresponding record in the
master file, and makes the necessary updates. The records in both files contain a
field for a customer number, and each record in the master file has a unique
customer number.
The FILE-CONTROL entry for the master file of customer records includes statements
that define indexed organization, random access, MASTER-CUSTOMER-NUMBER as the
prime record key, and CUSTOMER-FILE-STATUS as the file status key.
.
. (read the update transaction record)
.
MOVE "TRUE" TO TRANSACTION-MATCH
MOVE UPDATE-CUSTOMER-NUMBER TO MASTER-CUSTOMER-NUMBER
READ MASTER-CUSTOMER-FILE INTO WS-CUSTOMER-RECORD
INVALID KEY
Use the ON EXCEPTION phrase to perform a series of statements and to perform your
own error handling. For example, in the code fragment below, if program REPORTA
is unavailable, control passes to the ON EXCEPTION phrase.
MOVE "REPORTA" TO REPORT-PROG
CALL REPORT-PROG
ON EXCEPTION
DISPLAY "Program REPORTA not available, using REPORTB."
MOVE "REPORTB" TO REPORT-PROG
CALL REPORT-PROG
END-CALL
END-CALL
The ON EXCEPTION phrase applies only to the availability of the called program on
its initial load. If the called program is loaded but fails for any other reason (such
as initialization), the ON EXCEPTION phrase is not performed.
RELATED TASKS
Enterprise COBOL Migration Guide
When you write your own error-handling routines for an application, the COBOL
programs must be compiled with appropriate compiler options. For more
information, see OPTIMIZE on page 343.
RELATED TASKS
Using procedure and function pointers on page 477
For compiling with JCL, IBM provides a set of cataloged procedures, which can
reduce the amount of JCL coding that you need to write. If the cataloged
procedures do not meet your needs, you can write your own JCL. Using JCL, you
can compile a single program or compile several programs as part of a batch job.
When compiling under TSO, you can use TSO commands, CLISTs, or ISPF panels.
You can also compile in a z/OS UNIX shell by using the cob2 command.
You might instead want to start the Enterprise COBOL compiler from an assembler
program, for example, if your shop has developed a tool or interface that calls the
Enterprise COBOL compiler.
As part of the compilation step, you need to define the data sets needed for the
compilation and specify any compiler options necessary for your program and the
required output.
The compiler translates your COBOL program into language that the computer can
process (object code). The compiler also lists errors in your source statements and
provides supplementary information to help you debug and tune your program.
Use compiler-directing statements and compiler options to control your
compilation.
After compiling your program, you need to review the results of the compilation
and correct any compiler-detected errors.
RELATED TASKS
Compiling with JCL
Compiling under TSO on page 262
Chapter 15, Compiling under z/OS UNIX, on page 283
Starting the compiler from an assembler program on page 265
Defining compiler input and output on page 266
Specifying compiler options under z/OS on page 272
Compiling multiple programs (batch compilation) on page 275
Correcting errors in your source program on page 279
RELATED REFERENCES
Chapter 18, Compiler-directing statements, on page 373
Data sets used by the compiler under z/OS on page 267
Compiler options and compiler output under z/OS on page 274
The following JCL shows the general format for a cataloged procedure.
//jobname JOB parameters
//stepname EXEC [PROC=]procname[,{PARM=|PARM.stepname=}options]
//SYSIN DD data-set parameters
. . . (source program to be compiled)
/*
//
RELATED TASKS
Using a cataloged procedure
Writing JCL to compile programs on page 260
Specifying compiler options under z/OS on page 272
Specifying compiler options in a batch compilation on page 277
Compiling programs to create DLLs on page 498
RELATED REFERENCES
Data sets used by the compiler under z/OS on page 267
For example, the following JCL calls the IBM-supplied cataloged procedure
IGYWC for compiling an Enterprise COBOL program and defining the required
data sets:
//JOB1 JOB1
//STEPA EXEC PROC=IGYWC
//COBOL.SYSIN DD *
000100 IDENTIFICATION DIVISION
* (the source code)
. . .
/*
You can omit /* after the source code. If your source code is stored in a data set,
replace SYSIN DD * with appropriate parameters that describe the data set.
You can use these procedures with any of the job schedulers that are part of z/OS.
When a scheduler encounters parameters that it does not require, the scheduler
either ignores them or substitutes alternative parameters.
If the compiler options are not explicitly supplied with the procedure, default
options established at the installation apply. You can override these default options
by using an EXEC statement that includes the required options.
You can specify data sets to be in the z/OS UNIX file system by overriding the
corresponding DD statement. However, the compiler utility files (SYSUTx) and copy
libraries (SYSLIB) you specify must be MVS data sets.
RELATED TASKS
Language Environment Programming Guide
RELATED REFERENCES
Compile procedure (IGYWC)
Compile and link-edit procedure (IGYWCL) on page 258
Compile, link-edit, and run procedure (IGYWCLG) on page 259
MVS Program Management: User's Guide and Reference
You must supply the following DD statement, indicating the location of the source
program, in the input stream:
//COBOL.SYSIN DD * (or appropriate parameters)
If you use copybooks in the program that you are compiling, you must also supply
a DD statement for SYSLIB or other libraries that you specify in COPY statements. For
example:
//COBOL.SYSLIB DD DISP=SHR,DSN=DEPT88.BOBS.COBLIB
//IGYWC PROC LNGPRFX=IGY.V5R1M0,
// LIBPREFIX=CEE
//*
//* COMPILE A COBOL PROGRAM
//*
//* PARAMETER DEFAULT VALUE USAGE
//* LNGPRFX IGY.V5R1M0 PREFIX FOR LANGUAGE DATA SET NAMES
//* LIBPRFX CEE PREFIX FOR LIBRARY DATA SET NAMES
//*
//* CALLER MUST SUPPLY //COBOL.SYSIN DD . . .
//*
//* CALLER MUST ALSO SUPPLY //COBOL.SYSLIB DD . . . for COPY statements
//*
//COBOL EXEC PGM=IGYCRCTL,REGION=0M
//STEPLIB DD DSNAME=&LNGPRFX..SIGYCOMP,DISP=SHR (1)
// DD DSNAME=&LIBPRFX..SCEERUN,DISP=SHR
// DD DSNAME=&LIBPRFX..SCEERUN2,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSLIN DD DSNAME=&&LOADSET,UNIT=SYSALLDA,
// DISP=(MOD,PASS),SPACE=(CYL,(1,1)),
//SYSUT1 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT2 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT3 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT4 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT5 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT6 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT7 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT8 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT9 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT10 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT11 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT12 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT13 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT14 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSUT15 DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
//SYSMDECK DD UNIT=SYSALLDA,SPACE=(CYL,(1,1))
Example: JCL for compiling in the z/OS UNIX file system on page 258
The following job uses procedure IGYWC to compile a COBOL program, demo.cbl,
that is located in the z/OS UNIX file system. The job writes the generated
compiler listing demo.lst, object file demo.o, and SYSADATA file demo.adt in the
z/OS UNIX file system.
//UNIXDEMO JOB ,
// TIME=(1),MSGLEVEL=(1,1),MSGCLASS=H,CLASS=A,REGION=50M,
// NOTIFY=&SYSUID,USER=&SYSUID
//COMPILE EXEC IGYWC,
// PARM.COBOL=LIST,MAP,RENT,FLAG(I,I),XREF,ADATA
//SYSPRINT DD PATH=/u/userid/cobol/demo.lst, (1)
// PATHOPTS=(OWRONLY,OCREAT,OTRUNC), (2)
// PATHMODE=SIRWXU, (3)
// FILEDATA=TEXT (4)
//SYSLIN DD PATH=/u/userid/cobol/demo.o,
// PATHOPTS=(OWRONLY,OCREAT,OTRUNC),
// PATHMODE=SIRWXU
//SYSADATA DD PATH=/u/userid/cobol/demo.adt,
// PATHOPTS=(OWRONLY,OCREAT,OTRUNC),
// PATHMODE=SIRWXU
//SYSIN DD PATH=/u/userid/cobol/demo.cbl,
// PATHOPTS=ORDONLY,
// FILEDATA=TEXT,
// RECFM=F
(1) PATH specifies the path name of a file in the z/OS UNIX file system.
(2) PATHOPTS indicates the access for the file (such as read or read-write) and
sets the status for the file (such as append, create, or truncate).
(3) PATHMODE indicates the permissions, or file access attributes, to be set when
a file is created.
(4) FILEDATA specifies whether the data is to be treated as text or as binary.
You can use a mixture of files in the z/OS UNIX file system (PATH=unix-directory-
path) and traditional MVS data sets (DSN=mvs-data-set-name) in the compilation DD
statements (shown in this example as overrides). However, the compiler utility files
(DD statements SYSUTx) and COPY libraries (DD statements SYSLIB) must be MVS data
sets.
RELATED REFERENCES
Data sets used by the compiler under z/OS on page 267
UNIX System Services Command Reference
MVS JCL Reference
| The COBOL job step produces an object module that is input to the binder
| (linkage-editor). You can add other object modules. You must supply the following
DD statement, indicating the location of the source program, in the input stream:
//COBOL.SYSIN DD * (or appropriate parameters)
If the program uses copybooks, you must also supply a DD statement for SYSLIB or
other libraries that you specify in COPY statements. For example:
//COBOL.SYSLIB DD DISP=SHR,DSN=DEPT88.BOBS.COBLIB
//IGYWCL PROC LNGPRFX=IGY.V5R1M0,
// LIBPRFX=CEE,
// PGMLIB=&&GOSET,GOPGM=GO
| The COBOL job step produces an object module that is input to the binder
| (linkage-editor). You can add other object modules. If the COBOL program refers
to any data sets, you must also supply DD statements that define these data sets.
You must supply the following DD statement, indicating the location of the source
program, in the input stream:
//COBOL.SYSIN DD * (or appropriate parameters)
If the program uses copybooks, you must also supply a DD statement for SYSLIB or
other libraries that you specify in COPY statements. For example:
You can use a mixture of files in the z/OS UNIX file system (PATH=unix-directory-
path) and traditional MVS data sets (DSN=mvs-data-set-name) in the compilation DD
statements for the following data sets:
v Sources files
v Object files
v Listings
v ADATA files
v Debug files
v Executable modules
RELATED REFERENCES
MVS Program Management: User's Guide and Reference
With each method, you need to allocate the data sets and request the compilation:
1. Use the ALLOCATE command to allocate data sets.
For any compilation, allocate the work data sets (SYSUTn) and the SYSIN and
SYSPRINT data sets.
You can specify the ALLOCATE and CALL commands on the TSO command line, or, if
you are not using z/OS UNIX files, you can include them in a CLIST.
You can allocate z/OS UNIX files for all the compiler data sets except the SYSUTx
utility data sets and the SYSLIB libraries. ALLOCATE statements have the following
form:
Allocate File(SYSIN) Path(/u/myu/myap/std/prog2.cbl)
Pathopts(ORDONLY) Filedata(TEXT)
RELATED REFERENCES
Data sets used by the compiler under z/OS on page 267
RELATED REFERENCES
TSO/E Command Reference
For example:
symbol {LINK|ATTACH} EP=IGYCRCTL,PARAM=(optionlist[,ddnamelist]),VL=1
EP Specifies the symbolic name of the compiler. The control program (from
the library directory entry) determines the entry point at which the
program should begin running.
PARAM Specifies, as a sublist, address parameters to be passed from the assembler
program to the compiler.
The first fullword in the address parameter list contains the address of the
COBOL optionlist. The second fullword contains the address of the
ddnamelist.
optionlist
Specifies the address of a variable-length list that contains the COBOL
options specified for compilation. This address must be written even if no
list is provided.
The optionlist must begin on a halfword boundary. The 2 high-order bytes
contain a count of the number of bytes in the remainder of the list. If no
options are specified, the count must be zero. The optionlist is freeform,
with each field separated from the next by a comma. No blanks or zeros
should appear. The compiler recognizes only the first 100 characters.
ddnamelist
Specifies the address of a variable-length list that contains alternative
ddnames for the data sets used during compiler processing. If standard
ddnames are used, the ddnamelist can be omitted.
The ddnamelist must begin on a halfword boundary. The 2 high-order bytes
contain a count of the number of bytes in the remainder of the list. Each
name of less than 8 bytes must be left justified and padded with blanks. If
an alternate ddname is omitted from the list, the standard name is
assumed. If the name is omitted, the 8-byte entry must contain binary
zeros. You can omit names from the end by shortening the list.
All SYSUTn data sets specified must be on direct-access storage devices
and have physical sequential organization. They must not reside in the
z/OS UNIX file system.
The following table shows the sequence of the 8-byte entries in the
ddnamelist.
Alternative ddname 8-byte entry Name for which alternative ddname is substituted
1 SYSLIN
2 Not applicable
3 Not applicable
4 SYSLIB
5 SYSIN
6 SYSPRINT
VL Specifies that the sign bit is to be set to 1 in the last fullword of the
address parameter list.
When the compiler completes processing, it puts a return code in register 15.
RELATED TASKS
Defining compiler input and output
RELATED REFERENCES
Data sets used by the compiler under z/OS on page 267
Compiler options and compiler output under z/OS on page 274
RELATED TASKS
Defining the source code data set (SYSIN) on page 269
Defining a compiler-option data set (SYSOPTF) on page 269
Specifying source libraries (SYSLIB) on page 270
266 Enterprise COBOL for z/OS, V5.2 Programming Guide
Defining the output data set (SYSPRINT) on page 270
Directing compiler messages to your terminal (SYSTERM) on page 271
Creating object code (SYSLIN or SYSPUNCH) on page 271
Defining an associated-data file (SYSADATA) on page 271
Defining the Java-source output file (SYSJAVA) on page 272
Defining the library-processing output file (SYSMDECK) on page 272
RELATED REFERENCES
Data sets used by the compiler under z/OS
Compiler options and compiler output under z/OS on page 274
1. You can use the EXIT option to provide user exits from these data sets.
2. These data sets must be single volume.
| 3. Do not use DSNTYPE=LARGE for utility data sets (SYSUT1 - SYSUT15).
RELATED REFERENCES
Logical record length and block size
EXIT on page 324
For fixed-length records (RECFM=F or RECFM=FB), LRECL is the logical record length;
and BLKSIZE equals LRECL multiplied by n where n is equal to the blocking factor.
The following table shows the defined values for the fixed-length data sets. In
general, you should not change these values, but you can change the value for
theSYSPRINT data set. You can specify BLKSIZE=0, which results in a
system-determined block size.
1. n = blocking factor
2. If you specify BLKSIZE=0, the system determines the block size.
For variable-length records (RECFM=V), LRECL is the logical record length, and
BLKSIZE equals LRECL plus 4.
Table 36. Block size of variable-length compiler data sets
LRECL BLKSIZE (bytes) minimum
Data set RECFM (bytes) acceptable value
SYSADATA VB 1020 1024
You can place your source code or BASIS statement directly in the input stream. To
do so, use this SYSIN DD statement:
//SYSIN DD *
The source code or BASIS statement must follow theDD * statement. If another job
step follows the compilation, the EXEC statement for that step must follow the /*
statement or the last source statement.
You can optionally place the compiler options directly in the input stream after the
SYSOPTF DD statement if you compile using the OPTFILE option:
//COB EXEC PGM=IGYCRCTL,PARM=OPTFILE
//SYSOPTF DD DATA,DLM=@@
SSRANGE ARITH(COMPAT)
OPTIMIZE
. . .
@@
//SYSIN DD . . .
Compiler options that are in later data sets in the concatenation take precedence
over options in earlier data sets in the concatenation.
RELATED REFERENCES
Logical record length and block size on page 268
OPTFILE on page 342
Libraries are on direct-access storage devices. They cannot be in the z/OS UNIX
file system when you compile with JCL or under TSO.
You do not need the SYSLIB DD statement if the NOLIB option is in effect.
You can direct the output to a SYSOUT data set, a printer, a direct-access storage
device, or a magnetic-tape device. For example:
//SYSPRINT DD SYSOUT=A
The SYSPRINT data set can be a sequential data set, a PDS or PDSE member, or a
z/OS UNIX file. For details about how to specify the record format, record length,
and block size of the SYSPRINT data set, see the related reference below.
You can define SYSTERM in various other ways, for example to a SYSOUT data set,
a data set on disk, a file in the z/OS UNIX file system, or to another print class.
Use the DISP parameter of the SYSLIN DD statement to indicate whether the object
code data set is to be:
| v Passed to the binder (linkage-editor)
v Cataloged
v Kept
v Added to an existing cataloged library
In the example above, the data is created and passed to another job step, the
| binder (linkage-editor) job step.
Your installation might use the DECK option and the SYSPUNCH DD statement. B is the
standard output class for punch data sets:
//SYSPUNCH DD SYSOUT=B
You do not need the SYSLIN DD statement if the NOOBJECT option is in effect. You do
not need the SYSPUNCH DD statement if the NODECK option is in effect.
RELATED REFERENCES
OBJECT on page 340
DECK on page 319
The SYSADATA file will be a sequential file that contains specific record types that
have information about the program that is collected during compilation. The file
can be a traditional MVS data set or a z/OS UNIX file.
RELATED REFERENCES
ADATA on page 305
RELATED TASKS
Compiling OO applications in JCL or TSO/E on page 295
The SYSMDECK file will contain a copy of the updated input source after library
processing, that is, the result of COPY, BASIS, REPLACE, EXEC SQL INCLUDE, and EXEC
SQLIMS INCLUDE statements. The file can be a traditional MVS data set or a z/OS
UNIX file.
RELATED REFERENCES
MDECK on page 336
For options that are not fixed, you can override the default settings by specifying
compiler options in any of these ways:
v Code them on the PROCESS or CBL statement in COBOL source.
v Include them when you start the compiler, either on the PARM parameter on the
EXEC statement in the JCL or on the command line under TSO.
v Include them in a SYSOPTF data set, and specify the OPTFILE compiler option in
either of the above ways.
The compiler recognizes the options in the following order of precedence from
highest to lowest:
1. Installation defaults that are fixed by your site
2. Values of the BUFSIZE, OUTDD, SQL, and SQLIMS compiler options in effect for the
first program in a batch
3. Options specified on PROCESS (or CBL) statements, preceding the IDENTIFICATION
DIVISION
4. Options specified on the compiler invocation (JCL PARM parameter or the TSO
CALL command)
5. Installation defaults that are not fixed
The precedence of options in a SYSOPTF data set depends on where you specify the
OPTFILE compiler option. For example, if you specify OPTFILE in a PROCESS
statement, the SYSOPTF options supersede the options that you specify in the
compiler invocation. For further details, see the related reference below about the
OPTFILE option.
Most of the options come in pairs; you select one or the other. For example, the
option pair for a cross-reference listing is XREF|NOXREF. If you want a
cross-reference listing, specify XREF; if you do not, specify NOXREF.
Some options have subparameters. For example, if you want 44 lines per page on
your listings, specify LINECOUNT(44).
RELATED TASKS
Defining a compiler-option data set (SYSOPTF) on page 269
Specifying compiler options in the PROCESS (CBL) statement
Specifying compiler options in a batch compilation on page 277
RELATED REFERENCES
Compiler options and compiler output under z/OS on page 274
Chapter 17, Compiler options, on page 301
Conflicting compiler options on page 304
OPTFILE on page 342
CBL
PROCESS options-list
If you do not use a sequence field, you can start a PROCESS statement in column 1
or after. If you use a sequence field, the sequence number must start in column 1
and must contain six characters; the first character must be numeric. If used with a
sequence field, PROCESS can start in column 8 or after.
You can use CBL as a synonym for PROCESS. CBL can likewise start in column 1 or
after if you do not use a sequence field. If used with a sequence field, CBL can start
in column 8 or after.
You must end PROCESS and CBL statements at or before column 72.
You can code more than one PROCESS or CBL statement. If you do so, the statements
must follow one another with no intervening statements. You cannot continue
options across multiple PROCESS or CBL statements.
Your programming organization can inhibit the use of PROCESS (CBL) statements by
using the default options module of the COBOL compiler. If PROCESS or CBL
statements that are not allowed by the organization are found in a COBOL
program, the COBOL compiler generates error diagnostics.
RELATED REFERENCES
Reference format (Enterprise COBOL Language Reference)
CBL (PROCESS) statement (Enterprise COBOL Language Reference)
Listing output from compilation will be in the data set defined by SYSPRINT; object
output will be in SYSLIN or SYSPUNCH. Progress and diagnostic messages can be
directed to the SYSTERM data set and included in the SYSPRINT data set. The
database request module (DBRM) is the data set defined in DBRMLIB.
Save the listings you produced during compilation. You can use them during the
testing of your work if you need to debug or tune. You might also use the listings
for diagnosis and debugging after the application is in production.
After compilation, fix any errors that the compiler found in your program. If no
| errors were detected, you can go to the next step in the process: binding
| (link-editing) your program. (If you used compiler options to suppress object code
generation, you must recompile to obtain object code.)
RELATED TASKS
Language Environment Programming Guide (Preparing to link-edit and run)
RELATED REFERENCES
Messages and listings for compiler-detected errors on page 280
Chapter 17, Compiler options, on page 301
When you compile several programs as part of a batch job, you need to:
| v Determine whether you want to create one or more program objects.
v Terminate each program in the sequence.
v Specify compiler options, with an awareness of the effect of compiler options
specified in programs within the batch job.
Use the END PROGRAM marker to terminate each program in the sequence except the
last program in the batch (for which the END PROGRAM marker is optional).
Alternatively, you can precede each program in the sequence with a CBL or PROCESS
statement.
If you omit the END PROGRAM marker from a program (other than the last program
in a sequence of separate programs), the next program in the sequence will be
nested in the preceding program. An error can occur in either of the following
situations:
v A PROCESS statement is in a program that is now nested.
v A CBL statement is not coded entirely in the sequence number area (columns 1
through 6).
If a CBL statement is coded entirely in the sequence number area (columns 1
through 6), no error message is issued for the CBL statement because it is
considered a label for the source statement line.
RELATED TASKS
Specifying compiler options in a batch compilation on page 277
RELATED REFERENCES
NAME on page 337
RELATED REFERENCES
Language Environment Programming Guide (IBM-supplied cataloged procedures)
You should be aware of the effect of certain compiler options on the precedence of
compiler option settings for each program in the batch sequence. Compiler options
are recognized in the following order of precedence, from highest to lowest:
1. Installation defaults that are fixed at your site
2. Values of the BUFSIZE, OUTDD, SIZE, SQL, and SQLIMS compiler options in effect
for the first program in the batch
3. Options on CBL or PROCESS statements, if any, for the current program
4. Options specified in the compiler invocation (JCL PARM or TSO CALL)
5. Installation defaults that are not fixed
If any program in the batch sequence requires the BUF, OUTDD, SIZE, SQL or SQLIMS
option, that option must be in effect for the first program in the batch sequence.
(When processing BASIS, COPY, or REPLACE statements, the compiler handles all
programs in the batch as a single input file.)
If the compiler diagnoses the LANGUAGE option on the CBL or PROCESS statement as
an error, the language selection reverts to what was in effect before the compiler
encountered the first CBL or PROCESS statement. The language in effect during a
batch compilation conforms to the rules of processing CBL or PROCESS statements in
that environment.
For the program COMPILE1, the default language English (EN) is in effect when the
compiler scans the invocation options. A diagnostic message is issued in
mixed-case English because XX is a nonexistent language identifier. The default EN
remains in effect when the compiler scans the CBL statement. The unrecognized
option APOST in the CBL statement is diagnosed in mixed-case English because the
CBL statement has not completed processing and EN was the last valid language
option. After the compiler processes the CBL options, the language in effect
becomes Japanese (JP).
The program COMPILE3 has no CBL statement. It inherits the language in effect,
Japanese (JP), from the previous compilation.
After compiling COMPILE3, the compiler resets the language in effect to English (EN)
because of the CBL statement. The language option in the CBL statement resolves
the last-specified two-character alphanumeric language identifier, YY. Because YY is
nonexistent, the language in effect remains English.
In contrast with the four lower levels of severities, an unrecoverable (U-level) error
might not result from a mistake in your source program. It could come from a flaw
in the compiler itself or in the operating system. In such cases, the problem must
be resolved, because the compiler is forced to end early and does not produce
complete object code or a complete listing. If the message occurs for a program
that has many S-level syntax errors, correct those errors and compile the program
again. You can also resolve job set-up problems (such as missing data-set
definitions or insufficient storage for compiler processing) by making changes to
the compile job. If your compile job setup is correct and you have corrected the
S-level syntax errors, you need to contact IBM to investigate other U-level errors.
After correcting the errors in your source program, recompile the program. If this
second compilation is successful, proceed to the link-editing step. If the compiler
still finds problems, repeat the above procedure until only informational messages
are returned.
RELATED TASKS
Generating a list of compiler messages
RELATED REFERENCES
Messages and listings for compiler-detected errors
You can code just the PROGRAM-ID paragraph, as shown below, and omit the rest of
the program.
Identification Division.
Program-ID. ErrMsg.
RELATED TASKS
Customizing compiler-message severities on page 710
RELATED REFERENCES
Messages and listings for compiler-detected errors
Format of compiler diagnostic messages on page 281
Each message in the listing provides information about the nature of the problem,
its severity, and the compiler phase that detected it. Wherever possible, the
message provides specific instructions for correcting an error.
The messages for compilation errors (ordered by line number) are displayed near
the end of the listing for each program.
A summary of all problems found during compilation is displayed near the bottom
of the listing.
RELATED TASKS
Correcting errors in your source program on page 279
Generating a list of compiler messages on page 280
RELATED REFERENCES
Format of compiler diagnostic messages
Severity codes for compiler diagnostic messages on page 282
FLAG on page 327
Tip: If you used the FLAG option to suppress messages, there might be additional
errors in your program.
RELATED REFERENCES
Severity codes for compiler diagnostic messages on page 282
FLAG on page 327
The final return code at the end of compilation is generally the highest return code
that occurred for any message during the compilation.
You can suppress compiler diagnostic messages or change their severities, however,
which can have an effect upon the final compilation return code. For details, see
the related information.
RELATED TASKS
Customizing compiler-message severities on page 710
RELATED REFERENCES
Processing of MSGEXIT on page 709
As part of the compilation step, you define the files needed for the compilation,
and specify any compiler options or compiler-directing statements that are
necessary for your program and for the output that you want.
The main job of the compiler is to translate COBOL programs into language that
the computer can process (object code). The compiler also lists errors in source
statements and provides supplementary information to help you debug and tune
programs.
RELATED TASKS
Setting environment variables under z/OS UNIX
Specifying compiler options under z/OS UNIX on page 284
Compiling and linking with the cob2 command on page 285
Compiling using scripts on page 290
Compiling, linking, and running OO applications under z/OS UNIX on page 291
RELATED REFERENCES
Data sets used by the compiler under z/OS on page 267
Compiler options and compiler output under z/OS on page 274
Set the environment variables for the compiler by using the export command. For
example, to set the SYSLIB variable, issue the export command from the shell or
from a script file:
export SYSLIB=/u/mystuff/copybooks
The value that you assign to an environment variable can include other
environment variables or the variable itself. The values of these variables apply
only when you compile from the shell where you issue the export command. If
you do not set an environment variable, either a default value is applied or the
variable is not defined. The environment-variable names must be uppercase.
The environment variables that you can set for use by the compiler are as follows:
COBOPT
Specify compiler options separated by blanks or commas. Separate
suboptions with commas. Blanks at the beginning or the end of the
variable value are ignored. Delimit the list of options with quotation marks
if it contains blanks or characters that are significant to the z/OS UNIX
shell. For example:
export COBOPT="TRUNC(OPT) XREF"
RELATED TASKS
Specifying compiler options under z/OS UNIX
Compiling and linking with the cob2 command on page 285
Setting and accessing environment variables on page 454
RELATED REFERENCES
Chapter 18, Compiler-directing statements, on page 373
Chapter 17, Compiler options, on page 301
COPY statement (Enterprise COBOL Language Reference)
For options that are not fixed, you can override the default settings by specifying
compiler options in any of three ways:
v Code them on the PROCESS or CBL statement in your COBOL source.
v Specify the -q option of the cob2 command.
v Set the COBOPT environment variable.
The compiler recognizes the options in the above order of precedence, from highest
to lowest. The order of precedence also determines which options are in effect
when conflicting or mutually exclusive options are specified. When you compile
using the cob2 command, compiler options are recognized in the following order
of precedence, from highest to lowest:
1. Installation defaults fixed as nonoverridable
Restrictions:
v Do not use the SQL compiler option under z/OS UNIX.
Neither the separate SQL precompiler nor the integrated SQL coprocessor runs
under z/OS UNIX.
v Do not use the SQLIMS compiler option under z/OS UNIX.
v The OPTFILE option is ignored when you compile using the cob2 command
under z/OS UNIX.
You can use the COBOPT environment variable, which provides a capability that
is comparable to OPTFILE, instead.
RELATED TASKS
Specifying compiler options in the PROCESS (CBL) statement on page 273
Setting environment variables under z/OS UNIX on page 283
Compiling and linking with the cob2 command
RELATED REFERENCES
Conflicting compiler options on page 304
Chapter 17, Compiler options, on page 301
When you compile COBOL programs for z/OS UNIX, the RENT option is required.
The cob2 command automatically includes the COBOL compiler options RENT and
TERM.
The cob2 command invokes the COBOL compiler that is found through the
standard MVS search order. If the COBOL compiler is not installed in the LNKLST,
or if more than one level of IBM COBOL compiler is installed on your system, you
can specify in the STEPLIB environment variable the compiler PDS that you want
to use. For example, the following statement specifies IGY.V5R1M0 as the compiler
PDS:
export STEPLIB=IGY.V5R1M0.SIGYCOMP
The cob2 command implicitly uses the z/OS UNIX shell command c89 for the link
step. c89 is the shell interface to the linker (the z/OS program management
binder).
The default location for compiler input and output is the current directory.
The listing output that you request from the compilation of a COBOL source
program file.cbl is written to file.lst. The listing output that you request from the
linker is written to stdout.
RELATED TASKS
Creating a DLL under z/OS UNIX
Preparing OO applications under z/OS UNIX on page 292
UNIX System Services User's Guide
RELATED REFERENCES
cob2 syntax and options on page 287
cob2 input and output files on page 288
UNIX System Services Command Reference
The name of the DLL definition side file is based on the output file-name. If the
output name has a suffix, that suffix is replaced with x to form the side-file name.
For example, if the output file-name is foo.dll, the side-file name is foo.x.
To use the DLL definition side file later when you create a module that calls that
DLL, specify the side file with any other object files (file.o) that you need to link.
For example, the following command compiles myappl.cbl, uses the DLL option to
enable myappl.o to reference DLLs, and links to produce the module myappl:
cob2 -o myappl -qdll myappl.cbl mydll.x
RELATED TASKS
Chapter 26, Creating a DLL or a DLL application, on page 497
Compiling programs to create DLLs on page 498
RELATED REFERENCES
cob2 syntax and options on page 287
cob2 input and output files on page 288
cob2 filenames
options
-bxxx Passes the string xxx to the linker as parameters. xxx is a list of linker
options in name=value format, separated by commas. You must spell out
both the name and the value in full (except for the special cases noted
below). The name and value are case insensitive. Do not use any spaces
between -b and xxx.
If you do not specify a value for an option, a default value of YES is used
except for the following options, which have the indicated default values:
v LIST=NOIMPORT
v ALIASES=ALL
v COMPAT=CURRENT
v DYNAM=DLL
One special value for xxx is dll, which specifies that the executable
module is to be a DLL. This string is not passed to the linker.
-c Compiles programs but does not link them.
-comprc_ok=n
Controls cob2 behavior on the return code from the compiler. If the return
code is less than or equal to n, cob2 continues to the link step or, in the
compile-only case, exits with a zero return code. If the return code
returned by the compiler is greater than n, cob2 exits with the same return
code. When the c89 command is implicitly invoked by cob2 for the link
step, the exit value from the c89 command is used as the return code from
the cob2 command.
The default is -comprc_ok=4.
-e xxx Specifies the name of a program to be used as the entry point of the
RELATED TASKS
Compiling and linking with the cob2 command on page 285
Creating a DLL under z/OS UNIX on page 286
Setting environment variables under z/OS UNIX on page 283
If you use the cob2 command, the following files are created in the current
directory.
Table 40. Output files from the cob2 command
File name Description Comments
file Executable module or DLL Created by the linker if you specify the
cob2 option -o file
a.out Executable module or DLL Created by the linker if you do not
specify the cob2 option -o
file.adt Associated data (ADATA) file Created by the compiler if you specify
corresponding to input COBOL compiler option ADATA
source program file.cbl
file.dbg Symbolic information tables for Created by the compiler if you specify
Debug Tool corresponding to input compiler option TEST(. . .,SEP,. . .)
COBOL source program file.cbl
file.dek Extended COBOL source output Created by the compiler if you specify
from library processing compiler option MDECK
file.lst Listing file corresponding to input Created by the compiler
COBOL source program file.cbl
file.o Object file corresponding to input Created by the compiler
COBOL source program file.cbl
file.x DLL definition side file Created during the cob2 linking phase
when creating file.dll
class.java Java class definition (source) Created when you compile a class
definition
RELATED TASKS
Compiling and linking with the cob2 command on page 285
RELATED REFERENCES
ADATA on page 305
MDECK on page 336
TEST on page 359
UNIX System Services Command Reference
RELATED TASKS
Compiling, linking, and running OO applications under z/OS UNIX
Compiling, linking, and running OO applications in JCL or TSO/E on page 295
Using Java SDKs for z/OS on page 299
RELATED TASKS
Compiling OO applications under z/OS UNIX
Preparing OO applications under z/OS UNIX on page 292
Running OO applications under z/OS UNIX on page 293
To compile COBOL source code that contains OO syntax such as INVOKE statements
or class definitions, or that uses Java services, you must use these compiler
options: RENT, DLL, THREAD, and DBCS. (The RENT and DBCS options are defaults.)
A COBOL source file that contains a class definition must not contain any other
class or program definitions.
When you compile a COBOL class definition, two output files are generated:
v The object file (.o) for the class definition.
v A Java source program (.java) that contains a class definition that corresponds to
the COBOL class definition. Do not edit this generated Java class definition in
any way. If you change the COBOL class definition, you must regenerate both
the object file and the Java class definition by recompiling the updated COBOL
class definition.
If a COBOL client program or class definition includes the file JNI.cpy by using a
COPY statement, specify the include subdirectory of the COBOL install directory
(typically /usr/lpp/cobol/include) in the search order for copybooks. You can
specify the include subdirectory by using the -I option of the cob2 command or
by setting the SYSLIB environment variable.
RELATED TASKS
Chapter 15, Compiling under z/OS UNIX, on page 283
RELATED REFERENCES
cob2 syntax and options on page 287
DBCS on page 318
DLL on page 321
RENT on page 348
THREAD on page 362
To prepare an OO COBOL client program for execution, link the object file with
the following two DLL side files to create an executable module:
v libjvm.x, which is provided with your IBM Java Software Development Kit.
v igzcjava.x, which is provided in the lib subdirectory of the cobol directory in
the z/OS UNIX file system. The typical complete path is /usr/lpp/cobol/lib/
igzcjava.x. This DLL side file is also available as the member IGZCJAVA in the
SCEELIB PDS (part of Language Environment).
For a COBOL source file Classname.cbl that contains the class definition for
Classname, you would use the following commands to compile and link the
components of the application:
Table 41. Commands for compiling and linking a class definition
Command Input Output
cob2 -c -qdll,thread Classname.cbl Classname.cbl Classname.o,
Classname.java
cob2 -bdll -o libClassname.so Classname.o Classname.o libClassname.so
/usr/lpp/java/J5.0/bin/j9vm/libjvm.x
/usr/lpp/cobol/lib/igzcjava.x
javac Classname.java Classname.java Classname.class
After you issue the cob2 and javac commands successfully, you have the
executable components for the program: the executable DLL module
libClassname.so and the class file Classname.class. All files from these commands
are generated in the current working directory.
RELATED TASKS
Chapter 15, Compiling under z/OS UNIX, on page 283
REPOSITORY paragraph for defining a class on page 584
RELATED REFERENCES
cob2 syntax and options on page 287
| Object-oriented syntax, and Java 6, Java 7, or Java 8 on page 300
Manager.cbl
Identification division.
Class-id Manager inherits Employee.
Environment division.
Configuration section.
Repository.
Class Manager is "Manager"
...
Manager.java Manager.o
Manager.class libManager.so
The class file Manager.class and the DLL module libManager.so are the executable
components of the application, and are generated in the current working directory.
Specify the directory that contains the DLLs for the COBOL classes in the LIBPATH
environment variable. Specify the directory paths for the Java class files that are
associated with the COBOL classes in the CLASSPATH environment variable as
follows:
v For classes that are not part of a package, end the class path with the directory
that contains the .class files.
RELATED TASKS
Running OO applications that start with a main method
Running OO applications that start with a COBOL program
Running J2EE COBOL clients on page 295
Chapter 23, Running COBOL programs under z/OS UNIX, on page 453
Setting and accessing environment variables on page 454
Chapter 30, Writing object-oriented programs, on page 579
Structuring OO applications on page 620
The java command initializes the Java virtual machine (JVM). To customize the
initialization of the JVM, specify options on the java command as in the following
examples:
Table 42. java command options for customizing the JVM
Purpose Option
To set a system property -Dname=value
To request that the JVM generate verbose messages about -verbose:gc
garbage collection
To request that the JVM generate verbose messages about class -verbose:class
loading
To request that the JVM generate verbose messages about -verbose:jni
native methods and other Java Native Interface activity
To set the initial Java heap size to value bytes -Xmsvalue
To set the maximum Java heap size to value bytes -Xmxvalue
For details about the options that the JVM supports, see the output from the java
-h command, or see the related references.
RELATED REFERENCES
IBM SDK for Java - Tools Documentation
WebSphere for z/OS: Applications (Java Naming and Directory Interface (JNDI))
RELATED TASKS
Using Java SDKs for z/OS on page 299
Chapter 23, Running COBOL programs under z/OS UNIX, on page 453
Setting and accessing environment variables on page 454
RELATED REFERENCES
IBM SDK for Java - Tools Documentation
WebSphere for z/OS: Applications (Java Naming and Directory Interface (JNDI))
Before you run a COBOL J2EE client, you must set the Java system property
java.naming.factory.initial to access WebSphere naming services. For example:
export COBJVMINITOPTIONS
="-Djava.naming.factory.initial=com.ibm.websphere.naming.WsnInitialContextFactory"
RELATED TASKS
Compiling OO applications in JCL or TSO/E
Preparing and running OO applications in JCL or TSO/E on page 296
Compiling, linking, and running OO applications under z/OS UNIX on page 291
If the COBOL program or class definition uses the JNI environment structure to
access JNI callable services, copy the file JNI.cpy from the z/OS UNIX file system
to a PDS or PDSE member called JNI, identify that library with a SYSLIB DD
statement, and use a COPY statement of the form COPY JNI in the COBOL source.
When you compile a COBOL class definition, a Java source program that contains
a class definition that corresponds to the COBOL class definition is generated in
addition to the object file. Use the SYSJAVA ddname to write the generated Java
source file to a file in the z/OS UNIX file system. For example:
//SYSJAVA DD PATH=/u/userid/java/Classname.java,
// PATHOPTS=(OWRONLY,OCREAT,OTRUNC),
// PATHMODE=SIRWXU,
// FILEDATA=TEXT
Do not edit this generated Java class definition in any way. If you change the
COBOL class definition, you must regenerate both the object file and the Java class
definition by recompiling the updated COBOL class definition.
Compile Java class definitions by using the javac command from a z/OS UNIX
shell command prompt, or by using the BPXBATCH utility.
RELATED TASKS
Compiling with JCL on page 255
Compiling under TSO on page 262
Specifying source libraries (SYSLIB) on page 270
Defining the Java-source output file (SYSJAVA) on page 272
Accessing JNI services on page 623
Compiling OO applications under z/OS UNIX on page 291
Preparing OO applications under z/OS UNIX on page 292
RELATED REFERENCES
DBCS on page 318
DLL on page 321
RENT on page 348
THREAD on page 362
Appendix E, JNI.cpy copybook, on page 721
UNIX System Services User's Guide (The BPXBATCH utility)
When you run an OO application that starts with a COBOL program by using
standard batch JCL or the TSO/E CALL command, follow these guidelines:
v Use the _CEE_ENVFILE environment variable to indicate the location of the file
that contains the environment variable settings required by Java. Set
_CEE_ENVFILE by using the ENVAR runtime option.
v Specify the POSIX(ON) and XPLINK(ON) runtime option.
v Use DD statements to specify files in the z/OS UNIX file system for the standard
input, output, and error streams for Java:
JAVAIN DD for the input from statements such as c=System.in.read();
JAVAOUT DD for the output from statements such as
System.out.println(string);
JAVAERR DD for the output from statements such as
System.err.println(string);
v Ensure that the SCEERUN2 and SCEERUN load libraries are available in the
system library search order, for example, by using a STEPLIB DD statement.
RELATED TASKS
Preparing OO applications under z/OS UNIX on page 292
Running OO applications under z/OS UNIX on page 293
Structuring OO applications on page 620
UNIX System Services User's Guide (The BPXBATCH utility)
Language Environment Programming Guide (Running an application under batch)
RELATED REFERENCES
XL C/C++ Programming Guide (_CEE_ENVFILE)
Language Environment Programming Reference (ENVAR)
HelloJ.java is compiled with the javac command. The resulting .class file resides in
the z/OS UNIX file system directory u/userid/ootest/tsthello, which is specified
in the CLASSPATH environment variable in the environment variable settings file.
If the application starts with a Java program or the main factory method of a
COBOL class, the XPLINK environment is automatically started by the java
command that starts the JVM and runs the application.
RELATED TASKS
Running OO applications under z/OS UNIX on page 293
Setting and accessing environment variables on page 454
RELATED REFERENCES
| Object-oriented syntax, and Java 6, Java 7, or Java 8
Runtime environment variables on page 455
Language Environment Programming Reference (XPLINK)
XL C/C++ Programming Guide (_CEE_RUNOPTS)
RELATED TASKS
Preparing OO applications under z/OS UNIX on page 292
Compiler options affect the aspects of your program that are listed in the table
below. The linked-to information for each option provides the syntax for specifying
the option and describes the option, its parameters, and its interaction with other
parameters.
Table 43. Compiler options
Aspect of your
program Compiler option Default Option abbreviations
Source language ARITH on page 309 ARITH(COMPAT) AR(C|E)
CICS on page 312 NOCICS None
CODEPAGE on page 313 CODEPAGE(1140) CP(ccsid)
CURRENCY on page 317 NOCURRENCY CURR|NOCURR
DBCS on page 318 DBCS None
NSYMBOL on page 338 NSYMBOL(NATIONAL) NS(DBCS|NAT)
NUMBER on page 339 NONUMBER NUM|NONUM
| QUALIFY on page 347 QUALIFY(COMPAT) QUA(C|E)
QUOTE/APOST on page 348 QUOTE Q|APOST
SEQUENCE on page 352 SEQUENCE SEQ|NOSEQ
SQL on page 354 NOSQL None
SQLCCSID on page 355 SQLCCSID SQLC|NOSQLC
SQLIMS on page 356 NOSQLIMS None
WORD on page 367 NOWORD WD|NOWD
| XMLPARSE on page 368 XMLPARSE(XMLSS) XP(X)|XP(C)
Date processing INTDATE on page 331 INTDATE(ANSI) None
Maps and listings LANGUAGE on page 331 LANGUAGE(ENGLISH) LANG(EN|UE|JA|JP)
LINECOUNT on page 332 LINECOUNT(60) LC
LIST on page 333 NOLIST None
MAP on page 333 NOMAP None
OFFSET on page 341 NOOFFSET OFF|NOOFF
SOURCE on page 353 SOURCE S|NOS
SPACE on page 354 SPACE(1) None
TERMINAL on page 359 NOTERMINAL TERM|NOTERM
VBREF on page 366 NOVBREF None
XREF on page 369 XREF(FULL) X|NOX
Installation defaults: The default compiler options that were set up when your
compiler was installed are in effect for your program unless you override those
options. (In some installations, certain compiler options are fixed so that you
cannot override them. If you have problems with the default options, contact your
system administrator.) To determine which are the default options, run a test
compilation without specifying any compiler options. The output listing lists the
default options in effect at your site.
Option specification: Compiler options and suboptions are not case sensitive.
Performance considerations: The AFP, ARCH, ARITH, AWO, BLOCK0, DYNAM, FASTSRT,
HGPR, MAXPCF, NUMPROC, OPTIMIZE, RENT, SQLCCSID, SSRANGE, STGOPT, TEST, THREAD, and
TRUNC compiler options can affect runtime performance.
RELATED TASKS
Chapter 14, Compiling under z/OS, on page 255
Compiling under TSO on page 262
Chapter 15, Compiling under z/OS UNIX, on page 283
Chapter 33, Tuning your program, on page 651
RELATED REFERENCES
Conflicting compiler options on page 304
Chapter 18, Compiler-directing statements, on page 373
| Option settings for 85 COBOL Standard conformance on page 304
Performance-related compiler options on page 659
You can use the FLAGSTD compiler option to flag nonconforming elements such as
IBM extensions.
RELATED REFERENCES
Language Environment Programming Reference
When conflicting options are specified at the same level in the hierarchy (such as
specifying both DECK and NODECK in a PROCESS or CBL statement), the option
specified last takes effect.
If you specify mutually exclusive compiler options at the same level, the compiler
generates an error message and forces one of the options to a nonconflicting value.
For example, if you specify both OFFSET and LIST in a PROCESS statement in any
order, OFFSET takes effect and LIST is ignored.
304 Enterprise COBOL for z/OS, V5.2 Programming Guide
However, options coded at a higher level of precedence override any options
specified at a lower level of precedence. For example, if you code OFFSET in a JCL
statement but LIST in a PROCESS statement, LIST takes effect because the options
coded in the PROCESS statement and any options forced on by an option coded in
the PROCESS statement have higher precedence.
Table 44. Mutually exclusive compiler options
Specified Ignored1 Forced on1
CICS DYNAM NODYNAM
NORENT RENT
DLL DYNAM NODYNAM
NORENT RENT
EXPORTALL NODLL DLL
DYNAM NODYNAM
NORENT RENT
NORENT RMODE(ANY) RMODE(24)
NSYMBOL(NATIONAL) NODBCS DBCS
OBJECT DECK NODECK
OFFSET LIST NOLIST
PGMNAME(LM|LU) NAME NONAME
TEST NOOBJECT and NODECK OBJECT and NODECK
THREAD NORENT RENT
WORD FLAGSTD NOFLAGSTD
RELATED TASKS
Specifying compiler options under z/OS on page 272
Specifying compiler options in a batch compilation on page 277
Specifying compiler options under z/OS UNIX on page 284
RELATED REFERENCES
OPTFILE on page 342
ADATA
Use ADATA when you want the compiler to create a SYSADATA file that contains
records of additional compilation information.
NOADATA
ADATA
ADATA is required for remote compilation using an IBM Windows COBOL compiler.
On z/OS, the SYSADATA file is written to ddname SYSADATA.
The size of the SYSADATA file generally grows with the size of the associated
program.
Option specification: You cannot specify the ADATA option in a PROCESS (or CBL)
statement. You can specify it only in one of the following ways:
v In the PARM parameter of JCL
v As a cob2 command option
v As an installation default
v In the COBOPT environment variable
RELATED REFERENCES
Setting environment variables under z/OS UNIX on page 283
cob2 syntax and options on page 287
Appendix F, COBOL SYSADATA file contents, on page 727
ADV
ADV has meaning only if you use WRITE . . . ADVANCING in your source code. With
ADV in effect, the compiler adds 1 byte to the record length to account for the
printer control character.
ADV
NOADV
Use NOADV if you already adjusted record length to include 1 byte for the printer
control character.
AFP
The AFP option controls the compiler usage of the Additional Floating Point (AFP)
registers that are provided by z/Architecture processors.
VOLATILE
AFP( NOVOLATILE )
The Enterprise COBOL compiler generates code that uses the full complement of
16 floating point registers (FPR) provided by a z/Architecture processor. These
FPRs are as follows:
v Original FPRs, which are numbered 0, 2, 4, and 6
v AFP registers, which are numbered 1, 3, 5, 7, and 8-15
Note: If your code runs on a version of CICS Transaction Server that is earlier than
V4.1, you must specify AFP(VOLATILE).
AFP(VOLATILE)
If you specify AFP(VOLATILE), the AFP registers 8-15 are considered volatile,
which means that they might be changed by a called subprogram.
Therefore, the COBOL compiler generates extra code to protect the values
in these registers.
AFP(NOVOLATILE)
If you specify AFP(NOVOLATILE), the AFP registers 8-15 are considered
nonvolatile, which means that they are known to be unchanged or
preserved by every called subprogram. Therefore, the compiler can
generate more efficient code sequences for programs with floating point
operations. It is the normal z/OS architecture convention.
ARCH
The ARCH option specifies the machine architecture for which the executable
program instructions are to be generated.
7
ARCH( 8 )
9
10
11
Note: A higher ARCH level includes the facilities of the lower ARCH level. For
| example, ARCH(11) includes all the facilities of the lower ARCH levels.
For more information about these facilities, see z/Architecture Principles of Operation.
ARITH
ARITH affects the maximum number of digits that you can code for integers, and
the number of digits used in fixed-point intermediate results.
COMPAT
ARITH( EXTEND )
AWO
If you specify AWO, an implicit APPLY WRITE-ONLY clause is activated for all QSAM
files in the program that have blocked variable-length records.
NOAWO
AWO
RELATED TASKS
Optimizing buffer and device space on page 10
RELATED REFERENCES
BLOCK0
APPLY WRITE-ONLY clause (Enterprise COBOL Language Reference)
BLOCK0
Use BLOCK0 to change the compiler default for QSAM files from unblocked to
blocked (as if BLOCK CONTAINS 0 were specified) and thus gain the benefit of
system-determined blocking for output files.
NOBLOCK0
BLOCK0
Specifying BLOCK0 activates an implicit BLOCK CONTAINS 0 clause for each file in the
program that meets the following three criteria:
v The FILE-CONTROL paragraph either specifies ORGANIZATION SEQUENTIAL or omits
the ORGANIZATION clause.
v The FD entry does not specify RECORDING MODE U.
Files for which the resulting BLOCK CONTAINS 0 clause is in effect have a blocking
factor that is determined at run time from the data definition or from the data-set
characteristics.
Interaction of the APPLY WRITE-ONLY clause and the AWO compiler option with
BLOCK0:
v If NOBLOCK0 is in effect, and the file description of a file that meets the three
criteria listed above specifies APPLY WRITE-ONLY, the compiler issues an error
message because APPLY WRITE-ONLY applies only to blocked files. But if BLOCK0 is
in effect, the result is that the file is blocked, and the APPLY WRITE-ONLY clause is
therefore accepted.
v AWO applies to any QSAM files that have blocked variable-length records. If
BLOCK0 is in effect, the result is that more files might be blocked than if NOBLOCK0
were in effect; thus AWO might apply to more files than it otherwise would.
Specifying BLOCK0 for existing programs might result in a change of behavior, and
in some cases produce undesirable results for files opened as INPUT. For example:
v The OPEN INPUT statement fails for files for which no block size can be
determined.
v Programs that continue after handling nonzero FILE STATUS codes for files
opened as INPUT might abnormally terminate when executing subsequent I/O
statements on those files.
For these reasons, after compiling with BLOCK0 you should investigate and test the
effects on your program.
For recommendations about blocking, see the related reference from the Enterprise
COBOL Migration Guide (in the information about migrating from CMPR2 to
NOCMPR2).
RELATED TASKS
Optimizing buffer and device space on page 10
Setting block sizes on page 167
RELATED REFERENCES
AWO on page 310
APPLY WRITE-ONLY clause (Enterprise COBOL Language Reference)
BLOCK CONTAINS clause (Enterprise COBOL Language Reference)
Enterprise COBOL Migration Guide
(Recommendation for DCB= parameters of JCL)
BUFSIZE
Use BUFSIZE to allocate an amount of main storage to the buffer for each compiler
work data set. Usually, a large buffer size improves the performance of the
compiler.
nnnnn
BUFSIZE( nnnK )
BUFSIZE cannot exceed the track capacity for the device used, nor can it exceed the
maximum allowed by data management services.
CICS
The CICS compiler option enables the integrated CICS translator and lets you
specify CICS suboptions. You must use the CICS option if your COBOL source
program contains EXEC CICS or EXEC DLI statements and the program has not been
processed by the separate CICS translator.
NOCICS
CICS
("CICS-suboption-string")
Use the CICS option only to compile CICS programs. Programs compiled with the
CICS option will not run in a non-CICS environment.
If you specify the NOCICS option, any CICS statements found in the source program
are diagnosed and discarded.
Use either quotation marks or single quotation marks to delimit the string of CICS
suboptions.
You can partition a long CICS suboption string into multiple suboption strings in
multiple CBL or PROCESS statements. The CICS suboptions are concatenated in the
order of their appearance. For example:
//STEP1 EXEC IGYWC, . . .
// PARM.COBOL=CICS("string1")
//COBOL.SYSIN DD *
The compiler passes the following suboption string to the integrated CICS
translator:
"string1 string2 string3"
The concatenated strings are delimited with single spaces as shown. If multiple
instances of the same CICS suboption are found, the last specification of that
suboption in the concatenated string prevails. The compiler limits the size of the
concatenated suboption string to 4 KB.
RELATED CONCEPTS
Integrated CICS translator on page 425
RELATED TASKS
Compiling with the CICS option on page 423
Separating CICS suboptions on page 425
CICS Application Programming Guide (Specifying CICS translator options)
RELATED REFERENCES
Conflicting compiler options on page 304
CODEPAGE
Use CODEPAGE to specify the coded character set identifier (CCSID) for an EBCDIC
code page for processing compile-time and runtime COBOL operations that are
sensitive to character encoding.
CODEPAGE(ccsid)
ccsid must be an integer that represents a valid CCSID for an EBCDIC code page.
The default CCSID 1140 is the equivalent of CCSID 37 (COM EUROPE EBCDIC),
but additionally includes the euro symbol.
However, the encoding of the following items in a COBOL source program is not
affected by the CODEPAGE compiler option:
v Data items that have USAGE NATIONAL
These items are always encoded in UTF-16 in big-endian format, CCSID 1200.
v Characters from the basic COBOL character set (see the table of these characters
in the related reference below about characters)
Though the encoding of the basic COBOL characters default currency sign ($),
quotation mark ("), and the lowercase Latin letters varies in different EBCDIC
code pages, the compiler always interprets these characters using the EBCDIC
code page 1140 encoding. In particular, the default currency sign is always the
character with value X5B (unless changed by the CURRENCY compiler option or
the CURRENCY SIGN clause in the SPECIAL-NAMES paragraph), and the quotation
mark is always the character with value X7F.
Some COBOL operations can override the CODEPAGE ccsid by using an explicit
encoding specification, for example:
v DISPLAY-OF and NATIONAL-OF intrinsic functions that specify a code page as the
second argument
v XML PARSE statements that specify the WITH ENCODING phrase
v XML GENERATE statements that specify the WITH ENCODING phrase
Additionally, you can use the CURRENCY compiler option or the CURRENCY SIGN
clause in the SPECIAL-NAMES paragraph to override:
v The default currency symbol used in the PICTURE character-strings for
numeric-edited data items in your source program
v The currency sign value used in the content of numeric-edited data items at run
time
Compile your COBOL program using the CODEPAGE option with the ccsid set to one
of the EBCDIC multibyte character set (MBCS) CCSIDs shown in the table below if
the program contains any of the following items:
v User-defined words formed with DBCS characters
v DBCS (USAGE DISPLAY-1) data items
v DBCS literals
All of the CCSIDs in the table below identify mixed code pages that refer to a
combination of SBCS and DBCS coded character sets. These are also the CCSIDs
that are supported for mixed data by DB2.
Table 45. EBCDIC multibyte coded character set identifiers
SBCS CCSID DBCS CCSID
National language MBCS CCSID component component
Japanese (Katakana-Kanji) 930 290 300
Japanese (Katakana-Kanji with euro) 1390 8482 16684
Japanese (Katakana-Kanji) 5026 290 4396
Japanese (Latin-Kanji) 939 1027 300
Japanese (Latin-Kanji with euro) 1399 5123 16684
Japanese (Latin-Kanji) 5035 1027 4396
Korean 933 833 834
Korean 1364 13121 4930
Simplified Chinese 935 836 837
Simplified Chinese 1388 13124 4933
Traditional Chinese 937 28709 835
Note: If you specify the TEST option, you must set the CODEPAGE option to the
CCSID that is used for the COBOL source program. In particular, programs that
use Japanese characters in DBCS literals or DBCS user-defined words must be
compiled with the CODEPAGE option set to a Japanese codepage CCSID.
RELATED CONCEPTS
COBOL and DB2 CCSID determination on page 437
RELATED TASKS
Using currency signs on page 65
Chapter 28, Processing XML input, on page 517
Chapter 29, Producing XML output, on page 561
RELATED REFERENCES
CURRENCY on page 317
SQLCCSID on page 355
TEST on page 359
The encoding of XML documents on page 536
Characters (Enterprise COBOL Language Reference)
S
NOCOMPILE( E )
W
COMPILE
NOCOMPILE
Use NOCOMPILE without any suboption to request a syntax check (only diagnostics
produced, no object code). If you use NOCOMPILE without any suboption, several
compiler options will have no effect because no object code will be produced, for
example: DECK, LIST, OBJECT, OFFSET, OPTIMIZE, SSRANGE, and TEST.
RELATED TASKS
Finding coding errors on page 382
RELATED REFERENCES
Messages and listings for compiler-detected errors on page 280
| COPYRIGHT
| Use COPYRIGHT to place a string in the object module if the object module is
| generated. If the object is linked into a program object, the string is loaded into
| memory with that program object.
| NOCOPYRIGHT
COPYRIGHT('copyright string')
|
||
CURRENCY
You can use the CURRENCY option to provide an alternate default currency symbol
to be used for a COBOL program. (The default currency symbol is the dollar sign
($).)
NOCURRENCY
CURRENCY(literal)
If your program processes only one currency type, you can use the CURRENCY
option as an alternative to the CURRENCY SIGN clause for indicating the currency
symbol you will use in the PICTURE clause of your program. If your program
processes more than one currency type, you should use the CURRENCY SIGN clause
with the WITH PICTURE SYMBOL phrase to specify the different currency sign types.
If you use both the CURRENCY option and the CURRENCY SIGN clause in a program,
the CURRENCY option is ignored. Currency symbols specified in the CURRENCY SIGN
clause or clauses can be used in PICTURE clauses.
When the NOCURRENCY option is in effect and you omit the CURRENCY SIGN clause,
the dollar sign ($) is used as the PICTURE symbol for the currency sign.
RELATED TASKS
Using currency signs on page 65
DATA
The DATA option affects whether storage for dynamic data areas and other dynamic
runtime storage is obtained from above or below the 16 MB line.
31
DATA( 24 )
For reentrant programs, the DATA compiler option and the HEAP runtime option
control whether storage for dynamic data areas (such as WORKING-STORAGE and FD
record areas) is obtained from below the 16 MB line (DATA(24)) or from
unrestricted storage (DATA(31)). (DATA does not affect the location of LOCAL-STORAGE
data; the STACK runtime option controls that location instead, along with the AMODE
of the program.)
Specify DATA(24) for programs that run in 31-bit addressing mode and that pass
data arguments to programs in 24-bit addressing mode. Doing so ensures that the
data will be addressable by the called program.
External data and QSAM buffers: The DATA option interacts with other compiler
options and runtime options that affect storage and its addressability. See the
related information for details.
RELATED CONCEPTS
Storage and its addressability on page 39
RELATED TASKS
Language Environment Programming Guide (Using runtime options)
RELATED REFERENCES
Allocation of buffers for QSAM files on page 181
DBCS
Using DBCS causes the compiler to recognize X0E (SO) and X0F (SI) as shift
codes for the double-byte portion of an alphanumeric literal.
DBCS
NODBCS
With DBCS in effect, the double-byte portion of the literal is syntax-checked and the
literal remains category alphanumeric.
RELATED REFERENCES
Conflicting compiler options on page 304
DECK
Use DECK to produce object code in the form of 80-column records. If you use the
DECK option, be certain that SYSPUNCH is defined in your JCL for compilation.
NODECK
DECK
RELATED TASKS
Creating object code (SYSLIN or SYSPUNCH) on page 271
DIAGTRUNC
DIAGTRUNC causes the compiler to issue a severity-4 (Warning) diagnostic message
for MOVE statements that have numeric receivers when the receiving data item has
fewer integer positions than the sending data item or literal. In statements that
have multiple receivers, the message is issued separately for each receiver that
could be truncated.
NODIAGTRUNC
DIAGTRUNC
The diagnostic message is also issued for implicit moves associated with
statements such as these:
v INITIALIZE
v READ . . . INTO
v RELEASE . . . FROM
v RETURN . . . INTO
v REWRITE . . . FROM
v WRITE . . . FROM
The diagnostic message is also issued for moves to numeric receivers from
alphanumeric data-names or literal senders, except when the sending field is
reference modified.
There is no diagnostic message for COMP-5 receivers, nor for binary receivers when
you specify the TRUNC(BIN) option.
RELATED CONCEPTS
Formats for numeric data on page 47
Reference modifiers on page 113
RELATED REFERENCES
TRUNC on page 363
DISPSIGN
The DISPSIGN option controls output formatting for DISPLAY of signed numeric
items.
COMPAT
DISPSIGN( SEP )
The following example shows the DISPLAY output with the DISPSIGN(COMPAT)
option or the DISPSIGN(SEP) option specified:
Table 46. DISPLAY output with the DISPSIGN(COMPAT) option or the DISPSIGN(SEP) option
specified:
DISPLAY output with the DISPLAY output with the
DISPSIGN(COMPAT) option DISPSIGN(SEP) option
Data items specified specified
Unsigned binary 111 111
Positive binary 111 +111
Negative binary 11J -111
Unsigned packed-decimal 222 222
Positive packed-decimal 222 +222
Negative packed-decimal 22K -222
Zoned-decimal unsigned 333 333
Zoned-decimal trailing 33C +333
positive
Zoned-decimal trailing 33L -333
negative
Zoned-decimal leading C33 +333
positive
Zoned-decimal leading L33 -333
negative
DLL
Use DLL to instruct the compiler to generate an object module that is enabled for
dynamic link library (DLL) support. DLL enablement is required if the program
will be part of a DLL, will reference DLLs, or if the program contains
object-oriented COBOL syntax such as INVOKE statements or class definitions.
| Note: The DLL option can be overridden for particular CALL statements by using
| the CALLINTERFACE directive.
NODLL
DLL
Link-edit considerations: COBOL programs that are compiled with the DLL option
must be link-edited with the RENT and AMODE 31 link-edit options.
NODLL instructs the compiler to generate an object module that is not enabled for
DLL usage.
RELATED TASKS
Making dynamic calls on page 467
RELATED REFERENCES
Conflicting compiler options on page 304
| CALLINTERFACE (Enterprise COBOL Language Reference)
DUMP
Use DUMP to produce a system dump at compile time for an internal compiler error.
NODUMP
DUMP
Not for general use: The DUMP option should be used only at the request of an IBM
representative.
The dump, which consists of a listing of the compiler's registers and a storage
dump, is intended primarily for diagnostic personnel for determining errors in the
compiler.
If you use the DUMP option, include a DD statement at compile time to define
SYSABEND, SYSUDUMP, or SYSMDUMP.
With DUMP, the compiler will not issue a diagnostic message before abnormal
termination processing. Instead, a user abend will be issued with an IGYppnnnn
message. In general, a message IGYppnnnn corresponds to a compile-time user
abend nnnn. However, both IGYpp5nnn and IGYpp1nnn messages produce a user
abend of 1nnn. You can usually distinguish whether the message is really a 5nnn or
a 1nnn by recompiling with the NODUMP option.
Using the DUMP and OPTIMIZE(1|2) compiler options together could cause the
compiler to produce a system dump instead of the following optimizer message:
"IGYOP3124-W This statement may cause a program exception at
execution time."
This situation does not represent a compiler error. Using the NODUMP option will
allow the compiler to issue message IGYOP3124-W and continue processing.
RELATED TASKS
Language Environment Debugging Guide (Understanding abend codes)
RELATED REFERENCES
Conflicting compiler options on page 304
DYNAM
Use DYNAM to cause nonnested, separately compiled programs invoked through the
CALL literal statement to be loaded for CALL, and deleted for CANCEL, dynamically at
run time.
| Note: The DYNAM option can be overridden for particular CALL statements by using
| the CALLINTERFACE directive.
CALL identifier statements always result in a runtime load of the target program and
are not affected by this option.
NODYNAM
DYNAM
Restriction: The DYNAM compiler option must not be used in the following cases:
v COBOL programs that are processed by the CICS translator or the CICS compiler
option
v COBOL programs that have EXEC SQL statements and are run under CICS or
DB2 call attach facility (CAF)
If your COBOL program calls programs that have been linked as dynamic link
libraries (DLLs), you must not use the DYNAM option. You must instead compile the
program with the NODYNAM and DLL options.
RELATED REFERENCES
Conflicting compiler options on page 304
| CALLINTERFACE (Enterprise COBOL Language Reference)
EXIT
Use the EXIT option to provide user-supplied modules in place of various compiler
functions.
For compiler input, use the INEXIT and LIBEXIT suboptions to provide modules in
place of SYSIN and SYSLIB (or copy library), respectively. For compiler output, use
the PRTEXIT suboption to provide a module in place of SYSPRINT.
To provide a module that will be called for each SYSADATA record immediately
after the record has been written out to the file, use the ADEXIT suboption.
NOEXIT
EXIT( )
INEXIT( mod1)
str1,
NOINEXIT
LIBEXIT( mod2)
str2,
NOLIBEXIT
PRTEXIT( mod3)
str3,
NOPRTEXIT
ADEXIT( mod4)
str4,
NOADEXIT
MSGEXIT( mod5)
str5,
NOMSGEXIT
If you specify the EXIT option without specifying at least one suboption, NOEXIT
will be in effect.
You can specify the EXIT option only at invocation in the JCL PARM field (under
TSO/E, in a command argument) or at installation time. Do not specify the EXIT
option in a PROCESS (CBL) statement.
INEXIT([str1,]mod1)
| The compiler reads source code from a user-supplied program object
(where mod1 is the module name) instead of SYSIN.
LIBEXIT([str2,]mod2)
| The compiler obtains copybooks from a user-supplied program object
(where mod2 is the module name) instead of library-name or SYSLIB. For
use with either COPY or BASIS statements.
PRTEXIT([str3,]mod3)
| The compiler passes printer-destined output to the user-supplied program
| object (where mod3 is the module name) instead of SYSPRINT.
ADEXIT([str4,]mod4)
| The compiler passes the SYSADATA output to the user-supplied program
| object (where mod4 is the module name).
MSGEXIT([str5,]mod5)
The compiler passes the message number, and passes the default severity
of a compiler diagnostic message, or the category (as a numeric code) of a
| FIPS compiler message, to the user-supplied program object (where mod5 is
the module name).
The names mod1, mod2, mod3, mod4, and mod5 can refer to the same module.
The suboptions str1, str2, str3, str4, and str5 are character strings that are passed to
| the program object. These strings are optional. They can be up to 64 characters in
length, and you must enclose them in single quotation marks. You can use any
character in the strings, but any included single quotation marks must be doubled.
Lowercase characters are folded to uppercase.
If one of str1, str2, str3, str4, or str5 is specified, that string is passed to the
appropriate user-exit module in the following format, where LL is a halfword (on a
halfword boundary) that contains the length of the string.
LL string
Compiler exit modules that are specified on the EXIT option can be implemented
either in an assembler language or in a high-level programming language such as
COBOL. However, when exits are written in a Language Environment conforming
programming language or Language Environment conforming assembler language,
the exit must be reentrant.
RELATED REFERENCES
Conflicting compiler options on page 304
FLAGSTD on page 328
Appendix D, EXIT compiler option, on page 701
EXPORTALL
Use EXPORTALL to instruct the compiler to automatically export the PROGRAM-ID
name and each alternate entry-point name from each program definition when the
object deck is link-edited to form a DLL.
NOEXPORTALL
EXPORTALL
With these symbols exported from the DLL, the exported program and entry-point
| names can be called from programs in the root program object, in other DLL
| program objects in the application, and from programs that are linked into that
DLL.
Specification of the EXPORTALL option requires that the RENT linker option also be
used.
NOEXPORTALL instructs the compiler to not export any symbols. In this case the
programs are accessible only from other routines that are link-edited into the same
| program object as the COBOL program definition.
RELATED REFERENCES
Conflicting compiler options on page 304
NOFASTSRT
FASTSRT
RELATED TASKS
Improving sort performance with FASTSRT on page 231
FLAG
Use FLAG(x) to produce diagnostic messages at the end of the source listing for
errors of a severity level x or above.
FLAG(x )
,y
NOFLAG
Error messages in the source listing are set off by the embedding of the statement
number in an arrow that points to the message code. The message code is followed
by the message text. For example:
When FLAG(x,y) is in effect, messages of severity y and above are embedded in the
listing after the line that caused the message. (See the related reference below for
information about messages for exceptions.)
Use NOFLAG to suppress error flagging. NOFLAG does not suppress error messages for
compiler options.
Embedded messages
v Embedding level-U messages is not recommended. The specification of
embedded level-U messages is accepted, but does not produce any messages in
the source.
v The FLAG option does not affect diagnostic messages that are produced before
the compiler options are processed.
v Diagnostic messages that are produced during processing of compiler options,
CBL or PROCESS statements, or BASIS, COPY, or REPLACE statements are not
embedded in the source listing. All such messages appear at the beginning of
the compiler output.
v Messages that are produced during processing of the *CONTROL or *CBL statement
are not embedded in the source listing.
RELATED REFERENCES
Messages and listings for compiler-detected errors on page 280
FLAGSTD
| Use FLAGSTD to specify the level or subset of the 85 COBOL Standard to be
| regarded as conforming, and to get informational messages about the 85 COBOL
| Standard elements that are included in your program.
NOFLAGSTD
FLAGSTD(x )
yy ,O
O (the letter) specifies that obsolete language elements are flagged as "obsolete."
The informational messages appear in the source program listing, and identify:
v The element as "obsolete," "nonconforming standard," or "nonconforming
nonstandard" (a language element that is both obsolete and nonconforming is
flagged as obsolete only)
v The clause, statement, or header that contains the element
v The source program line and beginning location of the clause, statement, or
header that contains the element
v The subset or optional module to which the element belongs
In the following example, the line number and column where a flagged clause,
statement, or header occurred are shown with the associated message code and
text. After that is a summary of the total number of flagged items and their type.
3 1 1 1
You can convert FIPS informational messages into diagnostic messages, and can
suppress FIPS messages, by using the MSGEXIT suboption of the EXIT compiler
option. For details, see the related reference about the processing of MSGEXIT, and
see the related task.
RELATED TASKS
Customizing compiler-message severities on page 710
RELATED REFERENCES
Conflicting compiler options on page 304
Processing of MSGEXIT on page 709
HGPR
The HGPR option controls the compiler usage of the 64-bit registers provided by
z/Architecture processors.
PRESERVE
HGPR( NOPRESERVE )
The Enterprise COBOL compiler uses the 64-bit width of the z/Architecture
General Purpose Registers (GPRs). HGPR stands for "High-halves of 64-bit GPRs",
which means the use of native 64-bit instructions.
HGPR(PRESERVE)
If you specify HGPR(PRESERVE), the compiler preserves the high halves of
the 64-bit GPRs that a program is using, by saving them in the prolog for
the function and restoring them in the epilog. The PRESERVE suboption is
necessary only if the caller of the program is not Enterprise COBOL,
Enterprise PL/I, or z/OS XL C/C++ compiler-generated code.
INTDATE
| INTDATE(ANSI) instructs the compiler to use the 85 COBOL Standard starting date
for integer dates used with date intrinsic functions. Day 1 is Jan 1, 1601.
INTDATE(LILIAN) instructs the compiler to use the Language Environment Lilian
starting date for integer dates used with date intrinsic functions. Day 1 is Oct 15,
1582.
ANSI
INTDATE( LILIAN )
With INTDATE(LILIAN), the date intrinsic functions return results that are
compatible with the Language Environment date callable services.
RELATED TASKS
Using date callable services on page 60
LANGUAGE
Use the LANGUAGE option to select the language in which compiler output will be
printed. The information that will be printed in the selected language includes
diagnostic messages, source listing page and scale headers, FIPS message headers,
message summary headers, compilation summary, and headers and notations that
result from the selection of certain compiler options (MAP, XREF, VBREF, and
FLAGSTD).
LANGUAGE(name)
name specifies the language for compiler output messages. Possible values for the
LANGUAGE option are shown in the table below.
Table 47. Values of the LANGUAGE compiler option
Name Abbreviation1 Output language
ENGLISH EN Mixed-case English (the default)
JAPANESE JA, JP Japanese, using the Japanese character set
2
UENGLISH UE Uppercase English
1. If your installation's system programmer has provided a language other than those
described, you must specify at least the first two characters of this other language's
name.
2. To specify a language other than UENGLISH, the appropriate language feature must be
installed.
NATLANG: The NATLANG runtime option allows you to control the national language
to be used for the runtime environment, including error messages, month names,
and day-of-the-week names. The LANGUAGE compiler option and the NATLANG
runtime option act independently of each other. You can use them together with
neither taking precedence over the other.
LINECOUNT
Use LINECOUNT(nnn) to specify the number of lines to be printed on each page of
the compilation listing, or use LINECOUNT(0) to suppress pagination.
LINECOUNT(nnn)
Abbreviations are: LC
If you specify LINECOUNT(0), no page ejects are generated in the compilation listing.
The compiler uses three lines of nnn for titles. For example, if you specify
LINECOUNT(60), 57 lines of source code are printed on each page of the output
listing.
NOLIST
LIST
If you want to limit the assembler listing output, use *CONTROL (or *CBL) LIST or
NOLIST statements in the PROCEDURE DIVISION. Source statements that follow a
*CONTROL NOLIST statement are not included in the listing until a subsequent
*CONTROL LIST statement switches the output back to normal LIST format.
RELATED TASKS
Getting listings on page 387
RELATED REFERENCES
Conflicting compiler options on page 304
*CONTROL (*CBL) statement (Enterprise COBOL Language Reference)
MAP
| Use the MAP option to create a listing of the DATA DIVISION items and all implicitly
| declared items. You can also specify whether hexadecimal or decimal offsets are
| shown for MAP output in the listing.
| NOMAP
MAP
HEX
( DEC )
|
||
If you want to limit the MAP output, use *CONTROL MAP or NOMAP statements in the
DATA DIVISION. Source statements that follow *CONTROL NOMAP are not included in
the listing until a *CONTROL MAP statement switches the output back to normal MAP
format. For example:
*CONTROL NOMAP *CBL NOMAP
01 A 01 A
02 B 02 B
*CONTROL MAP *CBL MAP
| When the MAP(HEX|DEC) option is in effect, you also get an embedded MAP report in
the source code listing. The condensed MAP information is shown to the right of
data-name definitions in the WORKING-STORAGE SECTION, FILE SECTION,
LOCAL-STORAGE SECTION, and LINKAGE SECTION of the DATA DIVISION. When both
XREF data and an embedded MAP summary are on the same line, the embedded MAP
| summary is listed first.
RELATED CONCEPTS
Chapter 19, Debugging, on page 377
RELATED TASKS
Getting listings on page 387
MAXPCF
Use the MAXPCF option to specify a maximum program complexity factor value. The
program complexity factor (PCF) is computed by the compiler and the computed
value is in the listing file. If the PCF of your program exceeds the maximum value,
the compiler will automatically reduce the optimization level to speed up the
compilation and use less storage. Therefore, when you compile a suite of
programs, you do not have to specify an OPTIMIZE option value for each program.
MAXPCF(n)
The aspects of the program taken into consideration when computing the
complexity factor include:
v The number of COBOL statements in the PROCEDURE DIVISION, including
generated statements from the CICS, SQL or SQLIMS options, and the expansion of
COPY and REPLACE statements
v Initialization operations for WORKING-STORAGE or LOCAL-STORAGE data items with
value clauses
v Operations for variable-length groups or subgroups in the DATA DIVISION, which
compute their size at run time
For large and complex programs, you can use the MAXPCF option to set a threshold
on the program complexity that the compiler attempts optimize. Lower the
MAXPCF value to reduce the optimization level, hence the compiler needs less
memory and compilation time. Raise the MAXPCF value to attempt to optimize
the programs at the cost of longer compilation time.
If you specify MAXPCF(n) and n is not zero, when the program complexity factor
exceeds n, any specification of OPTIMIZE(1) or OPTIMIZE(2) is reset to OPTIMIZE(0),
and a warning message is generated.
If the COBOL source file contains a sequence of source programs (a batch compile),
the MAXPCF limit is applied on a per program basis.
Notes:
RELATED REFERENCES
OPTIMIZE on page 343
MDECK
The MDECK compiler option specifies that a copy of the updated input source after
library processing (that is, the result of COPY, BASIS, REPLACE, EXEC SQL INCLUDE,
and EXEC SQLIMS INCLUDE statements) is written to a file.
If Enterprise COBOL is running under z/OS UNIX, the MDECK output is written in
the current directory to a file that has the same name as the COBOL source file and
a suffix of .dek. For Enterprise COBOL running under TSO or batch, the MDECK
output is written to the data set defined by the SYSMDECK DD allocation, which must
specify an MVS data set that has RECFM F or FB and an LRECL of 80 bytes.
Note: When compiling under z/OS TSO or batch, the COBOL compiler requires
the SYSMDECK data set allocation for all compilations, no matter if you specify the
MDECK or NOMDECK option:
v If you specify the MDECK option, the SYSMDECK DD allocation must specify a
permanent data set.
v If you specify the NOMDECK option, the SYSMDECK DD allocation can specify either
a temporary utility data set or a permanent data set.
NOMDECK
MDECK
COMPILE
( NOCOMPILE )
Option specification:
You cannot specify the MDECK option in a PROCESS (or CBL) statement. You can
specify it only in one of the following ways:
v In the PARM parameter of JCL
v As a cob2 command option
Suboptions:
v When MDECK(COMPILE) is in effect, compilation continues normally after library
processing and generation of the MDECK output file have completed, subject to the
settings of the COMPILE|NOCOMPILE, DECK|NODECK, and OBJECT|NOOBJECT compiler
options.
v When MDECK(NOCOMPILE) is in effect, compilation is terminated after library
processing has completed and the expanded source program file has been
written. The compiler does no further syntax checking or code generation
regardless of the settings of the COMPILE, DECK, and OBJECT compiler options.
If you use the MDECK option with programs that contain EXEC CICS, EXEC SQL, or
EXEC SQLIMS statements, these EXEC statements are included in the MDECK output as
is. However, if you compile using the SQL or SQLIMS option, the corresponding EXEC
SQL INCLUDE or EXEC SQLIMS INCLUDE statements are expanded in the MDECK output.
CBL, PROCESS, *CONTROL, and *CBL card images are passed to the MDECK output file in
the proper locations.
For a batch compilation (multiple COBOL source programs in a single input file), a
single MDECK output file that contains the complete expanded source is created.
RELATED TASKS
Starting the compiler from an assembler program on page 265
Defining the library-processing output file (SYSMDECK) on page 272
RELATED REFERENCES
Conflicting compiler options on page 304
Chapter 18, Compiler-directing statements, on page 373
NAME
Use NAME to generate a link-edit NAME card for each object module. You can also use
| NAME to generate names for each program object when you are doing batch
compilations.
When NAME is specified, a NAME card is appended to each object module that is
| created. Program object names are formed using the rules for forming module
names from PROGRAM-ID statements.
NONAME
NAME
NOALIAS
( ALIAS )
RELATED REFERENCES
PROGRAM-ID paragraph (Enterprise COBOL Language Reference)
NSYMBOL
The NSYMBOL option controls the interpretation of the N symbol used in literals and
PICTURE clauses, indicating whether national or DBCS processing is assumed.
NATIONAL
NSYMBOL( DBCS )
With NSYMBOL(NATIONAL):
v Data items defined with a PICTURE clause that consists only of the symbol N
without the USAGE clause are treated as if the USAGE NATIONAL clause is specified.
v Literals of the form N". . ." or N. . . are treated as national literals.
With NSYMBOL(DBCS):
v Data items defined with a PICTURE clause that consists only of the symbol N
without the USAGE clause are treated as if the USAGE DISPLAY-1 clause is specified.
v Literals of the form N". . ." or N. . . are treated as DBCS literals.
NUMBER
Use the NUMBER compiler option if you have line numbers in your source code and
want those numbers to be used in error messages and SOURCE, MAP, LIST, and XREF
listings.
NONUMBER
NUMBER
If you request NUMBER, the compiler checks columns 1 through 6 to make sure that
they contain only numbers and that the numbers are in numeric collating
sequence. (In contrast, SEQUENCE checks the characters in these columns according
to EBCDIC collating sequence.) When a line number is found to be out of
sequence, the compiler assigns to it a line number with a value one higher than the
line number of the preceding statement. The compiler flags the new value with
two asterisks and includes in the listing a message indicating an out-of-sequence
error. Sequence-checking continues with the next statement, based on the newly
assigned value of the previous line.
If you use COPY statements and NUMBER is in effect, be sure that your source
program line numbers and the copybook line numbers are coordinated.
If you are doing a batch compilation and NUMBER is in effect, all programs in the
batch compile will be treated as a single input file. The sequence numbers of the
entire input file must be in ascending order.
Use NONUMBER if you do not have line numbers in your source code, or if you want
the compiler to ignore the line numbers you do have in your source code. With
NONUMBER in effect, the compiler generates line numbers for your source statements
and uses those numbers as references in listings.
NUMPROC
Use NUMPROC(NOPFD) if your internal decimal and zoned decimal data might use
nonpreferred signs.
NOPFD
NUMPROC( PFD )
The compiler accepts any valid sign configuration: X'A', X'B', X'C', X'D', X'E', or
X'F'. NUMPROC(NOPFD) is the recommended option in most cases.
Using NUMPROC(PFD) can affect class tests for numeric data. Use NUMPROC(NOPFD) if a
COBOL program calls programs written in PL/I or FORTRAN.
Sign representation is affected not only by the NUMPROC option, but also by the
NUMCLS installation option.
RELATED TASKS
Checking for incompatible data (numeric class test) on page 54
RELATED REFERENCES
Sign representation of zoned and packed-decimal data on page 53
OBJECT
Use OBJECT to write the generated object code to a file to be used as input for the
binder.
OBJECT
NOOBJECT
If you specify OBJECT, include a SYSLIN DD statement in your JCL for compilation.
The only difference between DECK and OBJECT is in the routing of output to the data
sets:
v DECK output goes to the data set associated with ddname SYSPUNCH.
v OBJECT output goes to the data set associated with ddname SYSLIN.
RELATED REFERENCES
Conflicting compiler options on page 304
OFFSET
Use OFFSET to produce a condensed PROCEDURE DIVISION listing.
NOOFFSET
OFFSET
With OFFSET, the condensed PROCEDURE DIVISION listing will contain line numbers,
statement references, and the location of the first instruction generated for each
statement. In addition, the listing also shows:
v Global tables
v Literal pools
v Size of the program's WORKING-STORAGE, and its location in the object code if the
program is compiled with the NORENT option
RELATED REFERENCES
Conflicting compiler options on page 304
OPTFILE
You can specify OPTFILE as a compiler invocation option or in the PROCESS or CBL
statement in your COBOL source program. OPTFILE cannot be specified as an
installation default.
OPTFILE is ignored if you compile using the cob2 command in the z/OS UNIX
environment. (In that environment, the COBOPT environment variable provides a
capability that is comparable to OPTFILE.)
If OPTFILE is in effect, compiler options are read from the data set that you identify
in a SYSOPTF DD statement. A SYSOPTF data set must have RECFM F or FB and an
LRECL of 80 bytes. For further details about the format of a SYSOPTF data set, see the
related task below about defining a compiler-option data set.
The precedence of options in the SYSOPTF data set is determined by where you
specify the OPTFILE option. For example, if you specify OPTFILE in the invocation
PARM string, an option specified later in the PARM string supersedes any option
specified in the SYSOPTF data set that conflicts with it.
If you start the COBOL compiler from within an assembler program, you can use
the alternate ddname list to specify a ddname to be used instead of SYSOPTF to
identify the compiler-option data set.
RELATED TASKS
Starting the compiler from an assembler program on page 265
Defining a compiler-option data set (SYSOPTF) on page 269
Specifying compiler options under z/OS on page 272
Chapter 15, Compiling under z/OS UNIX, on page 283
RELATED REFERENCES
Conflicting compiler options on page 304
0
OPTIMIZE ( 1 )
2
| Optimizations are performed under the assumption that the program and data are
| valid, given the compiler options. For example, external decimal data that has
| USAGE DISPLAY must be valid unless ZONEDATA(MIG) is used to allow invalid zone
| bits for comparisons. If the program or data is invalid, programs might behave
| differently at different levels of optimization or between different versions of
| Enterprise COBOL.
v OPTIMIZE(0) specifies limited optimizations, which result in the shortest
compilation time. When the TEST option is specified, full debug capabilities are
available.
v OPTIMIZE(1) specifies optimizations that improve application runtime
performance. Optimizations at this level include basic inlining, strength
reduction, simplification of complex operations into equivalent simpler
operations, removal of some unreachable code and block rearrangement. Also,
OPTIMIZE(1) includes some intrablock optimizations such as common
subexpression elimination and value propagation. When the TEST option is
specified, most debug capabilities are available.
v OPTIMIZE(2) specifies further optimizations, which include more aggressive
simplifications and instruction scheduling. Also, some interblock optimizations
such as global value propagation and loop invariant code motion are included.
When the TEST option is specified, some debug capabilities are available.
| When OPTIMIZE(1) or OPTIMIZE(2) is used without the TEST compiler option, care
| must be taken with user-written condition handlers registered via the Language
| Environment service CEEHDLR. In particular, if a condition handler accesses data
| items that are not defined local to the condition handler program themselves (for
| example, data items defined in the application as EXTERNAL), such data items must
| be defined with the VOLATILE clause to ensure that the handler uses the latest value
| of the data item, or the condition handler program can be compiled with the TEST
| compiler option. The use of the VOLATILE clause is preferred over the use of the
| TEST option because the use of the TEST option can reduce optimization for the
| entire program, while VOLATILE localizes the reduced optimization.
| For more information about the VOLATILE clause, see VOLATILE clause in the
| Enterprise COBOL Language Reference.
RELATED CONCEPTS
Optimization on page 657
RELATED TASKS
Writing routines for handling errors on page 250
RELATED REFERENCES
Conflicting compiler options on page 304
MAXPCF on page 335
TEST on page 359
| STGOPT on page 358
| VOLATILE clause (Enterprise COBOL Language Reference)
OUTDD
Use OUTDD to specify that you want DISPLAY output that is directed to the system
logical output device to go to a specific ddname.
You can specify a file in the z/OS UNIX file system with the ddname named in
OUTDD. To understand where output is directed when this ddname is not allocated,
see the related task about displaying data.
OUTDD(ddname)
The MSGFILE runtime option lets you specify the ddname of the file to which all
runtime diagnostics and reports generated by the RPTOPTS and RPTSTG runtime
options are to be written. The IBM-supplied default is MSGFILE(SYSOUT). If the
OUTDD compiler option and the MSGFILE runtime option both specify the same
ddname, the error message information and DISPLAY output directed to the system
logical output device are routed to the same destination.
RELATED REFERENCES
Language Environment Programming Reference (MSGFILE)
PGMNAME
The PGMNAME option controls the handling of program-names and entry-point
names.
COMPAT
PGMNAME( LONGMIXED )
LONGUPPER
PGMNAME(COMPAT)
With PGMNAME(COMPAT), program-names are handled in a manner compatible with
older versions of COBOL compilers:
v The program-name can be up to 30 characters in length.
v All the characters used in the name must be alphabetic, digits, the hyphen, or
the underscore, except that if the program-name is a literal and is in the
outermost program, then the literal can also contain the extension characters @,
#, and $, and the first character can be an underscore.
v At least one character must be alphabetic.
v The hyphen cannot be used as the first or last character.
PGMNAME(LONGUPPER)
With PGMNAME(LONGUPPER), program-names that are specified in the PROGRAM-ID
paragraph as COBOL user-defined words must follow the normal COBOL rules for
forming a user-defined word:
v The program-name can be up to 30 characters in length.
v All the characters used in the name must be alphabetic, digits, the hyphen, or
the underscore.
v At least one character must be alphabetic.
v The hyphen cannot be used as the first or last character.
v The underscore cannot be used as the first character.
Names of nested programs are folded to uppercase by the compiler but otherwise
are processed as is, without truncation or translation.
PGMNAME(LONGMIXED)
With PGMNAME(LONGMIXED), program-names are processed as is, without truncation,
translation, or folding to uppercase.
RELATED REFERENCES
PROGRAM-ID paragraph (Enterprise COBOL Language Reference)
| QUALIFY
| QUALIFY affects qualification rules and controls whether to extend qualification
| rules so that some data items that cannot be referenced under COBOL Standard
| rules can be referenced.
| COMPAT
QUALIFY( EXTEND )
|
||
| Example
| 01 A.
| 02 B.
| 03 C PIC X.
| 03 A PIC X.
| 02 C PIC X.
| .
| .
| .
| Move space to C of A *> Refers to 02 level C (unique only with QUALIFY(EXTEND))
| Move space to A *> Refers to 01 level A (unique only with QUALIFY(EXTEND))
| Move space to C of B of A *> Refers to 03 level C (unique by COBOL standard rules)
| Move space to C of B *> Refers to 03 level C (unique by COBOL standard rules)
|
QUOTE/APOST
Use QUOTE if you want the figurative constant [ALL] QUOTE or [ALL] QUOTES to
represent one or more quotation mark (") characters. Use APOST if you want the
figurative constant [ALL] QUOTE or [ALL] QUOTES to represent one or more single
quotation mark (') characters.
QUOTE
APOST
Delimiters: You can use either quotation marks or single quotation marks as literal
delimiters regardless of whether the APOST or QUOTE option is in effect. The
delimiter character used as the opening delimiter for a literal must be used as the
closing delimiter for that literal.
RENT
A program compiled as RENT is generated as a reentrant object program. A program
compiled as NORENT is generated as a nonreentrant object program.
RENT
NORENT
DATA and RMODE settings: The RENT option interacts with other compiler options that
affect storage and its addressability. Use the DATA(24|31) option for reentrant
programs to control whether dynamic data areas are allocated in unrestricted
storage or in storage obtained from below 16 MB. Compile programs with RENT if
they will be run in virtual storage addresses above 16 MB.
The setting of the DATA option does not affect programs compiled with NORENT.
For information about which Enterprise COBOL programs need to be reentrant, see
the related task about making programs reentrant.
| If any program in a program object is not reentrant, the program object must not
| be link-edited with the RENT or REUS link-edit attributes. The NOREUS binder
| (linkage-editor) option is needed to ensure that the CANCEL statement will guarantee
a fresh copy of the program on a subsequent CALL.
RELATED CONCEPTS
Storage and its addressability on page 39
RELATED TASKS
Making programs reentrant on page 480
DB2 Application Programming and SQL Guide (Using reentrant code)
RELATED REFERENCES
Conflicting compiler options on page 304
RMODE
RMODE
The RMODE setting influences the RMODE (residency mode) of your generated object
program.
AUTO
RMODE( 24 )
ANY
A program compiled with the RMODE(AUTO) option will have RMODE 24 if NORENT is
specified, or RMODE ANY if RENT is specified. RMODE AUTO is compatible with older
compilers such as VS COBOL II, which produced RMODE 24 for programs compiled
with NORENT, and RMODE ANY for programs compiled with RENT.
A program compiled with the RMODE(24) option will have RMODE 24 whether NORENT
or RENT is specified.
A program compiled with the RMODE(ANY) option must also be compiled with the
RENT option. The program will have the RMODE ANY attribute.
DATA and RENT: The RMODE option interacts with other compiler options and runtime
options that affect storage and its addressability. For information about passing
data between programs with different modes, see the related concept about storage
and its addressability.
Link-edit considerations: If the object code that COBOL generates has an attribute
of RMODE 24, you must link-edit the code with RMODE 24. If the object code that
COBOL generates has an attribute of RMODE ANY, you can link-edit the code with
either RMODE ANY or RMODE 24.
RELATED CONCEPTS
Storage and its addressability on page 39
RELATED REFERENCES
Allocation of buffers for QSAM files on page 181
Conflicting compiler options on page 304
| RULES
| You can use the RULES option to request information about your program from the
| compiler to improve the program by flagging certain types of source code at
| compile time.
| NORULES
ENDPERIOD
RULES ( NOENDPERIOD )
EVENPACK
NOEVENPACK
LAXPERF
NOLAXPERF
SLACKBYTES
NOSLACKBYTES
|
||
| Abbreviations are:
| v ENDP = ENDPERIOD
| v EVENP = EVENPACK
| v LXPRF = LAXPERF
| v SLCKB = SLACKBYTES
| Notes:
| v It is not necessary to specify all of the suboptions for RULES. If a suboption is not
| specified, the default takes effect.
| RELATED REFERENCES
| SYNCHRONIZED clause (Enterprise COBOL Language Reference)
|
SEQUENCE
When you use SEQUENCE, the compiler examines columns 1 through 6 to check that
the source statements are arranged in ascending order according to their EBCDIC
collating sequence. The compiler issues a diagnostic message if any statements are
not in ascending order.
SEQUENCE
NOSEQUENCE
If you use COPY statements with the SEQUENCE option in effect, be sure that your
source program's sequence fields and the copybook sequence fields are
coordinated.
If you use NUMBER and SEQUENCE, the sequence is checked according to numeric,
rather than EBCDIC, collating sequence.
If you are doing a batch compilation and SEQUENCE is in effect, all programs in the
batch compilation are treated as a single input file. The sequence numbers of the
entire input file must be in ascending order.
RELATED TASKS
Finding line sequence problems on page 383
| NOSERVICE
SERVICE('service string')
|
||
SOURCE
Use SOURCE to get a listing of your source program. This listing will include any
statements embedded by PROCESS or COPY statements.
SOURCE
NOSOURCE
You must specify SOURCE if you want embedded messages in the source listing.
Use NOSOURCE to suppress the source code from the compiler output listing.
If you want to limit the SOURCE output, use *CONTROL SOURCE or NOSOURCE
statements in your PROCEDURE DIVISION. Source statements that follow a *CONTROL
NOSOURCE statement are not included in the listing until a subsequent *CONTROL
SOURCE statement switches the output back to normal SOURCE format.
RELATED REFERENCES
*CONTROL (*CBL) statement (Enterprise COBOL Language Reference)
1
SPACE( 2 )
3
SPACE has meaning only when the SOURCE compiler option is in effect.
RELATED REFERENCES
SOURCE on page 353
SQL
Use the SQL compiler option to enable the DB2 coprocessor and to specify DB2
suboptions. You must specify the SQL option if a COBOL source program contains
SQL statements (EXEC SQL statements) and the program has not been processed
by the DB2 precompiler.
NOSQL
SQL
("DB2-suboption-string")
When you use the SQL option, the DB2 coprocessor writes the database request
module (DBRM) to ddname DBRMLIB. DB2 must be available on the machine on
which you compile.
If you specify the NOSQL option, any SQL statements found in the source program
are diagnosed and discarded.
Use either quotation marks or single quotation marks to delimit the string of DB2
suboptions.
The DB2 suboptions are concatenated in the order of their appearance. Thus in the
example above, the compiler passes the following suboption string to the DB2
coprocessor:
"string1 string2 string3"
The concatenated strings are delimited with single spaces as shown. If multiple
instances of the same DB2 option are found, the last specification of each option
prevails. The compiler limits the length of the concatenated DB2 suboption string
to 4 KB.
RELATED CONCEPTS
DB2 coprocessor on page 431
COBOL and DB2 CCSID determination on page 437
RELATED TASKS
Compiling with the SQL option on page 435
Separating DB2 suboptions on page 436
RELATED REFERENCES
Conflicting compiler options on page 304
SQLCCSID
Use the SQLCCSID compiler option to control whether the CODEPAGE compiler option
will influence the processing of SQL statements in your COBOL programs.
SQLCCSID
NOSQLCCSID
The SQLCCSID option has an effect only if you use the integrated DB2 coprocessor
(SQL compiler option).
If SQLCCSID is in effect, the setting of the CODEPAGE compiler option will influence
the processing of SQL statements within your COBOL programs when you use the
For further information about this option, see the related task.
RELATED CONCEPTS
DB2 coprocessor on page 431
COBOL and DB2 CCSID determination on page 437
RELATED TASKS
Programming with the SQLCCSID or NOSQLCCSID option on page 438
RELATED REFERENCES
Code-page determination for string host variables in SQL statements on page 437
CODEPAGE on page 313
SQL on page 354
SQLIMS
Use the SQLIMS compiler option to enable the IMS SQL coprocessor and to specify
Information Management System (IMS) suboptions. You must specify the SQLIMS
option if a COBOL source program contains SQLIMS statements (EXEC SQLIMS
statements).
NOSQLIMS
SQLIMS
("IMS-suboption-string")
Default: NOSQLIMS
Abbreviation: None
If you specify the NOSQLIMS option, any SQLIMS statements that are found in the
source program are diagnosed and discarded.
Use either double quotation marks or single quotation marks to delimit the string
of IMS suboptions.
You can partition a long suboption string into multiple suboption strings in
multiple CBL statements. For example:
//STEP1 EXEC IGYWC, . . .
// PARM.COBOL='SQLIMS("string1")'
//COBOL.SYSIN DD *
CBL SQLIMS("string2")
The IMS suboptions are concatenated in the order of their appearance. Thus in the
proceeding example, the compiler passes the following suboption strings to the
IMS SQL coprocessor:
"string1 string2 string3"
The concatenated strings are delimited with single spaces as shown. If multiple
instances of the same IMS suboption are found, the last specification of each
suboption takes effect. The compiler limits the length of the concatenated IMS
suboption string to 4 KB.
RELATED CONCEPTS
IMS SQL coprocessor on page 443
RELATED TASKS
Compiling with the SQLIMS option on page 445
Separating IMS suboptions on page 446
RELATED REFERENCES
Conflicting compiler options on page 304
SSRANGE
Use SSRANGE to generate code that checks for out-of-range storage references.
NOSSRANGE
SSRANGE
SSRANGE generates code that checks whether subscripts, including ALL subscripts, or
indexes try to reference areas outside the region of their associated tables. Each
subscript or index is not individually checked for validity. Instead, the effective
address is checked to ensure that it does not reference outside the table.
Note: If you specify the SSRANGE option, range checks are generated by the
compiler and the checks are always conducted at run time. You cannot disable the
compiled-in range checks at run time by specifying the runtime option CHECK(OFF).
Variable-length items are also checked to ensure that references are within their
maximum defined length.
For unbounded groups or their subordinate items, checking is done only for
reference modification expressions. Subscripted or indexed references to tables
subordinate to an unbounded group are not checked.
RELATED CONCEPTS
Reference modifiers on page 113
RELATED TASKS
Checking for valid ranges on page 383
STGOPT
The STGOPT option controls storage optimization.
NOSTGOPT
STGOPT
If you specify STGOPT, the compiler might discard any or all of the following data
items, and does not allocate storage for them.
v Unreferenced LOCAL-STORAGE and non-external WORKING-STORAGE level-77 and
level-01 elementary data items
v Non-external level-01 group items if none of their subordinate items are
referenced
v Unreferenced special registers
| Note: The STGOPT option is ignored for data items that have the VOLATILE
| clause. For details, see VOLATILE clause in the Enterprise COBOL Language
| Reference.
| The compiler will not generate code to initialize discarded data items to the values
in their VALUE clauses.
NOTERMINAL
TERMINAL
TEST
Use TEST to produce object code that enables debugging and problem
determination tools such as Debug Tool and Fault Analyzer. With TEST, you can
also enable the inclusion of symbolic variables in the formatted dumps that are
produced by Language Environment.
NODWARF
NOTEST
DWARF
NOEJPD SOURCE
TEST
EJPD NOSOURCE
NOTEST suboptions
DWARF If you specify NOTEST(DWARF), basic DWARF diagnostic information is
included in the application module. This option enables the best usability
for application failure analysis tools, such as CEEDUMP and IBM Fault
TEST suboptions
When the TEST option is specified, DWARF debugging information is included in the
application module.
The EJPD and NOEJPD suboptions control enablement of the Debug Tool commands
JUMPTO and GOTO in production debugging sessions. These suboptions take effect
only if you specify the TEST option and a non-zero OPTIMIZE level (OPTIMIZE(1) or
OPTIMIZE(2)).
EJPD If you specify TEST(EJPD) and a non-zero OPTIMIZE level:
v The JUMPTO and GOTO commands are enabled.
v The amount of program optimization is reduced. Optimization is done
within statements, but most optimizations do not cross statement
boundaries.
NOEJPD If you specify TEST(NOEJPD) and a non-zero OPTIMIZE level:
v The JUMPTO and GOTO commands are not enabled. However, you can still
use JUMPTO and GOTO if you use the SET WARNING OFF Debug Tool
command. In this scenario, JUMPTO and GOTO will have unpredictable
results.
v The normal amount of program optimization is done.
SOURCE If you specify TEST(SOURCE), the generated DWARF debug information
generated by the compiler includes the expanded source code, and the
compiler listing is not needed by IBM Debug Tool.
NOSOURCE
If you specify TEST(NOSOURCE), the generated DWARF debugging information
does not include the expanded source code, and you will need access to
the compiler listing to use IBM Debug Tool.
Note: If you specify the TEST option, you must set the CODEPAGE option to the
CCSID that is used for the COBOL source program. In particular, programs that
use Japanese characters in DBCS literals or DBCS user-defined words must be
compiled with the CODEPAGE option set to a Japanese codepage CCSID. For more
information, see CODEPAGE on page 313.
You can control the amount of debugging capability that you get and so also the
program performance, as follows:
v For the best performance, but with some restrictions on debugging, compile
using a non-zero OPTIMIZE level, STGOPT and TEST(NOEJPD).
Language Environment:
The TEST option specified with any of its suboptions can improve your formatted
dumps from Language Environment by adding these two features to the dumps:
v A line number that indicates the failing statement, rather than just an offset
v The values of the program variables
With NOTEST(DWARF), the dump will have program variables but will not have the
line number of the failing statement. With NOTEST(NODWARF), the dump will not
have program variables nor the line number of the failing statement.
RELATED CONCEPTS
DWARF/ELF Extensions Library Reference (About Common Debug
Architecture)
RELATED TASKS
Using the debugger on page 387
Language Environment Debugging Guide (Generating a
Language Environment dump with TERMTHDACT)
Debug Tool User's Guide (Special considerations while using the TEST
runtime option)
RELATED REFERENCES
Logical record length and block size on page 268
cob2 input and output files on page 288
Conflicting compiler options on page 304
THREAD
THREAD indicates that a COBOL program is to be enabled for execution in a
Language Environment enclave that has multiple POSIX threads or PL/I tasks.
NOTHREAD
THREAD
A program that has been compiled using the THREAD option can also be used in a
nonthreaded application. However, if a COBOL program is to be run in a threaded
application, all the COBOL programs in the Language Environment enclave must
be compiled using the THREAD option.
NOTHREAD indicates that the COBOL program is not to be enabled for execution in
an enclave that has multiple POSIX threads or PL/I tasks.
Programs that are compiled using compilers earlier than Enterprise COBOL are
treated as if compiled using NOTHREAD.
If the THREAD option is in effect, the following elements are not supported. If
encountered, they are diagnosed as errors:
v ALTER statement
v DEBUG-ITEM special register
v GO TO statement without procedure-name
v INITIAL phrase in PROGRAM-ID clause
v Nested programs
v RERUN
v Segmentation module
v SORT or MERGE statements
v STOP literal statement
v USE FOR DEBUGGING statement
Programs compiled using the THREAD option are supported in the reusable
environment that is created by calling the Language Environment preinitialization
routine CEEPIPI. But a reusable environment created by using the RTEREUS runtime
option is not supported for programs compiled using the THREAD option.
Performance consideration: If you use the THREAD option, you can expect some
runtime performance degradation due to the overhead of serialization logic that is
automatically generated.
RELATED TASKS
Chapter 27, Preparing COBOL programs for multithreading, on page 507
RELATED REFERENCES
Conflicting compiler options on page 304
TRUNC
TRUNC affects the way that binary data is truncated during moves and arithmetic
operations.
STD
TRUNC( OPT )
BIN
TRUNC has no effect on COMP-5 data items; COMP-5 items are handled as if
TRUNC(BIN) is in effect regardless of the TRUNC suboption specified.
TRUNC(STD)
TRUNC(STD) applies only to USAGE BINARY receiving fields in MOVE statements
and arithmetic expressions. When TRUNC(STD) is in effect, the final result of
an arithmetic expression, or the sending field in the MOVE statement, is
truncated to the number of digits in the PICTURE clause of the BINARY
receiving field.
TRUNC(OPT)
TRUNC(OPT) is a performance option. When TRUNC(OPT) is in effect, the
compiler assumes that data conforms to PICTURE specifications in USAGE
BINARY receiving fields in MOVE statements and arithmetic expressions. The
results are manipulated in the most optimal way, either truncating to the
number of digits in the PICTURE clause, or to the size of the binary field in
storage (halfword, fullword, or doubleword).
Tips:
TRUNC example 1
01 BIN-VAR PIC S99 USAGE BINARY.
. . .
MOVE 123451 to BIN-VAR
The following table shows values of the data items after the MOVE statement.
A halfword of storage is allocated for BIN-VAR. The result of this MOVE statement if
the program is compiled with the TRUNC(STD) option is 51; the field is truncated to
conform to the PICTURE clause.
If you compile the program with TRUNC(BIN), the result of the MOVE statement is
-7621. The reason for the unusual result is that nonzero high-order digits are
truncated. Here, the generated code sequence would merely move the lower
halfword quantity X'E23B' to the receiver. Because the new truncated value
overflows into the sign bit of the binary halfword, the value becomes a negative
number.
It is better not to compile this MOVE statement with TRUNC(OPT), because 123451 has
greater precision than the PICTURE clause for BIN-VAR. With TRUNC(OPT), the results
are again -7621. This is because the best performance was obtained by not doing a
decimal truncation.
TRUNC example 2
01 BIN-VAR PIC 9(6) USAGE BINARY
. . .
MOVE 1234567891 to BIN-VAR
The following table shows values of the data items after the MOVE statement.
When you specify TRUNC(STD), the sending data is truncated to six integer digits to
conform to the PICTURE clause of the BINARY receiver.
When you specify TRUNC(OPT), the compiler assumes the sending data is not larger
than the PICTURE clause precision of the BINARY receiver. The most efficient code
sequence in this case is truncation as if TRUNC(STD) were in effect.
When you specify TRUNC(BIN), no truncation occurs because all of the sending data
fits into the binary fullword allocated for BIN-VAR.
RELATED CONCEPTS
Formats for numeric data on page 47
RELATED TASKS
Compiling with the CICS option on page 423
RELATED REFERENCES
VALUE clause (Enterprise COBOL Language Reference)
NOVBREF
VBREF
| VLR
| The VLR option affects the file status returned from READ statements for
| variable-length records when the length of record returned is inconsistent with the
| record descriptions. It eases your migration from earlier versions to Enterprise
| COBOL V5, if your programs have READ statements that result in a record length
| conflict.
| STANDARD
VLR( COMPAT )
|
||
| Note: This setting can hide I/O problems that can arise with the wrong
| length read situation. Use the VLR(COMPAT) option with caution, and check
| for correct READ statements.
| VLR(STANDARD)
| If you specify VLR(STANDARD), you get the status value of 04 when READ
| statements encounter a record length conflict.
| You can add code to test for FS=04 to avoid accessing undefined data in a
| record and also avoid getting protection exceptions for attempting to
| reference a part of the record that was truncated.
| Using VLR(STANDARD) can result in more reliable code and fewer I/O problems
| because the file status will tell you when a wrong length READ might occur. A
| new compiler message, MSGIGYP3178, can also help you avoid I/O problems by
| telling you if a program has a possibility of a wrong length READ. This message
| can be used to assist with migration from VLR(COMPAT) to VLR(STANDARD) by
| indicating the possible wrong length READ that you can solve by correcting the
| File Definition (FD). You can also raise the severity of the message so that the
| program must be corrected in order to run. To do this, use the MSGEXIT suboption
| of the EXIT compiler option to change the severity of message MSGIGYP3178 from
| I (RC=0) to S (RC=12), E (RC=8), or W (RC=4). If you are not interested in seeing
| this message, you can suppress the message completely.
| RELATED REFERENCES
| EXIT on page 324
| Compatible READ results of variable length records - wrong length READ
| (Enterprise COBOL Migration Guide)
|
WORD
Use WORD(xxxx) to specify that an alternate reserved-word table is to be used during
compilation.
NOWORD
WORD(xxxx)
RELATED TASKS
Compiling with the CICS option on page 423
RELATED REFERENCES
Conflicting compiler options on page 304
CICS reserved-word table on page 427
| XMLPARSE
| Use XMLPARSE to select the parser to be used for processing XML input, and,
| therefore, the XML processing capabilities that are available to your program.
| XMLSS
XMLPARSE( COMPAT )
|
||
| If you specify the XMLPARSE(XMLSS) option, XML PARSE statements are processed
| using the z/OS XML System Services parser. The following XML parsing
| capabilities are available only if you specify XMLPARSE(XMLSS):
| v Validation of XML input documents against an XML schema (by using the
| VALIDATING phrase of the XML PARSE statement)
| v Enhanced namespace processing (special registers XML-NAMESPACE,
| XML-NNAMESPACE, XML-NAMESPACE-PREFIX, and XML-NNAMESPACE-PREFIX)
| v Automatic conversion of document fragments to Unicode UTF-16 (by using the
| RETURNING NATIONAL phrase of the XML PARSE statement)
| v Specification of the encoding of the input document (by using the ENCODING
| phrase of the XML PARSE statement)
| v Direct parsing of XML documents encoded in UTF-8
| v Parsing of XML documents, a buffer of XML at a time
| v Offloading of XML parsing to System z Application Assist Processors (zAAPs)
| RELATED TASKS
| Chapter 28, Processing XML input, on page 517
| RELATED REFERENCES
| XML PARSE statement (Enterprise COBOL Language Reference)
| z/OS XML System Services User's Guide and Reference
|
XREF
Use XREF to produce a sorted cross-reference listing.
XREF
FULL
( SHORT )
NOXREF
You can choose XREF, XREF(FULL), or XREF(SHORT). If you specify XREF without any
suboptions, XREF(FULL) will be in effect.
If you use XREF and NOSOURCE, you get only the sorted cross-reference listing.
XREF(SHORT) prints only the explicitly referenced data items in the cross-reference
listing. XREF(SHORT) applies to DBCS data-names and procedure-names as well as
to single-byte names.
Usage notes
v Group names used in a MOVE CORRESPONDING statement are in the XREF listing.
The elementary names in those groups are also listed.
v In the data-name XREF listing, line numbers that are preceded by the letter M
indicate that the data item is explicitly modified by a statement on that line.
v XREF listings take additional storage.
v If there is more than one data set in your SYSLIB concatenation, in some cases
the COPY/BASIS cross-reference might be incomplete or missing. This loss can
occur if XREF is set only in a CBL or PROCESS statement, and XREFOPT=NO is set as
an installation default or NOXREF is coded in your JCL PARM parameter.
To ensure that the COPY/BASIS cross-reference is complete, either verify with your
system programmer that XREFOPT=FULL or XREFOPT=SHORT is your installation
default, or code the XREF option in your JCL PARM parameter.
RELATED CONCEPTS
Chapter 19, Debugging, on page 377
RELATED TASKS
Getting listings on page 387
RELATED REFERENCES
Language Environment Debugging Guide (COBOL compiler options)
| ZONEDATA
| The ZONEDATA option tells the compiler whether USAGE DISPLAY numeric data items
| (zoned decimal) contain data with valid zone bits for numeric comparisons.
| PFD
ZONEDATA( MIG )
|
||
| Each digit of a valid zoned decimal number is represented by a single byte from
| XF0 through XF9. The 4 high-order bits of each byte are zone bits, and the 4
| low-order bits of each byte contain the value of the digit. The 4 high-order bits of
| the low-order byte for SIGN TRAILING represent the sign of the item. The sign is in
| the high-order byte with SIGN LEADING, or in a separate byte for SIGN IS SEPARATE.
| Note: The sign zone must be a valid sign according to the NUMPROC compiler option
| setting. In addition, the low-order byte must have a valid zone (xF) for unsigned
| and signed with either SIGN IS LEADING or SIGN IS SEPARATE.
| When ZONEDATA(PFD) is in effect, the compiler assumes that the zone bits in zoned
| decimal data items are valid, and generates the most efficient code possible to
| make numeric comparisons. For example, the compiler might generate a string
| comparison to avoid numeric conversion.
| In the following example, you can see a data item with an invalid zone code 4 in
| the zone bits in the middle of data item VALUE1, forced in by REDEFINES:
| 77 VALUE0 PIC X(4) VALUE 00 0. <* xF0F040F0
| 77 VALUE1 REDEFINES VALUE0 PIC 9(4).
| PROCEDURE DIVISION.
| IF VALUE1 = ZERO
| DISPLAY ZONEDATA(MIG) is in effect VALUE1
| ELSE
| DISPLAY ZONEDATA(PFD) is in effect VALUE1
| END-IF
| In this example, the test is true in COBOL V4 and earlier if the NUMPROC(MIG)
| option is used, and false for other NUMPROC settings. With COBOL V5.1 (and with
| COBOL V5.2 and ZONEDATA(PFD), the test is true at OPT(0) and false at OPT(1|2).
| With COBOL V5.2 and ZONEDATA(MIG), the test is true at any OPT setting.
| If you were compiling with NUMPROC(MIG) with your previous COBOL compiler,
| and have USAGE DISPLAY numeric data items that contain invalid zone codes for
| numeric comparisons, specify ZONEDATA(MIG) to help migration to COBOL V5. In
| such cases, ZONEDATA(PFD) might give different results for comparisons that use
| USAGE DISPLAY numeric data items from the previous compiler. You can either
| correct data or use ZONEDATA(MIG).
| RELATED REFERENCES
| NUMPROC on page 339
ZWB
NOZWB
If the zoned decimal item is a scaled item (that is, it contains the symbol P in its
PICTURE string), comparisons that use the decimal item are not affected by ZWB.
Such items always have their sign removed before the comparison is made to an
alphanumeric field.
ZWB affects how a program runs. The same COBOL program can produce different
results depending on the setting of this option.
Use NOZWB if you want to test input numeric fields for SPACES.
COPY text-name
literal-1 OF library-name SUPPRESS
IN literal-2
| .
To specify more than one copy library, use either JCL or a combination of
JCL and the IN/OF phrase. Using just JCL, concatenate data sets in your DD
statement for SYSLIB. Alternatively, define multiple DD statements and
include the IN/OF phrase in your COPY statements.
The maximum block size for the copy library depends on the device on
which your data set resides.
Compiling in the z/OS UNIX shell:
When you compile using the cob2 command, copybooks are included from
the z/OS UNIX file system. text-name, library-name, and literal-1 and literal-2
are processed as follows:
v User-defined words are folded to uppercase. Literals are not folded.
Because UNIX is case sensitive, if your file-name is lowercase or mixed
case, you must specify it as a literal.
v If text-name is a literal and library-name is omitted, text-name is used
directly: as a file-name, a relative path name, or an absolute path name
(if the first character is /). For example:
COPY "MyInc"
COPY "x/MyInc"
COPY "/u/user1/MyInc"
v If text-name is a user-defined word, and an environment variable of that
name is defined, the value of the environment variable is used as the
name of the file that contains the copybook.
If an environment variable of that name is not defined, the copybook is
searched for under the following names, in this order:
1. text-name.cpy
2. text-name.CPY
3. text-name.cbl
4. text-name.CBL
5. text-name.cob
6. text-name.COB
7. text-name
v If library-name is a literal, it is treated as the actual path, relative or
absolute, from which to copy file text-name.
v If library-name is a user-defined word, it is treated as an environment
variable. The value of the environment variable is used as the path. If
the environment variable is not set, an error occurs.
v If both library-name and text-name are specified, the compiler forms the
path name for the copybook by concatenating library-name and text-name
RELATED TASKS
Changing the header of a source listing on page 5
Specifying compiler options under z/OS on page 272
Specifying compiler options under z/OS UNIX on page 284
Setting environment variables under z/OS UNIX on page 283
Eliminating repetitive coding on page 665
RELATED REFERENCES
cob2 syntax and options on page 287
CALLINTERFACE (Enterprise COBOL Language Reference)
COPY statement (Enterprise COBOL Language Reference)
If the problem with your program is not easily detected and you do not have a
debugger available, you might need to analyze a storage dump of your program.
For interactive debugging, you can use Debug Tool. Debug Tool offers these
productivity enhancements:
v Interactive debugging (in full-screen or line mode), or debugging in batch mode
During an interactive full-screen mode session, you can use Debug Tool's
full-screen services and session panel windows on a 3270 device to debug your
program while it is running.
v COBOL-like commands
For each high-level language supported, commands for coding actions to be
taken at breakpoints are provided in a syntax similar to that programming
language.
v Mixed-language debugging
You can debug an application that contains programs written in a different
language. Debug Tool automatically determines the language of the program or
subprogram being run.
v COBOL-CICS debugging
Debug Tool supports the debugging of CICS applications in both interactive and
batch mode.
v Support for remote debugging
Workstation users can use the IBM Debug Tool Plug-in for Eclipse or the IBM
Problem Determination Tools with Rational Developer for System z for
debugging programs that run on z/OS.
RELATED TASKS
Debugging with source language
Debugging using compiler options on page 382
Using the debugger on page 387
Getting listings on page 387
Debug Tool User's Guide
RELATED REFERENCES
Debug Tool Reference and Messages
Language Environment Debugging Guide (Formatting and analyzing system
dumps, Debugging example COBOL programs)
RELATED TASKS
Tracing program logic
Finding and handling input-output errors on page 379
Validating data on page 379
Moving, initializing or setting uninitialized data on page 380
Generating information about procedures on page 380
RELATED REFERENCES
Source language debugging (Enterprise COBOL Language Reference)
If you use explicit scope terminators to end statements in your program, the logic
is more apparent and therefore easier to trace.
To determine whether a particular routine started and finished, you might insert
code like this into your program:
DISPLAY "ENTER CHECK PROCEDURE"
.
. (checking procedure routine)
.
DISPLAY "FINISHED CHECK PROCEDURE"
After you are sure that the routine works correctly, disable the DISPLAY statements
in one of two ways:
v Put an asterisk in column 7 of each DISPLAY statement line to convert it to a
comment line.
v Put a D in column 7 of each DISPLAY statement to convert it to a comment line.
When you want to reactivate these statements, include a WITH DEBUGGING MODE
clause in the ENVIRONMENT DIVISION; the D in column 7 is ignored and the
DISPLAY statements are implemented.
Before you put the program into production, delete or disable the debugging aids
you used and recompile the program. The program will run more efficiently and
use less storage.
RELATED CONCEPTS
Scope terminators on page 20
To use file status keys in debugging, check for a nonzero value in the status key
after each input-output statement. If the value is nonzero (as reported in an error
message), look at the coding of the input-output procedures in the program. You
can also include procedures to correct the error based on the value of the status
key.
If you determine that a problem lies in an input-output procedure, include the USE
EXCEPTION/ERROR declarative to help debug the problem. Then, when a file fails to
open, the appropriate EXCEPTION/ERROR declarative is performed. The appropriate
declarative might be a specific one for the file or one provided for the open
attributes INPUT, OUTPUT, I-O, or EXTEND.
Code each USE AFTER STANDARD ERROR statement in a section that follows the
DECLARATIVES keyword in the PROCEDURE DIVISION.
RELATED TASKS
Coding ERROR declaratives on page 244
Using file status keys on page 245
RELATED REFERENCES
File status key (Enterprise COBOL Language Reference)
Validating data
If you suspect that your program is trying to perform arithmetic on nonnumeric
data or is receiving the wrong type of data on an input record, use the class test
(the class condition) to validate the type of data.
You can use the class test to check whether the content of a data item is
ALPHABETIC, ALPHABETIC-LOWER, ALPHABETIC-UPPER, DBCS, KANJI, or NUMERIC. If the
data item is described implicitly or explicitly as USAGE NATIONAL, the class test
checks the national character representation of the characters associated with the
specified character class.
You can use the UVALID intrinsic function to check whether a national data item
contains valid UTF-16 encoded data, or whether an alphanumeric or alphabetic
item contains valid UTF-8 encoded data.
RELATED TASKS
Coding conditional expressions on page 98
Testing for valid DBCS characters on page 151
RELATED REFERENCES
Class condition (Enterprise COBOL Language Reference)
UVALID (Enterprise COBOL Language Reference)
If the problem happens intermittently and not always with the same data, it could
be that a switch was not initialized but is generally set to the right value (0 or 1)
by chance. By using a SET statement to ensure that the switch is initialized, you
can determine that the uninitialized switch is the cause of the problem or remove
it as a possible cause.
RELATED REFERENCES
INITIALIZE statement (Enterprise COBOL Language Reference)
SET statement (Enterprise COBOL Language Reference)
For example, to determine how many times a procedure is run, you could include
a debugging procedure in the USE FOR DEBUGGING declarative and use a counter to
keep track of the number of times that control passes to that procedure. You can
use the counter technique to check items such as these:
v How many times a PERFORM statement runs, and thus whether a particular
routine is being used and whether the control structure is correct
v How many times a loop runs, and thus whether the loop is executing and
whether the number for the loop is accurate
You can use debugging lines or debugging statements or both in your program.
Debugging statements are the statements that are coded in the DECLARATIVES section
of the PROCEDURE DIVISION. Code each USE FOR DEBUGGING declarative in a separate
section. Code the debugging statements as follows:
v Only in a DECLARATIVES section.
v Following the header USE FOR DEBUGGING.
v Only in the outermost program; they are not valid in nested programs.
Debugging statements are also never triggered by procedures that are contained
in nested programs.
To use debugging statements in your program, you must include the WITH
DEBUGGING MODE clause and use the DEBUG runtime option.
Options restrictions:
v You cannot use the USE FOR DEBUGGING declarative in a program that you
compile with the THREAD option.
The DISPLAY statement writes information to the terminal or to an output data set.
The USE FOR DEBUGGING declarative is used with a counter to show how many
times a routine runs.
Environment Division.
. . .
Data Division.
. . .
Working-Storage Section.
. . . (other entries your program needs)
01 Trace-Msg PIC X(30) Value " Trace for Procedure-Name : ".
01 Total PIC 9(9) Value 1.
. . .
Procedure Division.
Declaratives.
Debug-Declaratives Section.
Use For Debugging On Some-Routine.
Debug-Declaratives-Paragraph.
Display Trace-Msg, Debug-Name, Total.
End Declaratives.
Main-Program Section.
. . . (source program statements)
Perform Some-Routine.
. . . (source program statements)
Stop Run.
Some-Routine.
. . . (whatever statements you need in this paragraph)
Add 1 To Total.
Some-Routine-End.
The DISPLAY statement in the DECLARATIVES SECTION issues this message every time
the procedure Some-Routine runs:
Trace For Procedure-Name : Some-Routine 22
The number at the end of the message, 22, is the value accumulated in the data
item Total; it indicates the number of times Some-Routine has run. The statements
in the debugging declarative are performed before the named procedure runs.
You can also use the DISPLAY statement to trace program execution and show the
flow through the program. You do this by dropping Total from the DISPLAY
statement and changing the USE FOR DEBUGGING declarative in the DECLARATIVES
SECTION to:
USE FOR DEBUGGING ON ALL PROCEDURES.
You can find the following errors by using compiler options (the options are
shown in parentheses):
v Syntax errors such as duplicate data-names (NOCOMPILE)
v Missing sections (SEQUENCE)
v Invalid subscript values (SSRANGE)
You can find the following elements in your program by using compiler options:
v Error messages and locations of the associated errors (FLAG)
v Program entity definitions and references; text-names and library-names from
COPY or BASIS statements, and the associated data sets or files from which
copybooks are obtained (XREF)
v Data items in the DATA DIVISION (MAP)
v Verb references (VBREF)
You can get a copy of your source (SOURCE) or a listing of generated code (LIST).
You prepare your program for debugging by using the TEST compiler option.
RELATED TASKS
Finding coding errors
Finding line sequence problems on page 383
Checking for valid ranges on page 383
Selecting the level of error to be diagnosed on page 384
Finding program entity definitions and references on page 386
Listing data items on page 386
Getting listings on page 387
RELATED REFERENCES
Chapter 17, Compiler options, on page 301
If you are compiling in the TSO foreground, you can send the messages to your
screen by using the TERM compiler option and defining your data set as the
SYSTERM data set.
Checking syntax only: To only check the syntax of your program, and not produce
object code, use NOCOMPILE without a suboption. If you also specify the SOURCE
option, the compiler produces a listing.
When you specify NOCOMPILE, several compiler options are suppressed. See the
related reference below about the COMPILE option for details.
If an error of level x or higher occurs, the compilation stops and your program is
only checked for syntax.
RELATED REFERENCES
COMPILE on page 316
When you use SEQUENCE, the compiler checks the source statement numbers to
determine whether they are in ascending sequence. Two asterisks are placed beside
statement numbers that are out of sequence. The total number of these statements
is printed as the first line in the diagnostics after the source listing.
RELATED REFERENCES
SEQUENCE on page 352
If the SSRANGE option is in effect, checking is performed at run time if the COBOL
statement that contains the indexed, subscripted, variable-length, or
reference-modified data item is executed.
If an effective address is outside the range of the data item that contains the
referenced data, an error message is generated and the program stops. The
message identifies the table or identifier that was referenced and the line number
where the error occurred. Additional information is provided depending on the
type of reference that caused the error.
If all subscripts, indices, and reference modifiers in a given data reference are
literals and they result in a reference outside the data item, the error is diagnosed
at compile time regardless of the setting of the SSRANGE option.
RELATED REFERENCES
SSRANGE on page 357
Performance-related compiler options on page 659
Specify as the first parameter the lowest severity level of the syntax-error messages
to be issued. Optionally specify the second parameter as the lowest level of the
syntax-error messages to be embedded in the source listing. This severity level
must be the same or higher than the level for the first parameter. If you specify
both parameters, you must also specify the SOURCE compiler option.
Table 49. Severity levels of compiler messages
Severity level Resulting messages
U (unrecoverable) U messages only
S (severe) All S and U messages
E (error) All E, S, and U messages
W (warning) All W, E, S, and U messages
I (informational) All messages
When you specify the second parameter, each syntax-error message (except a
U-level message) is embedded in the source listing at the point where the compiler
had enough information to detect that error. All embedded messages (except those
issued by the library compiler phase) directly follow the statement to which they
refer. The number of the statement that had the error is also included with the
message. Embedded messages are repeated with the rest of the diagnostic
messages at the end of the source listing.
Note: You can suppress some error messages and change the severity of others
with the MSGEXIT suboption of the EXIT option.
When you specify the NOSOURCE compiler option, the syntax-error messages are
included only at the end of the listing. Messages for unrecoverable errors are not
embedded in the source listing, because an error of this severity terminates the
compilation.
RELATED TASKS
Generating a list of compiler messages on page 280
RELATED REFERENCES
Severity codes for compiler diagnostic messages on page 282
Messages and listings for compiler-detected errors on page 280
FLAG on page 327
To include only the explicitly referenced data items, use the XREF(SHORT) option.
Use both the XREF (either FULL or SHORT) and the SOURCE options to print a modified
cross-reference to the right of the source listing. This embedded cross-reference
shows the line number where the data-name or procedure-name was defined.
For further details, see the related reference about the XREF compiler option.
RELATED TASKS
Getting listings on page 387
RELATED REFERENCES
XREF on page 369
| When you specify the MAP(HEX|DEC) option, an embedded MAP summary that
contains condensed MAP information is generated to the right of the COBOL source
| data definition.
| v If you specify MAP(HEX) or MAP with no suboption, data item offsets within
| groups will be in hexadecimal notation.
| v If you specify MAP(DEC), data item offsets within groups will be in decimal
| notation.
When both XREF data and an embedded MAP summary are on the same line, the
embedded summary is printed first.
You can select or inhibit parts of the MAP listing and embedded MAP summary by
using *CONTROL MAP|NOMAP (or *CBL MAP|NOMAP) statements throughout the source.
For example:
*CONTROL NOMAP
01 A
02 B
*CONTROL MAP
RELATED REFERENCES
MAP on page 333
For remote debugging, there is an Eclipse plugin that provides a client graphical
user interface to the debugging information provided by the Debug Tool engine
running under z/OS or z/OS UNIX. The IBM Debug Tool Plug-in for Eclipse is
included with Rational Developer for System z and also with the IBM Problem
Determination Tools Studio.
You can specify the TEST suboption NOSOURCE to have smaller object programs
stored on disk. The loaded size does not change, the debug information is never
loaded unless requested, for example, by a debugger such as Debug Tool or by LE
(for CEEDUMP). With the NOSOURCE suboption, the compiler listing will be required
at debug time for the Debug Tool source window.
Specify the OPTIMIZE(0), NOSTGOPT and TEST compiler options to get the most
debugging function.
For details about which compiler options to use for maximum debugging
capability versus best performance, see the related reference about the TEST
compiler option.
RELATED TASKS
Debug Tool User's Guide (Preparing your program for debugging)
RELATED REFERENCES
TEST on page 359
Getting listings
Get the information that you need for debugging by requesting the appropriate
compiler listing with the use of compiler options.
Attention: The listings produced by the compiler are not a programming interface
and are subject to change.
Embedded modified
cross-reference provides
line numbers where
data-names and
procedure-names were
defined
To find the failing verb in a PROCEDURE DIVISION code Generated code LIST on page 3332,4
program or the address in and assembler code
storage of a data item that produced by the compiler3
is moved while the
program is running
To verify you still have a Condensed PROCEDURE Condensed verb listing, OFFSET on page 341
valid logic path after you DIVISION listing global tables,
move or add PROCEDURE WORKING-STORAGE
DIVISION sections information, and literals
To find an instance of a Alphabetic listing of verbs Each verb used, number of VBREF on page 366
certain verb times each verb was used,
line numbers where each
verb was used
1. To eliminate messages, turn off the options (such as FLAG) that govern the level of compile diagnostic
information. You can also selectively suppress messages by using the MSGEXIT suboption of the EXIT compiler
option.
2. To use your line numbers in the compiled program, use the NUMBER compiler option. The compiler checks the
sequence of your source statement line numbers in columns 1 through 6 as the statements are read in. When it
finds a line number out of sequence, the compiler assigns to it a number with a value one higher than the line
number of the preceding statement. The new value is flagged with two asterisks. A diagnostic message
indicating an out-of-sequence error is included in the compilation listing.
3. The context of the procedure reference is indicated by the characters preceding the line number.
4. You can control the listing of generated object code by selectively placing *CONTROL LIST and *CONTROL NOLIST
(or equivalently, *CBL LIST and *CBL NOLIST) statements in your source. Note that the *CONTROL statement is
different than the PROCESS (or CBL) statement.
The output is generated if:
v You specify the COMPILE option (or the NOCOMPILE(x) option is in effect and an error level x or higher does not
occur).
v You do not specify the OFFSET option. OFFSET and LIST are mutually exclusive options with OFFSET taking
precedence.
RELATED TASKS
Generating a list of compiler messages on page 280
Reading LIST output on page 397
Language Environment Debugging Guide (Debugging COBOL programs)
RELATED REFERENCES
Messages and listings for compiler-detected errors on page 280
IGYSC3002-I A severe error was found in the program. The "OPTIMIZE" and the "STGOPT" compiler
options were cancelled.
160 IGYDS1089-S "ASSIGNN" was invalid. Scanning was resumed at the next area "A" item, level-number,
or the start of the next clause.
192 IGYDS1050-E File "LOCATION-FILE" contained no data record descriptions. The file definition was
discarded.
192 IGYGR1207-S The "ASSIGN" clause was missing or invalid in the "SELECT" entry for file "LOCATION-FILE".
The file definition was discarded.
888 IGYPS2052-S An error was found in the definition of file "LOCATION-FILE". The reference to this file
was discarded.
1000 IGYPS2121-S "WS-DATE" was not defined as a data-name. The statement was discarded.
1004 IGYPS2053-S An error was found in the definition of file "LOCATION-FILE". This input/output statement
was discarded.
1015 IGYPS2121-S "LOC-CODE" was not defined as a data-name. The statement was discarded.
1212 IGYPS2121-S "WS-NUMERIC-DATE" was not defined as a data-name. The statement was discarded.
1655 IGYPG3113-W Truncation of high-order digit positions may occur due to precision of intermediate results
exceeding 30 digits.
Messages Total Informational Warning Error Severe Terminating (6)
Printed: 13 1 1 1 10
* Statistics for COBOL program IGYTCARA: (7)
* Source records = 1755
* Data Division statements = 295
* Procedure Division statements = 479
* Generated COBOL statements = 0
* Program complexity factor = 486
End of compilation 1, program IGYTCARA, highest severity 12. (8)
Return code 12
(1) Message about options passed to the compiler at compiler invocation. This
message does not appear if no options were passed.
OPTFILE
Requests options from a SYSOPTF data set.
(2) Options coded in the PROCESS (or CBL) statement.
NOOFFSET
Suppresses a condensed listing of the PROCEDURE DIVISION.
NOMAP Suppresses a map report of the items defined in the DATA DIVISION.
(3) Options obtained from the SYSOPTF data set (because the OPTFILE
compiler option was specified).
NOLIST Suppresses an assembler-language expansion of the source code.
TEST The program was compiled for use with debugging and problem
determination tools (such as Debug Tool and Fault Analyzer) and
to get local variables listed in CEEDUMP.
(4) Status of options at the start of this compilation.
(5) Program diagnostics. The first message refers you to any library phase
diagnostics. Diagnostics for the library phase are presented at the
beginning of the listing.
(6) Count of diagnostic messages in this program, grouped by severity level.
(7) Program statistics for the program IGYTCARA.
(8) Program statistics for the compilation unit. When you perform a batch
compilation, the return code is the highest message severity level for the
entire compilation.
(1) Scale line, which labels Area A, Area B, and source-code column numbers
(2) Source-code line number assigned by the compiler
(3) Program (PL) and statement (SL) nesting level
(4) Columns 1 through 6 of program (the sequence number area)
(1)
Data Definition Attribute codes (rightmost column) have the following meanings:
D = Object of OCCURS DEPENDING G = GLOBAL S = Spanned file
E = EXTERNAL O = Has OCCURS clause U = Undefined format file
F = Fixed-length file OG= Group has own length definition V = Variable-length file
FB= Fixed-length blocked file R = REDEFINES VB= Variable-length blocked file
X = Unallocated
(2) (3) (4) (5) (6) (7) (8) (9)
Source Hierarchy and Base Displacement Asmblr Data Data Def
LineID Data Name Locator Structure Definition Data Type Attributes
4 PROGRAM-ID IGYTCARA----------------------------------------------------------------------------------------------------*
58 FD COMMUTER-FILE . . . . . . . . . . . . . . . . BLF=00001 VSAM F
60 1 COMMUTER-RECORD . . . . . . . . . . . . . . . BLF=00001 DS 0CL80 Group
61 2 COMMUTER-KEY. . . . . . . . . . . . . . . . BLF=00001 000000000 DS 16C Display
62 2 FILLER. . . . . . . . . . . . . . . . . . . BLF=00001 000000016 DS 64C Display
64 FD COMMUTER-FILE-MST . . . . . . . . . . . . . . BLF=00002 VSAM F
66 1 COMMUTER-RECORD-MST . . . . . . . . . . . . . BLF=00002 DS 0CL80 Group
67 2 COMMUTER-KEY-MST. . . . . . . . . . . . . . BLF=00002 000000000 DS 16C Display
68 2 FILLER. . . . . . . . . . . . . . . . . . . BLF=00002 000000016 DS 64C Display
140 1 STATUS-AREA . . . . . . . . . . . . . . . . . DS 0CL8 Group
141 2 COMMUTER-FILE-STATUS. . . . . . . . . . . . 000000000 DS 2C Display
142 88 I-O-OKAY. . . . . . . . . . . . . . . . . .
143 2 COMMUTER-VSAM-STATUS. . . . . . . . . . . . 000000002 DS 0CL6 Group
144 3 VSAM-R15-RETURN-CODE. . . . . . . . . . . 000000002 DS 2C Binary
145 3 VSAM-FUNCTION-CODE. . . . . . . . . . . . 000000004 DS 2C Binary
146 3 VSAM-FEEDBACK-CODE. . . . . . . . . . . . 000000006 DS 2C Binary
148 77 UPDATE-FILE-STATUS. . . . . . . . . . . . . . DS 2C Display
149 77 LOCCODE-FILE-STATUS . . . . . . . . . . . . . DS 2C Display
150 77 UPDPRINT-FILE-STATUS. . . . . . . . . . . . . DS 2C Display
152 1 FLAGS . . . . . . . . . . . . . . . . . . . . DS 0CL3 Group
153 2 TRANSACTION-EOF-FLAG. . . . . . . . . . . . 000000000 DS 1C Display
154 88 TRANSACTION-EOF . . . . . . . . . . . . . .
155 2 LOCATION-EOF-FLAG . . . . . . . . . . . . . 000000001 DS 1C Display
156 88 LOCATION-EOF. . . . . . . . . . . . . . . .
157 2 TRANSACTION-MATCH-FLAG. . . . . . . . . . . 000000002 DS 1C Display
158 88 TRANSACTION-MATCH . . . . . . . . . . . . .
RELATED REFERENCES
Terms used in MAP output on page 395
Symbols used in LIST and MAP output on page 396
RELATED REFERENCES
Symbols used in LIST and MAP output on page 396
1. n is the size in bytes for fixed-length groups and the maximum size in bytes for variable-length groups.
2. If the SYNCHRONIZED clause appears, these fields are used.
1. n is the number of the entry. For base locators, it can also be XXXXX, indicating a data item that was deleted by
STGOPT processing.
RELATED REFERENCES
Signature information bytes
Example: MAP output on page 392
Language Environment Programming Guide (Stack storage overview)
The INFO BYTE section of the listing also provides the following values:
v The number of DATA DIVISION statements
v The number of PROCEDURE DIVISION statements
Check return code: A return code greater than 4 from the compiler could mean
that some of the verbs shown in the information bytes might have been discarded
from the program.
RELATED REFERENCES
LIST on page 333
RELATED REFERENCES
Signature information bytes on page 398
RELATED REFERENCES
Symbols used in LIST and MAP output on page 396
For details on how to use the program prolog areas to locate information in the
listing file, see z/OS Language Environment Vendor Interfaces.
DATA VALIDATION AND UPDATE PROGRAM IGYTCARA Date 03/30/2013 Time 10:48:16
1 2 3 4
PPA1: Entry Point Constants
0081E0 1CCEA506 =F483304710 Flags
0081E4 00008310 =A(PPA2-IGYTCARA)
0081E8 00008378 =A(PPA3-IGYTCARA)
0081EC 00000000 =F0 No EPD
0081F0 FFFE0000 =F-131072 Register Save Mask
0081F4 40000000 =F1073741824 Member Flags
0081F8 90 =AL1(144) Flags
0081F9 000978 =AL3(2424) Callees DSA use/8
0081FC 0000 =AL1(0) Flags
0081FE 0012 =H18 Offset/2 to CDL
008200 D00006D0 =F-805304624 State variable location
008204 00000000 =F0 CDL function length/2
008208 00000000 =F0 CDL function EP offset
00820C 00000000 =F0 CDL prolog
008210 00000000 =F0 CDL epilog
008214 00000000 =F0 CDL end
008218 0008 **** AL2(8),CIGYTCARA
PPA1 End
There is one PPA2 for each program. The offset to the PPA2 is recorded in each PPA1.
The PPA2 contains offsets to the Time Stamp and Version Information section of
the listing as well as to the PPA4 section.
PPA2: Entry Point Constants
008310 04002203 =F67117571 Flags
008314 FFFF7CF0 =A(CEESTART-PPA2)
008318 00000030 =F48 A(PPA4-PPA2)
00831C FFFFFFB8 =A(TIMESTMP-PPA2)
008320 FFFF7CF0 =A(PrimaryEntryPoint-PPA2)
008324 02200000 =F35651584 Flags
PPA2 End
There is one PPA3 for each program (including each nested program) in a COBOL
source file. Each entry contains offsets, relative to the PPA3 itself, to the base locator
table and to the special register table. The PPA3 also contains an offset from the
start of the program to the first COBOL statement.
PPA3: Entry Point Constants
0014D8 00000000 =F0 Flags
0014DC 000000C0 =F192 A(Base_Locator_Table-PPA3)
0014E0 000000D8 =F216 A(Special_Register_Table-PPA3)
0014E0 00000184 =X184 A(User_Entry-CUEntry)
PPA3 End
There is one PPA4 for each program. It has offsets to various compiler generated
tables, such as the writable static area ( the Static Map and WSA24 sections). The
offset to the PPA4 is recorded in a field of the PPA2.
PPA4: Entry Point Constants
008340 08000000 =F134217728 Flags 1
008344 00020100 =F131328 Flags 2
008348 00000000 =F0 A(NORENTstatic)
00834C 00000000 =F0 Q(RENTstatic)
008350 00000000 =F0 A(DATA24_address_cell-RENTstatic)
008354 FFFF7CC0 =F-33600 A(Code-PPA4)
008358 00008398 =F33688 Code Length
00835C 00000000 =F0 Length NORENTstatic
008360 00002204 =F8708 Length RENTstatic
008364 00000000 =F0 Length DATA24
008368 002A =X2A A(CUName-PPA4)
PPA4 End
The STATIC MAP contains the level-1 symbols defined in the WORKING-STORAGE part
of the program. If compiled with the RENT option, the first column contains the
offset of the level-1 symbol from the start of the Working Storage Area (WSA) for
the program. For NORENT compilations, the offset is the start of the level-1 from a
block of storage allocated by the compiler. The starting address of this block
resides in the Constant Area. The second column is the size of the symbol,
including all of its sub-level members. The third column is the name.
* * * * * S T A T I C M A P * * * * *
0 14 BLF_Ptrs
14 C BLT_Ptrs
20 4 JNIENVPTR
28 2 RETURN-CODE
30 2 SORT-RETURN
38 8 SORT-CONTROL
40 4 SORT-CORE-SIZE
48 4 SORT-FILE-SIZE
50 4 SORT-MODE-SIZE
58 8 SORT-MESSAGE
60 4 TALLY
68 1 SHIFT-OUT
70 1 SHIFT-IN
78 4 XML-CODE
80 1E XML-EVENT
A0 4 XML-INFORMATION
A8 50 COMMUTER-FILE
F8 50 COMMUTER-FILE-MST
148 7A PRINT-FILE
1C8 1 WORKING-STORAGE-FOR-IGYCARA
1D0 2 COMP-CODE
1D8 3 WS-TYPE
1E0 2 I-F-STATUS-AREA
1E8 8 STATUS-AREA
1F0 2 UPDATE-FILE-STATUS
1F8 2 LOCCODE-FILE-STATUS
200 2 UPDPRINT-FILE-STATUS
208 3 FLAGS
If you compile with the compiler option DATA(24), a WSA 24 Map is generated. It
shows the names of the symbols that are mapped below the 16 MB line. The
symbols in the WORKING-STORAGE area in the source are mapped into the writable
static area which is shown in the Static Map.
* * * * * W S A 2 4 M A P * * * * *
0 4 JNIENVPTR
8 2 RETURN-CODE
10 2 SORT-RETURN
18 8 SORT-CONTROL
20 4 SORT-CORE-SIZE
28 4 SORT-FILE-SIZE
30 4 SORT-MODE-SIZE
38 8 SORT-MESSAGE
40 4 TALLY
The compiler generates loads from (and stores to) the Constant Area by loading
the starting address of Constant Area and adding the fixed offsets to the respective
constants or literals.
CONSTANT AREA:
(1) (2) (3) (4)
006A98 (+0) 00CCDDFF 00000000 C9C7E8E3 C3C1D9C1 00000000 00000000 C9C7E9E2 D9E3C3C4 |........IGYTCARA........IGZSRTCD|
006AB8 (+32) 40000A00 40000000 00000008 00000000 E2E8E2D6 E4E34040 00100000 00000000 | ... ...........SYSOUT ........|
006AD8 (+64) 0E000000 00000001 0F000000 0000001E 00000000 40000000 00000003 0064003C |.................... ...........|
006AF8 (+96) 000FE800 9F0F0000 00000011 00000000 E3D9C1D5 E2C1C3E3 4B40C3D6 C4C50000 |..Y.............TRANSACT. CODE..|
006B18 (+128) 0000000E 00000000 E2C8C9C6 E340C3D6 C4C54040 40400000 C8D6D4C5 40D3D6C3 |........SHIFT CODE ..HOME LOC|
006B38 (+160) 4B40C3D6 C4C50000 E6D6D9D2 40D3D6C3 4B40C3D6 C4C50000 D3C1E2E3 40D5C1D4 |. CODE..WORK LOC. CODE..LAST NAM|
006B58 (+192) C5404040 40400000 C9D5C9E3 C9C1D3E2 40404040 40400000 C4E4D7D3 C9C3C1E3 |E ..INITIALS ..DUPLICAT|
006B78 (+224) C540D9C5 C34B0000 D9C5C34B 40D5D6E3 40C6D6E4 D5C40000 C1C4C4D9 C5E2E240 |E REC...REC. NOT FOUND..ADDRESS |
006B98 (+256) 40404040 40400000 C3C9E3E8 40404040 40404040 40400000 E2E3C1E3 C540C3D6 | ..CITY ..STATE CO|
006BB8 (+288) C4C54040 40400000 E9C9D7C3 D6C4C540 40404040 40400000 C8D6D4C5 40D7C8D6 |DE ..ZIPCODE ..HOME PHO|
006BD8 (+320) D5C54040 40400000 E6D6D9D2 40D7C8D6 D5C54040 40400000 C8D6D4C5 40D1E4D5 |NE ..WORK PHONE ..HOME JUN|
006BF8 (+352) C3E3C9D6 D5400000 E6D6D9D2 40D1E4D5 C3E3C9D6 D5400000 C4D9C9E5 C9D5C740 |CTION ..WORK JUNCTION ..DRIVING |
006C18 (+384) E2E3C1E3 E4E20000 40D9C5D7 D6D9E340 407B7A40 C9C7E8E3 C3C1D9C1 40404040 |STATUS.. REPORT #: IGYTCARA |
006C38 (+416) 40404040 40404040 40404040 40404040 40404040 40404040 40404000 00000033 | .....|
006C58 (+448) C3D6D4D4 E4E3C5D9 40C6C9D3 C540E4D7 C4C1E3C5 40D3C9E2 E3404040 40404040 |COMMUTER FILE UPDATE LIST |
006C78 (+480) 40404040 40404040 40404040 40404040 40400000 00000032 40404040 40404040 | ...... |
006C98 (+512) D7C1C7C5 407B7A40 00000000 00000010 40D7D9D6 C7D9C1D4 407B7A40 C9C7E8E3 |PAGE #: ........ PROGRAM #: IGYT|
006CB8 (+544) C3C1D9C1 40404040 404040D9 E4D540E3 C9D4C57A 40000000 00000025 7A000000 |CARA RUN TIME: .......:...|
006CD8 (+576) 00000030 00000000 D9E4D540 C4C1E3C5 7A400000 0000000A 61000000 0000000B |........RUN DATE: ....../.......|
For more information about the base locator table, see z/OS Language Environment
Vendor Interfaces.
RELATED REFERENCES
z/OS Language Environment Vendor Interfaces (Base locator table)
Each entry in the special register table consists of the following items:
v A byte which represents the following information:
Special register ID number (bits 0 - 4). ID = 1 represents the RETURN-CODE
register
Access mode (bits 5 - 8)
- MODE = 0; Base Address = Top of Stack
- MODE = 1; Base Addr = NORENT Static
- MODE = 2; Base Addr = 32-bit RENT static
- MODE = 3; 24-bit NORENT static
v An offset to the special register
Each entry contains the address, length and symbol type. Symbol types are:
ED External Definition
SD Section Definition
LD Label Definition
ER External Reference
PR Pseudo Register
E X T E R N A L S Y M B O L D I C T I O N A R Y
* * * * * A U T O M A T I C M A P * * * * *
1 2 3
OFFSET (HEX) LENGTH (HEX) NAME
80 4 _@CAA
C8 3 _BEtemp200
CC 3 _BEtemp204
D0 3 _BEtemp208
D4 3 _BEtemp212
D8 3 _BEtemp216
DC 3 _BEtemp220
E0 3 _BEtemp224
E4 3 _BEtemp228
E8 10 _BEtemp232
F8 20 _BEtemp248
118 20 _BEtemp280
138 4 _BEtemp312
13C 4 _BEtemp316
140 4 _BEtemp320
144 4 _BEtemp324
148 4 _BEtemp328
14C 4 _BEtemp332
150 4 _BEtemp336
154 4 _BEtemp340
158 4 _BEtemp344
15C 4 _BEtemp348
160 4 _BEtemp352
164 4 _BEtemp356
168 4 _BEtemp360
16C 4 _BEtemp364
170 4 _BEtemp368
174 4 _BEtemp372
178 4 _BEtemp376
(1) Hexadecimal offset of the DSA field from the start of the DSA
(2) Length (in hexidecimal) of the DSA field
(3) Symbol name
265 ABEND-ITEM1
266 ABEND-ITEM2
347 ADD-CODE . . . . . . . . . . . 1102 1162
381 ADDRESS-ERROR. . . . . . . . . M1126
280 AREA-CODE. . . . . . . . . . . 1236 1261 1324 1345
382 CITY-ERROR . . . . . . . . . . M1129
877 000-DO-MAIN-LOGIC
930 050-CREATE-STL-MASTER-FILE . . P879
982 100-INITIALIZE-PARAGRAPH . . . P880
1441 1100-PRINT-I-F-HEADINGS. . . . P915
1481 1200-PRINT-I-F-DATA. . . . . . P916
1543 1210-GET-MILES-TIME. . . . . . P1510
1636 1220-STORE-MILES-TIME. . . . . P1511
1652 1230-PRINT-SUB-I-F-DATA. . . . P1532
1676 1240-COMPUTE-SUMMARY . . . . . P1533
1050 200-EDIT-UPDATE-TRANSACTION. . P886
1124 210-EDIT-THE-REST. . . . . . . P1116
1159 300-UPDATE-COMMUTER-RECORD . . P888
1207 310-FORMAT-COMMUTER-RECORD . . P1164 P1179
1258 320-PRINT-COMMUTER-RECORD. . . P1165 P1176 P1182 P1192
1288 330-PRINT-REPORT . . . . . . . P1178 P1202 P1256 P1280 P1340 P1365 P1369
1312 400-PRINT-TRANSACTION-ERRORS . P890
Cross-reference of data-names:
(1) Line number where the name was defined.
(2) Data-name.
(3) Line numbers where the name was used. If M precedes the line number, the
data item was explicitly modified at the location.
EXTERNAL EXTERNAL1. . . . . . . . . . . 25
2 X. . . . . . . . . . . . . . . 41
12 X1 . . . . . . . . . . . . . . 33 7
20 X11. . . . . . . . . . . . . . 25 16
27 X12. . . . . . . . . . . . . . 32 17
35 X2 . . . . . . . . . . . . . . 40 8
SYSLIB DD DSN=USERID.COBOL.COPY, 0
DD DSN=USERID.COBOL.LIB2PDSE, 1
DD DSN=USERID.COBOL.LIB3, 2
DD DSN=USERID.COBOL.LIB4X 3
Thus for example member NSMAP shown in the listing above was found
in data set USERID.COBOL.LIB3, which is two levels down from the first
data set in the SYSLIB concatenation.
(4) Creation date is shown if the PDS or PDSE was edited with STATS ON in
ISPF.
Tip: Under z/OS, if there is more than one data set in your SYSLIB concatenation,
the COPY/BASIS cross-reference might in some cases be incomplete or missing. For
details, see the related reference about the XREF compiler option.
If you compile in the z/OS UNIX shell, the cross-reference looks like the excerpt
shown below.
Note: Some names were truncated. > = truncated on right < = truncated on left
(5) From the COPY statement in the source; for example the COPY statement
corresponding to the third item in the cross-reference above would be:
COPY cobol/copyA.cpy Of ALTDD2
(6) The fully qualified path of the file from which the COPY member was
copied
(7) Truncation of a long text-name or library-name on the right is marked by a
greater-than sign (>).
(8) Truncation of a long file name on the left is marked by a less-than sign (<).
RELATED REFERENCES
XREF on page 369
(1) Line number. Your line numbers or compiler-generated line numbers are
listed.
(2) Offset, from the start of the program, of the code generated for this verb
(in hexadecimal notation).
The verbs are listed in the order in which they occur and are listed once
for each time they are used.
(3) Verb used.
RELATED REFERENCES
OFFSET on page 341
When you use the CICS compiler option, the Enterprise COBOL compiler handles
both native COBOL statements and embedded CICS statements in the source
program. You can still use the separate CICS translator to translate CICS
statements to COBOL code, but use of the integrated CICS translator is
recommended instead.
| After you compile and bind your program, you need to do some other steps such
as updating CICS tables before you can run the COBOL program under CICS.
However, these CICS topics are beyond the scope of COBOL information. For
further information, see the related tasks.
You can determine how runtime errors are handled by setting the CBLPSHPOP
runtime option. For information about CICS HANDLE and CBLPSHPOP, see the related
tasks.
RELATED CONCEPTS
Integrated CICS translator on page 425
RELATED TASKS
Coding COBOL programs to run under CICS
Compiling with the CICS option on page 423
Using the separate CICS translator on page 426
Handling errors by using CICS HANDLE on page 428
Language Environment Programming Guide (Condition handling under CICS:
using the CBLPSHPOP runtime option)
CICS Application Programming Guide
RELATED REFERENCES
CICS on page 312
CICS commands have the basic format shown above. Within EXEC commands, use
the space as a word separator; do not use a comma or a semicolon. Do not code
COBOL statements within EXEC CICS commands.
Restriction: You cannot run COBOL programs that have object-oriented syntax for
Java interoperability in CICS. In addition, if you write programs to run under
CICS, do not use the following code:
v FILE-CONTROL entry in the ENVIRONMENT DIVISION, unless the FILE-CONTROL entry
is used for a SORT statement
If you plan to use the separate CICS translator, you must put any REPLACE
statements that contain EXEC commands after the PROCEDURE DIVISION header for
the program, otherwise the commands will not be translated.
Coding file input and output: You must use CICS commands for most input and
output processing. Therefore, do not describe files or code any OPEN, CLOSE, READ,
START, REWRITE, WRITE, or DELETE statements. Instead, use CICS commands to
retrieve, update, insert, and delete data.
Displaying the contents of data items: DISPLAY to the system logical output device
(SYSOUT, SYSLIST, SYSLST) is supported under CICS. The DISPLAY output is
written to the Language Environment message file (transient data queue CESE).
DISPLAY . . . UPON CONSOLE and DISPLAY . . . UPON SYSPUNCH, however, are not
| allowed. You can specify the DISPSIGN option to control output formatting for
| DISPLAY of signed numeric items.
RELATED TASKS
Sorting under CICS on page 237
Getting the system date under CICS
Calling to or from COBOL programs
Determining the success of ECI calls on page 423
Using the separate CICS translator on page 426
RELATED REFERENCES
CICS SORT application restrictions on page 237
DISPSIGN on page 320
You can use any of these format-2 ACCEPT statements in CICS to get the system
date:
v ACCEPT identifier-2 FROM DATE (two-digit year)
v ACCEPT identifier-2 FROM DATE YYYYMMDD
v ACCEPT identifier-2 FROM DAY (two-digit year)
v ACCEPT identifier-2 FROM DAY YYYYDDD
v ACCEPT identifier-2 FROM DAY-OF-WEEK (one-digit integer, where 1 represents
Monday)
You can use this format-2 ACCEPT statement in CICS to get the system time:
v ACCEPT identifier-2 FROM TIME
Alternatively, you can use the CURRENT-DATE intrinsic function, which can also
provide the time.
RELATED TASKS
Assigning input from a screen or file (ACCEPT) on page 34
RELATED REFERENCES
CURRENT-DATE (Enterprise COBOL Language Reference)
If you are calling a separately compiled COBOL program that was processed with
either the separate CICS translator or the integrated CICS translator, you must pass
DFHEIBLK and DFHCOMMAREA as the first two parameters in the CALL statement.
Dynamic calls:
You can use COBOL dynamic calls when running under CICS. If a COBOL
program contains EXEC CICS statements or contains EXEC SQL statements, the
NODYNAM compiler option is required. To dynamically call a program in this case,
you can use CALL identifier with the NODYNAM compiler option.
If a COBOL program contains no EXEC CICS statements and contains no EXEC SQL
statements, there is no requirement to compile with NODYNAM. To dynamically call a
program in this case, you can use either CALL literal with the DYNAM compiler option,
or CALL identifier.
You must define dynamically called programs in the CICS program processing
table (PPT) if you are not using CICS autoinstall. Under CICS, COBOL programs
do not support dynamic calls to subprograms that have the RELOAD=YES option
coded in their CICS PROGRAM definition. Dynamic calls to programs that are defined
with RELOAD=YES can cause a storage shortage. Use the RELOAD=NO option for
programs that are to be dynamically called by COBOL.
Support for ILC with other high-level languages is available. Where ILC is not
supported, you can use CICS LINK, XCTL, and RETURN instead.
The following table shows the calling relationship between COBOL and assembler
programs. In the table, assembler programs that conform to the interface that is
described in the Language Environment Programming Guide are called Language
Environment-conforming assembler programs. Those that do not conform to the
interface are non-Language Environment-conforming assembler programs.
Table 55. Calls between COBOL and assembler under CICS
Language Non-Language
Calls between COBOL and Environment-conforming Environment-conforming
assembler programs assembler program assembler program
From an Enterprise COBOL Yes Yes
program to the assembler
program?
From the assembler program to Yes No
an Enterprise COBOL program?
Nested programs:
When you compile with the integrated CICS translator, the translator generates the
DFHEIBLK and DFHCOMMAREA control blocks with the GLOBAL clause in the outermost
program. Therefore if you code nested programs, you do not have to pass these
control blocks as arguments on calls to the nested programs.
RELATED CONCEPTS
Integrated CICS translator on page 425
RELATED TASKS
Using the separate CICS translator on page 426
Choosing the DYNAM or NODYNAM compiler option on page 441
Handling errors when calling programs on page 250
Language Environment Writing ILC Communication Applications (ILC under CICS)
CICS External Interfaces Guide
Language Environment Programming Guide
RELATED REFERENCES
DYNAM on page 323
To ensure that a meaningful return code occurs at termination, set the RETURN-CODE
special register before you terminate your program. To make the job return code
reflect the status of the last call to CICS, set the RETURN-CODE special register based
on the response codes from the last call to the external CICS interface.
RELATED TASKS
CICS External Interfaces Guide
If you specify the NOCICS option, the compiler diagnoses and discards any CICS
statements that it finds in your source program. If you have already used the
separate CICS translator, you must use NOCICS.
You can specify the CICS option in any of the compiler option sources: compiler
invocation, PROCESS or CBL statements, or installation default. If the CICS option is
the COBOL installation default, you cannot specify CICS suboptions. However,
making the CICS option the installation default is not recommended, because the
changes that are made by the integrated CICS translator are not appropriate for
non-CICS applications.
All CBL or PROCESS statements must precede any comment lines, in accordance with
the rules for Enterprise COBOL.
When you use the integrated CICS translator, you must compile with the following
options:
Table 56. Compiler options required for the integrated CICS translator
Compiler option Comment
| AFP If your code runs on a version of CICS Transaction Server that
| is earlier than V4.1, you must specify AFP(VOLATILE).
CICS If you specify NOLIB, DYNAM, or NORENT, the compiler forces
NODYNAM, and RENT on.
NODYNAM Must be in effect with CICS
RENT Must be in effect with CICS
In addition, IBM recommends that you use the compiler option WORD(CICS) to
cause the compiler to flag language elements that are not supported under CICS.
To compile your program with the integrated CICS translator, you can use the
standard JCL procedural statements that are supplied with COBOL. In addition to
specifying the above compiler options, you must change your JCL in two ways:
v Specify the STEPLIB override for the COBOL step.
v Add the data set that contains the integrated CICS translator services, unless
these services are in the linklist.
| The default name of the data set for CICS Transaction Server V5R1 is
| CICSTS51.CICS.SDFHLOAD, but your installation might have changed the name.
For example, you might have the following line in your JCL:
//STEPLIB DD DSN=CICSTS41.CICS.SDFHLOAD,DISP=SHR
The COBOL compiler listing includes the error diagnostics (such as syntax errors
in the CICS statements) that the integrated CICS translator generates. The listing
reflects the input source; it does not include the COBOL statements that the
integrated CICS translator generates.
Compiling a sequence of programs: When you use the CICS option to compile a
source file that contains a sequence of COBOL programs, the order of precedence
of the options from highest to lowest is:
v Options that are specified in the CBL or PROCESS card that initiates the unit of
compilation
v Options that are specified when the compiler is started
v CICS default options
RELATED CONCEPTS
Integrated CICS translator on page 425
RELATED TASKS
Coding COBOL programs to run under CICS on page 419
Separating CICS suboptions on page 425
CICS Application Programming Guide
For example, suppose that a JCL file has the following code:
//STEP1 EXEC IGYWC, . . .
//PARM.COBOL="CICS("FLAG(I)")"
//COBOL.SYSIN DD *
CBL CICS("DEBUG")
CBL CICS("LINKAGE")
IDENTIFICATION DIVISION.
PROGRAM-ID. COBOL1.
During compilation, the compiler passes the following CICS suboption string to
the integrated CICS translator:
"FLAG(I) DEBUG LINKAGE"
The concatenated strings are delimited with single spaces and with a quotation
mark or single quotation mark around the group. When the compiler finds
multiple instances of the same CICS suboption, the last specification of the
suboption in the concatenated string takes effect. The compiler limits the length of
the concatenated CICS suboption string to 4 KB.
RELATED REFERENCES
CICS on page 312
When the compiler encounters CICS statements, and at other significant points in
the source program, the compiler interfaces with the integrated CICS translator. All
text between EXEC CICS and END-EXEC statements is passed to the translator. The
translator takes appropriate actions and then returns to the compiler, typically
indicating which native language statements to generate.
Note: The CICS documentation states that the EXCI translator option is not
supported for programs compiled with the integrated CICS translator, but CICS
has reversed this position. You can now compile with the EXCI translator option
and ignore the warning message DFH7006I.
RELATED CONCEPTS
CICS Application Programming Guide (The integrated CICS translator)
RELATED TASKS
Coding COBOL programs to run under CICS on page 419
Compiling with the CICS option on page 423
RELATED REFERENCES
CICS on page 312
TRUNC on page 363
To translate CICS statements separately, use the COBOL3 translator option. This
option causes the following line to be inserted:
CBL RENT,NODYNAM,
You can suppress the insertion of a CBL statement by using the CICS translator
option NOCBLCARD.
After you use the separate CICS translator, use the following compiler options
when you compile the program:
Table 57. Compiler options required for the separate CICS translator
Required compiler option Condition
RENT
NODYNAM The program is translated by the CICS translator.
For example, if you use the separate CICS translator and have a data item defined
as PIC S9(8) BINARY that might receive a value greater than eight digits, use the
TRUNC(BIN) compiler option, change the item to USAGE COMP-5, or change the
PICTURE clause.
You might also want to avoid using these options, which have no effect:
v ADV
v FASTSRT
v OUTDD
The input data set for the compiler is the data set that you received as a result of
translation, which is SYSPUNCH by default.
RELATED CONCEPTS
Integrated CICS translator on page 425
RELATED TASKS
Compiling with the CICS option on page 423
If you intend to use the SORT statement under CICS (COBOL supports an interface
for the SORT statement under CICS), you must change the CICS reserved-word
table to remove the words in bold above from the list of words marked as
restricted.
RELATED TASKS
Compiling with the CICS option on page 423
Sorting under CICS on page 237
RELATED REFERENCES
WORD on page 367
If you use the CICS HANDLE CONDITION or CICS HANDLE AID commands, the LABEL
specified for the CICS HANDLE command must be in the same PROCEDURE DIVISION
as the CICS command that causes branching to the CICS HANDLE label. You cannot
use the CICS HANDLE commands with the LABEL option to handle conditions, aids,
or abends that were caused by another program invoked with the COBOL CALL
statement. Attempts to perform cross-program branching by using the CICS HANDLE
command with the LABEL option result in a transaction abend.
If a condition, aid, or abend occurs in a nested program, the LABEL for the
condition, aid, or abend must be in the same nested program; otherwise
unpredictable results occur.
Performance considerations: When CBLPSHPOP is OFF, the run time does not
perform CICS PUSH or POP on a CALL to any COBOL subprogram. If the
subprograms do not use any of the EXEC CICS condition-handling commands, you
can run with CBLPSHPOP(OFF), thus eliminating the overhead of the PUSH HANDLE
and POP HANDLE commands. As a result, performance can be improved compared to
running with CBLPSHPOP(ON).
RELATED TASKS
Running efficiently with CICS, IMS, or VSAM on page 662
RELATED REFERENCES
Enterprise COBOL Migration Guide (CICS HANDLE
commands and the CBLPSHPOP runtime option)
Enterprise COBOL Version 4 Performance Tuning
Program A has a CICS HANDLE CONDITION command and program B has no CICS
HANDLE commands. Program A calls program B; program A also calls nested
program A1. A condition is handled in one of three scenarios.
(1) CBLPSHPOP(ON): If the CICS READ command in program B causes a
condition, the condition is not handled by program A (the HANDLE
specifications are suspended because the run time performs a CICS PUSH
HANDLE). The condition turns into a transaction abend.
(2) CBLPSHPOP(OFF): If the CICS READ command in program B causes a
condition, the condition is not handled by program A (the run time
diagnoses the attempt to perform cross-program branching by using a CICS
HANDLE command with the LABEL option). The condition turns into a
transaction abend.
(3) If the CICS READ command in nested program A1 causes a condition, the
flow of control goes to label ERR-1, and unpredictable results occur.
***********************************************************
* Program A *
***********************************************************
ID DIVISION.
PROGRAM-ID. A.
. . .
PROCEDURE DIVISION.
EXEC CICS HANDLE CONDITION
ERROR(ERR-1)
END-EXEC.
CALL B USING DFHEIBLK DFHCOMMAREA.
CALL A1.
. . .
THE-END.
EXEC CICS RETURN END-EXEC.
ERR-1.
. . .
* Nested program A1.
ID DIVISION.
PROGRAM-ID. A1.
PROCEDURE DIVISION.
EXEC CICS READ (3)
FILE(LEDGER)
INTO(RECORD)
RIDFLD(ACCTNO)
END-EXEC.
END PROGRAM A1.
RELATED CONCEPTS
DB2 coprocessor
COBOL and DB2 CCSID determination on page 437
RELATED TASKS
Coding SQL statements on page 432
Compiling with the SQL option on page 435
Choosing the DYNAM or NODYNAM compiler option on page 441
RELATED REFERENCES
Differences in how the DB2 precompiler and coprocessor behave on page 439
DB2 coprocessor
When you use the DB2 coprocessor (called SQL statement coprocessor by DB2), the
compiler handles your source programs that contain embedded SQL statements
without your having to use a separate precompile step.
When the compiler encounters SQL statements in the source program, it interfaces
with the DB2 coprocessor. All text between EXEC SQL and END-EXEC statements is
passed to the coprocessor. The coprocessor takes appropriate actions for the SQL
statements and indicates to the compiler which native COBOL statements to
generate for them.
Compiling with the DB2 coprocessor generates a DB2 database request module
(DBRM) along with the usual COBOL compiler outputs such as object module and
listing. The DBRM writes to the data set that you specified in the DBRMLIB DD
statement in the JCL for the COBOL compile step. As input to the DB2 bind
process, the DBRM data set contains information about the SQL statements and
host variables in the program.
RELATED CONCEPTS
COBOL and DB2 CCSID determination on page 437
RELATED TASKS
Compiling with the SQL option on page 435
RELATED REFERENCES
Differences in how the DB2 precompiler and coprocessor behave on page 439
SQL on page 354
RELATED TASKS
Using SQL INCLUDE with the DB2 coprocessor
Using character data in SQL statements on page 433
Using national decimal data in SQL statements on page 434
Using national group items in SQL statements on page 434
Using binary items in SQL statements on page 435
Determining the success of SQL statements on page 435
DB2 Application Programming and SQL Guide (Coding SQL statements in a
COBOL application)
RELATED REFERENCES
Code-page determination for string host variables in SQL statements on page 437
DB2 SQL Reference
The processing of the name in an SQL INCLUDE statement follows the same rules as
those of the literal in a COPY literal-1 statement that does not have a REPLACING
phrase.
The library search order for SQL INCLUDE statements is the same SYSLIB
concatenation as the compiler uses to resolve COBOL COPY statements that do not
specify a library-name.
RELATED REFERENCES
Chapter 18, Compiler-directing statements, on page 373
Differences in how the DB2 precompiler and coprocessor behave on page 439
COPY statement (Enterprise COBOL Language Reference)
When you use the stand-alone DB2 precompiler, you must specify the code page
(CCSID) in EXEC SQL DECLARE statements for host variables that are declared with
USAGE NATIONAL. You must specify the code page for host variables that are
declared with USAGE DISPLAY or DISPLAY-1 only if the CCSID that is in effect for
the COBOL CODEPAGE compiler option does not match the CCSIDs that are used by
DB2 for character and graphic data.
Consider the following code. The two highlighted statements are unnecessary
when you use the integrated DB2 coprocessor (with the SQLCCSID compiler option,
as detailed in the related concept below), because the code-page information is
handled implicitly.
CBL CODEPAGE(1140) NSYMBOL(NATIONAL)
. . .
WORKING-STORAGE SECTION.
EXEC SQL INCLUDE SQLCA END-EXEC.
01 INT1 PIC S9(4) USAGE COMP.
01 C1140.
49 C1140-LEN PIC S9(4) USAGE COMP.
49 C1140-TEXT PIC X(50).
EXEC SQL DECLARE :C1140 VARIABLE CCSID 1140 END-EXEC.
01 G1200.
49 G1200-LEN PIC S9(4) USAGE COMP.
49 G1200-TEXT PIC N(50) USAGE NATIONAL.
EXEC SQL DECLARE :G1200 VARIABLE CCSID 1200 END-EXEC.
. . .
EXEC SQL FETCH C1 INTO :INT1, :C1140, :G1200 END-EXEC.
If you specify EXEC SQL DECLARE variable-name VARIABLE CCSID nnnn END-EXEC, that
specification overrides the implied CCSID. For example, the following code would
cause DB2 to treat C1208-TEXT as encoded in UTF-8 (CCSID 1208) rather than as
encoded in the CCSID in effect for the COBOL CODEPAGE compiler option:
The NSYMBOL compiler option has no effect on a character literal inside an EXEC SQL
statement. Character literals in an EXEC SQL statement follow the SQL rules for
character constants.
RELATED CONCEPTS
COBOL and DB2 CCSID determination on page 437
RELATED TASKS
DB2 Application Programming and SQL Guide (Coding SQL statements in a
COBOL application)
RELATED REFERENCES
Differences in how the DB2 precompiler and coprocessor behave on page 439
CODEPAGE on page 313
DB2 SQL Reference
Any national decimal host variable that you specify in an EXEC SQL statement must
have the following characteristics:
v It must be signed.
v It must be specified with the SIGN LEADING SEPARATE clause.
v USAGE NATIONAL must be in effect implicitly or explicitly.
RELATED CONCEPTS
Formats for numeric data on page 47
RELATED TASKS
Defining national numeric data items on page 133
RELATED REFERENCES
Differences in how the DB2 precompiler and coprocessor behave on page 439
Because all subordinate items in a national group must have USAGE NATIONAL, a
national group item cannot describe a variable-length string.
RELATED TASKS
Using national groups on page 134
| If you define the binary data items as USAGE BINARY, COMP, or COMP-4, use the
TRUNC(BIN) option. (This technique might have a larger effect on performance than
using USAGE COMP-5 on individual data items.) If instead TRUNC(OPT) or TRUNC(STD)
is in effect, the compiler accepts the items but the data might not be valid because
of the decimal truncation rules. You need to ensure that truncation does not affect
the validity of the data.
RELATED CONCEPTS
Formats for numeric data on page 47
RELATED REFERENCES
TRUNC on page 363
The exception occurs when a program runs under DSN from one of the alternate
entry points of the TSO batch mode module IKJEFT01 (IKJEFT1A or IKJEFT1B). In
this case, the return code is passed in register 15.
After execution of SQL statements, the content of the RETURN-CODE special register
might not be valid. Therefore, even if your COBOL program terminates normally
after successfully using SQL statements, the job step could end with an undefined
return code. To ensure that a meaningful return code is given at termination, set
the RETURN-CODE special register before terminating your program.
RELATED TASKS
DB2 Application Programming and SQL Guide (Coding SQL statements in a
COBOL application)
You can specify the SQL option in any of the compiler option sources: compiler
invocation, PROCESS or CBL statements, or installation default. You cannot specify
DB2 suboptions when the SQL option is the COBOL installation default, but you
can specify default DB2 suboptions by customizing the DB2 product installation
defaults.
The DB2 suboption string that you provide in the SQL compiler option is made
available to the DB2 coprocessor. Only the DB2 coprocessor views the contents of
the string.
You can use standard JCL procedural statements to compile your program with the
DB2 coprocessor. In addition to specifying the above compiler options, specify the
following items in your JCL:
For example, you might have the following lines in your JCL:
//DBRMLIB DD DSN=PAYROLL.MONTHLY.DBRMLIB.DATA(MASTER),DISP=SHR
//STEPLIB DD DSN=DSN910.SDSNLOAD,DISP=SHR
Compiling a batch of programs: If you use the SQL option when compiling a
source file that contains a sequence of COBOL programs (a batch compile
sequence), SQL must be in effect for only the first program of the sequence.
Although you can specify SQL upon compiler invocation, the option will be in
effect for only the first program. If you specify SQL in a CBL or PROCESS statement
for a program other than the first program in the batch, you will receive a
compiler diagnostic message.
RELATED CONCEPTS
DB2 coprocessor on page 431
COBOL and DB2 CCSID determination on page 437
RELATED TASKS
Separating DB2 suboptions
Choosing the DYNAM or NODYNAM compiler option on page 441
RELATED REFERENCES
DYNAM on page 323
SQL on page 354
DB2 Command Reference
The options that you include in the suboption string are cumulative. The compiler
concatenates these suboptions from multiple sources in the order that they are
specified. For example, suppose that your source file has the following code:
//STEP1 EXEC IGYWC, . . .
// PARM.COBOL=SQL("string1")
//COBOL.SYSIN DD *
CBL SQL("string2")
CBL SQL("string3")
IDENTIFICATION DIVISION.
PROGRAM-ID. DRIVER1.
During compilation, the compiler passes the following suboption string to the DB2
coprocessor:
"string1 string2 string3"
The concatenated strings are delimited with single spaces. If the compiler finds
multiple instances of the same SQL suboption, the last specification of that
suboption in the concatenated string takes effect. The compiler limits the length of
the concatenated DB2 suboption string to 4 KB.
When you use the integrated DB2 coprocessor, the determination of the code page
CCSID that will be associated with the string host variables used in SQL statement
processing depends on the setting of the COBOL SQLCCSID option, on the
programming techniques used, and on various DB2 configuration options.
When you use the SQL and SQLCCSID COBOL compiler options, the CCSID value
nnnnn that is specified in the CODEPAGE compiler option, or that is determined from
the COBOL data type of a host variable, is communicated automatically from
COBOL to DB2. DB2 associates the COBOL CCSID with host variables, overriding
the CCSID that would otherwise be implied by DB2 external mechanisms and
defaults. This associated CCSID is used for the processing of the SQL statements
that reference host variables.
When you use the SQL and NOSQLCCSID compiler options, the CCSID value nnnnn
that is specified in the CODEPAGE compiler option is used only for processing
COBOL statements within the COBOL program; that CCSID is not used for the
processing of SQL statements. Instead, DB2 assumes in processing SQL statements
that host variable data values are encoded according to the CCSID or CCSIDs that
are specified through DB2 external mechanisms and defaults.
RELATED CONCEPTS
DB2 coprocessor on page 431
RELATED TASKS
Programming with the SQLCCSID or NOSQLCCSID option on page 438
RELATED REFERENCES
Code-page determination for string host variables in SQL statements
CODEPAGE on page 313
SQL on page 354
SQLCCSID on page 355
RELATED REFERENCES
CODEPAGE on page 313
SQLCCSID on page 355
The SQLCCSID option is recommended for COBOL-DB2 applications that have any
of these characteristics:
v Use COBOL Unicode support
v Use other COBOL syntax that is indirectly sensitive to CCSID encoding, such as
XML support or object-oriented syntax for Java interoperability
v Process character data that is encoded in a CCSID that is different from the
default CCSID assumed by DB2
The NOSQLCCSID option is recommended for applications that require the highest
compatibility with the behavior of the DB2 precompiler.
For applications that use COBOL alphanumeric data items as host variables
interacting with DB2 string data that is defined with the FOR BIT DATA subtype,
you must either:
v Use the NOSQLCCSID compiler option
v Specify explicit FOR BIT DATA declarations for those host variables, for example:
EXEC SQL DECLARE hostvariable VARIABLE FOR BIT DATA END-EXEC
Usage notes
v If you use the DB2 DCLGEN command to generate COBOL declarations for a table,
you can optionally create FOR BIT DATA declarations automatically. To do so,
specify the DCLBIT(YES) option of the DCLGEN command.
v Performance consideration: Using the SQLCCSID compiler option could result in
some performance overhead in SQL processing, because with SQLCCSID in effect
the default DB2 CCSID association mechanism is overridden with a mechanism
that works on a per-host-variable basis.
RELATED REFERENCES
SQLCCSID on page 355
| For details about the CCSID determination under the DB2 precompiler and
| coprocessor, see COBOL and DB2 CCSID determination on page 437.
Coprocessor: The DB2 coprocessor treats each EXEC SQL INCLUDE statement like a
COPY statement, and requires that a period end the statement. For example:
IF A = B THEN
EXEC SQL INCLUDE some_code_here END-EXEC.
ELSE
. . .
END-IF
Coprocessor: With the DB2 coprocessor, an EXEC SQL INCLUDE statement cannot
reference a copybook that contains a COPY statement that uses the REPLACING
phrase. The coprocessor processes each EXEC SQL INCLUDE statement identically to a
COPY statement, and nested COPY statements cannot have the REPLACING phrase.
Coprocessor: The DB2 coprocessor processes code that follows END-EXEC statements
on the same line.
Coprocessor: The DB2 coprocessor requires that each host variable reference be
unique. The coprocessor diagnoses nonunique references to host variables. You
must fully qualify host variable references to make them unique.
Coprocessor: The DB2 coprocessor requires that all lines of an EXEC SQL statement,
including continuation lines, be coded in columns 12 through 72.
Coprocessor: With the DB2 coprocessor, a COBOL alphanumeric data item can be
used as a host variable to hold DB2 character data that has subtype FOR BIT DATA
if an explicit EXEC SQL DECLARE VARIABLE statement for that host variable is
specified in the COBOL program. For example:
EXEC SQL DECLARE :HV1 VARIABLE FOR BIT DATA END-EXEC.
As an alternative to adding EXEC SQL DECLARE . . . FOR BIT DATA statements, you
can use the NOSQLCCSID compiler option. For details, see the related reference about
code-page determination below.
SQL-INIT-FLAG
Precompiler: With the DB2 precompiler, if you pass host variables that might be
located at different addresses when the program is called more than once, the
called program must reset SQL-INIT-FLAG. Resetting this flag indicates to DB2 that
storage must be initialized when the next SQL statement runs. To reset the flag,
insert the statement MOVE ZERO TO SQL-INIT-FLAG in the PROCEDURE DIVISION of the
called program ahead of any executable SQL statements that use those host
variables.
RELATED CONCEPTS
DB2 coprocessor on page 431
COBOL and DB2 CCSID determination on page 437
RELATED REFERENCES
Code-page determination for string host variables in SQL statements on page 437
SQLCCSID on page 355
RELATED TASKS
Compiling with the SQL option on page 435
DB2 Application Programming and SQL Guide (Programming for the call
attachment facility)
RELATED REFERENCES
DYNAM on page 323
In COBOL, IMS message processing programs (MPPs) do not use non-IMS input or
output statements such as READ, WRITE, REWRITE, OPEN, and CLOSE.
With Enterprise COBOL, you can invoke IMS facilities using the following
interfaces:
v CBLTDLI call
v Language Environment callable service CEETDLI
v EXEC SQLIMS statements
CEETDLI behaves essentially the same way as CBLTDLI, except that CEETDLI
enables LE condition handling to be used. There are some instances when you
cannot use Language Environment condition handling when using CBLTDLI under
IMS.
You can also run object-oriented COBOL programs in a Java dependent region. You
can mix the object-oriented COBOL and Java languages in a single application.
RELATED CONCEPTS
IMS SQL coprocessor
RELATED TASKS
Coding SQLIMS statements on page 444
Compiling with the SQLIMS option on page 445
Compiling and linking COBOL programs for running under IMS on page 447
Using object-oriented COBOL and Java under IMS on page 448
Calling a COBOL method from a Java application under IMS on page 448
Building a mixed COBOL-Java application that starts with COBOL on page 449
Writing mixed-language IMS applications on page 449
Notes:
v The IMS SQL coprocessor processes embedded SQLIMS statements, not embedded
SQL statements.
With the IMS SQL coprocessor, you can use statements in the following ways:
v Use EXEC SQLIMS statements in any nested program.
v Use EXEC SQLIMS statements in COPYBOOKS.
v REPLACE statements work in SQLIMS statements.
RELATED TASKS
Coding SQLIMS statements
Compiling with the SQLIMS option on page 445
Compiling and linking COBOL programs for running under IMS on page 447
RELATED REFERENCES
SQLIMS on page 356
RELATED TASKS
Using SQLIMS INCLUDE with the IMS SQL coprocessor
Using character data in SQLIMS statements on page 445
Using binary items in SQLIMS statements on page 445
Determining the success of SQLIMS statements on page 445
The following two lines are therefore treated the same way. The period that ends
the EXEC SQLIMS INCLUDE statement is required.
EXEC SQLIMS INCLUDE name END-EXEC.
COPY "name".
The processing of the name in an SQLIMS INCLUDE statement follows the same rules
as the literal in a COPY literal-1 statement that does not have a REPLACING phrase.
The library search order for SQLIMS INCLUDE statements is the same SYSLIB
concatenation as the compiler uses to resolve COBOL COPY statements that do not
specify a library-name.
Note: Do not use character data items that are defined with USAGE DISPLAY-1 or
USAGE NATIONAL as SQLIMS host variables.
RELATED CONCEPTS
IMS SQL coprocessor on page 443
RELATED REFERENCES
CODEPAGE on page 313
| If you define the binary data items as USAGE BINARY, COMP, or COMP-4, use the
TRUNC(BIN) compiler option. Using this option might have a larger effect on
performance than using USAGE COMP-5 on individual data items. If instead you use
the TRUNC(OPT) or TRUNC(STD) compiler options, the compiler accepts the items but
the data might not be valid because of the decimal truncation rules. You must
ensure that truncation does not affect the validity of the data.
RELATED CONCEPTS
Formats for numeric data on page 47
RELATED REFERENCES
TRUNC on page 363
RELATED TASKS
IMS Application Programming Guide
To use the IMS SQL coprocessor, you must compile with the SQLIMS option and
IMS must be available on the system on which you compile.
You can use standard JCL procedural statements to compile your program with the
IMS SQL coprocessor. In addition to specifying the above compiler options, specify
the following item in your JCL:
STEPLIB override for the COBOL step, adding the data set that contains the IMS
SQL coprocessor services, unless these services are in the LNKLST. Typically, the
data set is IMS.SDFSRESL but your installation might have changed the name.
For example, you might have the following lines in your JCL:
//STEPLIB DD DSN=IMS.SDFSRESL,DISP=SHR
If you use the SQLIMS option when you compile a source file that contains a
sequence of COBOL programs (a batch compile sequence), SQLIMS is in effect for
only the first program of the sequence. Although you can specify SQLIMS upon
compiler invocation, the option is in effect for only the first program. If you specify
SQLIMS in a CBL or PROCESS statement for a program other than the first program in
the batch, a compiler diagnostic message is issued.
RELATED CONCEPTS
IMS SQL coprocessor on page 443
RELATED TASKS
Separating IMS suboptions
RELATED REFERENCES
SQL on page 354
The options that you include in the suboption string are cumulative. The compiler
concatenates these suboptions from multiple sources in the order that they are
specified. For example, suppose that your source file contains the following code:
//STEP1 EXEC IGYWC, . . .
// PARM.COBOL=SQLIMS("string1")
//COBOL.SYSIN DD *
CBL SQLIMS("string2")
CBL SQLIMS("string3")
IDENTIFICATION DIVISION.
PROGRAM-ID. DRIVER1.
During compilation, the compiler passes the following suboption string to the IMS
SQL coprocessor:
The concatenated strings are delimited with single spaces. If the compiler finds
multiple instances of the same SQLIMS suboption, the last specification of that
suboption in the concatenated string takes effect. The compiler limits the length of
the concatenated IMS suboption string to 4 KB.
RELATED CONCEPTS
IMS SQL coprocessor on page 443
RELATED TASKS
Compiling with the SQLIMS option on page 445
Preloading can boost performance because subsequent requests for a program can
be handled faster when the program is already in storage (rather than being
fetched from a library each time it is needed).
For IMS programs, using the RENT compiler option is recommended. You must use
the RENT compiler option for a program that is to be run preloaded or both
| preloaded and nonpreloaded. When you preload a program object that contains
| COBOL programs, all of the COBOL programs in that program object must be
compiled using the RENT option.
You can place programs compiled with the RENT option in the z/OS link pack area.
There they can be shared among the IMS dependent regions.
To run above the 16 MB line, an application program must be compiled with RENT.
The data for IMS application programs can reside above the 16 MB line, and you
can use DATA(31) RENT for programs that use IMS services.
For proper execution of COBOL programs under IMS, observe the following
guidelines for the link-edit attributes:
| v To link program objects that contain only COBOL programs compiled with the
RENT compiler option, link as RENT.
| v To link program objects that contain a mixture of COBOL RENT programs and
other programs, use the link-edit attributes recommended for the other
programs.
RELATED CONCEPTS
Storage and its addressability on page 39
RELATED TASKS
Choosing the DYNAM or NODYNAM compiler option on page 441
Language Environment Programming Guide (Condition handling under IMS)
RELATED REFERENCES
DATA on page 318
You must run these applications in either a Java message processing (JMP)
dependent region or a Java batch processing (JBP) dependent region. A program
that reads from the message queue (regardless of the language) must run in a JMP
dependent region.
RELATED TASKS
Defining a factory section on page 611
Chapter 30, Writing object-oriented programs, on page 579
Chapter 31, Communicating with Java methods, on page 623
Chapter 16, Compiling, linking, and running OO applications, on page 291
IMS Application Programming Guide
When you define a COBOL class and compile it using Enterprise COBOL, the
compiler generates a Java class definition with native methods and the object code
that implements those native methods. You can then create an instance and invoke
the methods of this class from a Java program that runs in a Java dependent
region, just as you would use any other class.
For example, you can define a COBOL class that uses the appropriate DL/I calls to
access an IMS database. To make the implementation of this class available to a
Java program, do the following steps:
1. Compile the COBOL class using Enterprise COBOL. The compiler generates a
Java source file (.java) that contains the class definition, and an object module
(.o) that contains the implementation of the native methods.
2. Compile the generated Java source file using the Java compiler. The Java
compiler creates a class file (.class).
3. Link the object code into a dynamic link library (DLL) in the z/OS UNIX file
system (.so). The directory that contains the COBOL DLLs must be listed in the
LIBPATH, as specified in the IMS.PROCLIB member that is indicated by the
ENVIRON= parameter of the IMS region procedure.
4. Update the sharable application class path in the master JVM options member
(ibm.jvm.sharable.application.class.path in the IMS.PROCLIB member that is
specified by the JVMOPMAS= parameter of the IMS region procedure) to
enable the JVM to access the Java class file.
RELATED TASKS
Chapter 16, Compiling, linking, and running OO applications, on page 291
Structuring OO applications on page 620
Wrapping procedure-oriented COBOL programs on page 620
IMS Application Programming Guide
A COBOL class definition that has a main factory method meets this requirement;
therefore, you can use a main factory method as the first routine of a mixed
COBOL and Java application under IMS.
Enterprise COBOL generates a Java class with a main method, which the Java
dependent region can find, instantiate, and invoke. Although you can code the
entire application in COBOL, you would probably build this type of application to
call a Java routine. When the COBOL run time runs within the JVM of a Java
dependent region, it automatically finds and uses this JVM to invoke methods on
Java classes.
The COBOL application should use DL/I calls for processing messages (GU and GN)
and synchronizing transactions (CHKP).
RELATED TASKS
Structuring OO applications on page 620
IMS Application Programming Guide
IBM SDK for Java - Tools Documentation
RELATED TASKS
Using the STOP RUN statement
Processing messages and synchronizing transactions on page 450
Accessing databases on page 450
Using the application interface block on page 450
COBOL components use CALL statements to DL/I services to process messages (GU
and GN) and synchronize transactions (CHKP). Java components use Java classes for
IMS to do these functions. You can use object instances of classes derived from
IMSFieldMessage to communicate entire IMS messages between the COBOL and
Java components of the application.
RELATED TASKS
IMS Application Programming Guide
RELATED REFERENCES
IMS Application Programming API Reference
Accessing databases
You can use either Java, COBOL, or a mixture of the two languages to access IMS
databases.
Limitation: EXEC SQL statements for DB2 database access are not supported in
COBOL routines that run in a Java dependent region.
Suppose that a Java component of a mixed application builds an SQL SELECT clause
and uses Java Database Connectivity (JDBC) to query and retrieve results from an
IMS database. The Java class libraries for IMS construct the appropriate request to
IMS to establish the correct position in the database. If you then invoke a COBOL
method that builds a segment search argument (SSA) and issues a GU (Get Unique)
request to IMS against the same database PCB, the request probably altered the
position in the database for that PCB. If so, subsequent JDBC requests to retrieve
more records by using the initial SQL SELECT clause are incorrect because the
database position changed. If you must access the same PCB from multiple
languages, reestablish the database position after an interlanguage call before you
access more records in the database.
RELATED TASKS
IMS Application Programming Guide
To use the AIB interface, specify the PCB requested for the call by placing the PCB
name (which must be defined as part of the PSBGEN) in the resource name field of
Alternatively, you can obtain PCB addresses by making an IMS INQY call using
subfunction FIND, and the PCB name as the resource name. The call returns the
address of the PCB, which you can then pass to a COBOL program. (This approach
still requires that the PCB name be defined as part of the PSBGEN, but the
application does not have to use the AIB interface.)
RELATED TASKS
IMS Application Programming Guide
The following example shows how you can use the AIB interface in a COBOL
application.
Local-storage section.
copy AIB.
. . .
Linkage section.
01 IOPCB.
05 logtterm pic x(08).
05 pic x(02).
05 tpstat pic x(02).
05 iodate pic s9(7) comp-3.
05 iotime pic s9(7) comp-3.
05 pic x(02).
05 seqnum pic x(02).
05 mod pic x(08).
Procedure division.
Move spaces to input-area
Move spaces to AIB
Move "DFSAIB" to AIBRID
Move length of AIB to AIBRLEN
Move "IOPCB" to AIBRSNM1
Move length of input-area to AIBOALEN
Call "CEETDLI" using GU, AIB, input-area
Set address of IOPCB to AIBRESA1
If tpstat = spaces
* . . process input message
If you are going to run the programs from the z/OS UNIX file system, use the
linker option AMODE 31. Any AMODE 24 program that you call from within a z/OS
UNIX application must reside in an MVS PDS or PDSE.
You can use Debug Tool to debug z/OS UNIX programs in remote debug mode,
for example, by using the Debug Perspective of Rational Developer for System z,
or in full-screen mode (MFI) using a VTAM terminal.
RELATED TASKS
Chapter 15, Compiling under z/OS UNIX, on page 283
Running OO applications under z/OS UNIX on page 293
Running in z/OS UNIX environments
Setting and accessing environment variables on page 454
Calling UNIX/POSIX APIs on page 456
Accessing main program parameters under z/OS UNIX on page 458
Language Environment Programming Guide
RELATED REFERENCES
RENT on page 348
RELATED TASKS
Running OO applications under z/OS UNIX on page 293
Setting and accessing environment variables
Calling UNIX/POSIX APIs on page 456
Accessing main program parameters under z/OS UNIX on page 458
Defining and allocating QSAM files on page 174
Allocating line-sequential files on page 214
Allocating VSAM files on page 206
Displaying values on a screen or in a file (DISPLAY) on page 35
Language Environment Programming Guide (Running POSIX-enabled programs)
RELATED REFERENCES
TEST on page 359
UNIX System Services User's Guide (The BPXBATCH utility)
Language Environment Programming Reference
Although setting and resetting environment variables from the shell before you
begin to run a program is a typical procedure, you can set, reset, and access
environment variables from the program while it is running.
If you are running a program with BPXBATCH, you can set environment variables
by using an STDENV DD statement.
To reset an environment variable as if it had not been set, use the z/OS UNIX shell
command unset. To reset an environment variable from a COBOL program, call
the setenv() function.
To see the values of all environment variables, use the export command with no
parameters. To access the value of an environment variable from a COBOL
program, call the getenv() function.
RELATED TASKS
Running in z/OS UNIX environments on page 453
Setting environment variables that affect execution on page 455
Accessing main program parameters under z/OS UNIX on page 458
Running OO applications under z/OS UNIX on page 293
Setting environment variables under z/OS UNIX on page 283
RELATED REFERENCES
Runtime environment variables on page 455
RELATED TASKS
Calling UNIX/POSIX APIs on page 456
Setting environment variables under z/OS UNIX on page 283
RELATED REFERENCES
Runtime environment variables
RELATED TASKS
Displaying data on the system logical output device on page 36
RELATED REFERENCES
XL C/C++ Programming Guide (_CEE_ENVFILE)
Language Environment Programming Reference
Because getenv() and putenv() are C functions, you must pass arguments BY VALUE.
Pass character strings as BY VALUE pointers that point to null-terminated strings.
Compile programs that call these functions with the NODYNAM and
PGMNAME(LONGMIXED) options.
CBL pgmname(longmixed),nodynam
Identification division.
Program-id. "envdemo".
Data division.
Working-storage section.
01 P pointer.
01 PATH pic x(5) value Z"PATH".
01 var-ptr pointer.
01 var-len pic 9(4) binary.
01 putenv-arg pic x(14) value Z"MYVAR=ABCDEFG".
01 rc pic 9(9) binary.
Linkage section.
01 var pic x(5000).
Procedure division.
* Retrieve and display the PATH environment variable
Set P to address of PATH
Call "getenv" using by value P returning var-ptr
If var-ptr = null then
Display "PATH not set"
Else
Set address of var to var-ptr
Move 0 to var-len
Inspect var tallying var-len
for characters before initial X"00"
Display "PATH = " var(1:var-len)
End-if
* Set environment variable MYVAR to ABCDEFG
Set P to address of putenv-arg
Call "putenv" using by value P returning rc
If rc not = 0 then
Display "putenv failed"
Stop run
End-if
Goback.
Because these are C functions, you must pass arguments BY VALUE. Pass character
strings as BY VALUE pointers that point to null-terminated strings. You must use the
compiler options NODYNAM and PGMNAME(LONGMIXED) when you compile programs
that call these functions.
You can call the fork(), exec(), and spawn() functions from a COBOL program or
from a non-COBOL program in the same process as COBOL programs. However,
be aware of these restrictions:
v From a forked process you cannot access any COBOL sequential, indexed, or
relative files that were open when you issued the fork. File status code 92 is
The exec() and spawn() functions start a new Language Environment enclave in
the new UNIX process. Therefore the target program of the exec() or spawn()
function is a main program, and all COBOL programs in the process start in initial
state with all files closed.
Sample code for calling some of the POSIX routines is provided in the SIGYSAMP
data set.
Table 59. Samples with POSIX function calls
Purpose Sample Functions used
Shows how to use some IGYTFL1 v getcwd()
of the file and directory
v mkdir()
routines
v rmdir()
v access()
Shows how to use the IGYTCNV v iconv_open()
iconv routines to convert
v iconv()
data
v iconv_close()
Shows the use of the IGYTEXC, IGYTEXC1 v fork()
exec() routine to run a
v getpid()
new program along with
other process-related v getppid()
routines v execl()
v perror()
v wait()
Shows how to get the IGYTERNO, IGYTGETE v perror()
errno value
v fopen()
RELATED TASKS
Running in z/OS UNIX environments on page 453
Setting and accessing environment variables on page 454
Accessing main program parameters under z/OS UNIX
Language Environment Programming Guide
RELATED REFERENCES
XL C/C++ Run-Time Library Reference
UNIX System Services Programming: Assembler Callable Services Reference
Example: accessing main program parameters under z/OS UNIX on page 459
RELATED TASKS
Running in z/OS UNIX environments on page 453
Setting and accessing environment variables on page 454
Calling UNIX/POSIX APIs on page 456
Accessing main program parameters under z/OS on page 495
Name prefix alert: Do not use program-names that start with prefixes used by IBM
products. If you use programs whose names start with such prefixes, CALL
statements might resolve to IBM library or compiler routines rather than to the
intended program. For a list of prefixes to avoid, see the related task about
identifying a program.
RELATED CONCEPTS
Main programs, subprograms, and calls
RELATED TASKS
Identifying a program on page 3
Ending and reentering main programs or subprograms on page 464
Transferring control to another program on page 465
Making recursive calls on page 477
Calling to and from object-oriented programs on page 477
Using procedure and function pointers on page 477
Making programs reentrant on page 480
Handling COBOL limitations with multithreading on page 512
Language Environment Writing ILC Communication Applications
RELATED REFERENCES
Language Environment Programming Guide (Register conventions)
In the PROCEDURE DIVISION, a program can call another program (generally called a
subprogram), and this called program can itself call other programs. The program
that calls another program is referred to as the calling program, and the program it
calls is referred to as the called program. When the processing of the called
program is completed, the called program can either transfer control back to the
calling program or end the run unit.
RELATED TASKS
Ending and reentering main programs or subprograms
Transferring control to another program on page 465
Making recursive calls on page 477
RELATED REFERENCES
Language Environment Programming Guide
You can use any of three termination statements in a program, but they have
different effects as shown in the following table.
Table 60. Effects of termination statements
Termination
statement Main program Subprogram
EXIT PROGRAM No action taken Return to calling program without
ending the run unit. An implicit EXIT
PROGRAM statement is generated if the
called program has no next executable
statement.
1. If the main program is called by a program written in another language that does not
follow Language Environment linkage conventions, return is to this calling program.
2. If the thread is the initial thread of execution in an enclave, the enclave is terminated.
A subprogram is usually left in its last-used state when it terminates with EXIT
PROGRAM or GOBACK. The next time the subprogram is called in the run unit, its
internal values are as they were left, except that return values for PERFORM
statements are reset to their initial values. (In contrast, a main program is
initialized each time it is called.)
There are some cases in which programs will be in their initial state:
v A subprogram that is dynamically called and then canceled will be in the initial
state the next time it is called.
v A program that has the INITIAL clause in the PROGRAM-ID paragraph will be in
the initial state each time it is called.
v Data items defined in the LOCAL-STORAGE SECTION will be reset to the initial state
specified by their VALUE clauses each time the program is called.
RELATED CONCEPTS
Comparison of WORKING-STORAGE and LOCAL-STORAGE on page 14
Language Environment Programming Guide (What happens during termination:
thread termination)
RELATED TASKS
Calling nested COBOL programs on page 473
Making recursive calls on page 477
In addition to making calls between Enterprise COBOL programs, you can also
make static and dynamic calls between Enterprise COBOL and programs compiled
with older compilers in all environments including CICS.
For restrictions about making calls with older levels of programs, see
Interoperability with older levels of IBM COBOL programs in the Enterprise COBOL
Migration Guide.
Calls to dynamic link libraries (DLLs) are an alternative to COBOL dynamic CALL,
and are well suited to object-oriented COBOL applications, z/OS UNIX programs,
and applications that interoperate with C/C++.
RELATED CONCEPTS
AMODE switching on page 469
Performance considerations of static and dynamic calls on page 471
Nested programs on page 474
RELATED TASKS
Making static calls
Making dynamic calls on page 467
Making both static and dynamic calls on page 471
Calling nested COBOL programs on page 473
RELATED REFERENCES
Enterprise COBOL Migration Guide
(Interoperability with older levels of IBM COBOL programs)
With static calls statement, the COBOL program and all called programs are part of
| the same program object. When control is transferred, the called program already
resides in storage, and a branch to it takes place. Subsequent executions of the CALL
statement make the called program available in its last-used state unless the called
program has the INITIAL attribute. In that case, the called program and each
program directly or indirectly contained within it are placed into their initial state
each time the called program is called within a run unit.
If you specify alternate entry points, a static CALL statement can use any alternate
entry point to enter the called subprogram.
RELATED CONCEPTS
Performance considerations of static and dynamic calls on page 471
RELATED TASKS
Making dynamic calls on page 467
Making both static and dynamic calls on page 471
Calling to and from object-oriented programs on page 477
RELATED REFERENCES
DLL on page 321
DYNAM on page 323
CALL statement (Enterprise COBOL Language Reference)
In these forms of the CALL statement, the called COBOL subprogram is not
link-edited with the main program. Instead, it is link-edited into a separate
| program object, and is loaded at run time only when it is required (that is, when
called). The program-name in the PROGRAM-ID paragraph or ENTRY statement must
| be identical to the corresponding program object name or program object alias of
| the program object that contains the program.
Each subprogram that you call with a dynamic CALL statement can be part of a
| different program object that is a member of either the system link library or a
private library that you supply. In either case it must be in an MVS load library; it
cannot reside in the z/OS UNIX file system. When a dynamic CALL statement calls
a subprogram that is not resident in storage, the subprogram is loaded from
secondary storage into the region or partition that contains the main program, and
a branch to the subprogram is performed.
The first dynamic call to a subprogram within a run unit obtains a fresh copy of
the subprogram. Subsequent calls to the same subprogram (by either the original
caller or any other subprogram within the same run unit) result in a branch to the
same copy of the subprogram in its last-used state, provided the subprogram does
not possess the INITIAL attribute. Therefore, the reinitialization of either of the
following items is your responsibility:
v GO TO statements that have been altered
v Data items
If you call the same COBOL program in different run units, a separate copy of
WORKING-STORAGE is allocated for each run unit.
RELATED CONCEPTS
When to use a dynamic call with subprograms on page 468
Performance considerations of static and dynamic calls on page 471
RELATED TASKS
Canceling a subprogram on page 468
Making static calls on page 466
Making both static and dynamic calls on page 471
Canceling a subprogram
When you issue a CANCEL statement for a subprogram, the storage that is occupied
by the subprogram is freed. A subsequent call to the subprogram functions as
though it were the first call. You can cancel a subprogram from a program other
than the original caller.
If the called subprogram has more than one entry point, ensure that an intervening
CANCEL statement is executed before you specify different entry points in a dynamic
CALL statement to that subprogram.
RELATED CONCEPTS
Performance considerations of static and dynamic calls on page 471
| The program object that you want to dynamically call must be in an MVS load
library rather than in the z/OS UNIX file system.
If subprograms are called in only a few conditions, you can use dynamic calls to
bring in the subprograms only when needed.
If the subprograms are very large or there are many of them, using static calls
might require too much main storage. Less total storage might be required to call
and cancel one, then call and cancel another, than to statically call both.
If you are concerned about ease of maintenance, dynamic calls can help.
Applications do not have to be link-edited again when dynamically called
subprograms are changed.
When you cannot use the INITIAL attribute to ensure that a subprogram is placed
in its unused state each time that it is called, you can set the unused state by using
a combination of dynamic CALL and CANCEL statements. When you cancel a
subprogram that was first called by a COBOL program, the next call causes the
subprogram to be reinitialized to its unused state.
Using the CANCEL statement to explicitly cancel a subprogram that was dynamically
loaded and branched to by a non-COBOL program does not result in any action
being taken to release the subprogram's storage or to delete the subprogram.
When dynamic call is performed, control is passed from the caller to a Language
Environment library routine. After the switching is performed, control passes to
the called program; the save area for the library routine will be positioned between
the save area for the caller program and the save area for the called program.
If you do not know the program-name to be called until run time, use the format
CALL identifier, where identifier is a data item that will contain the name of the
called program at run time. For example, you could use CALL identifier when the
program to be called varies depending on conditional processing in your program.
CALL identifier is always dynamic, even if you use the NODYNAM compiler option.
RELATED CONCEPTS
AMODE switching
Performance considerations of static and dynamic calls on page 471
RELATED TASKS
Making dynamic calls on page 467
RELATED REFERENCES
DYNAM on page 323
CALL statement (Enterprise COBOL Language Reference)
Language Environment Programming Reference
AMODE switching
When you have an application that has COBOL subprograms, some of the COBOL
subprograms can be AMODE 31 and some can be AMODE 24. To have this mixed AMODE
support, the calls must be dynamic and the Language Environment runtime
options ALL31(OFF) and STACK(,,BELOW) must be in effect.
If your application consists of only COBOL programs, and you are using dynamic
calls, each COBOL subprogram will always be entered in the proper AMODE. For
example, if you are using a dynamic call from an AMODE 31 COBOL program to an
AMODE 24 COBOL program, the AMODE is automatically switched.
The following scenario shows that AMODE problems can arise when procedure
pointers are used to call COBOL subprograms. This scenario is not supported
because the COBOL program COBOLY is not entered in the same AMODE each time
that it is called.
The following scenario uses a mix of COBOL and assembler language. This
scenario is not supported because the COBOL program COBOLB is not entered in
the same AMODE each time that it is called.
RELATED CONCEPTS
Storage and its addressability on page 39
When to use a dynamic call with subprograms on page 468
RELATED TASKS
Making dynamic calls on page 467
RELATED REFERENCES
Language Environment Programming Reference (ALL31)
Statically called programs cannot be deleted using CANCEL, so static calls might take
more main storage. If storage is a concern, think about using dynamic calls.
Storage usage of calls depends on whether:
v The subprogram is called only a few times. Regardless of whether it is called, a
statically called program is loaded into storage; a dynamically called program is
loaded only when it is called.
v You subsequently delete the dynamically called subprogram with a CANCEL
statement.
You cannot delete a statically called program, but you can delete a dynamically
called program. Using a dynamic call and then a CANCEL statement to delete the
dynamically called program after it is no longer needed in the application (and
not after each call to it) might require less storage than using a static call.
RELATED CONCEPTS
When to use a dynamic call with subprograms on page 468
RELATED TASKS
Making static calls on page 466
Making dynamic calls on page 467
In this case, with the CALL literal statement, the called subprogram will be
| link-edited with the main program into one program object. The CALL identifier
| statement results in the dynamic invocation of a separate program object.
When a dynamic CALL statement and a static CALL statement to the same
subprogram are issued within one program, a second copy of the subprogram is
RELATED REFERENCES
DYNAM on page 323
The following example shows how you would code static calls:
PROCESS NODYNAM NODLL
IDENTIFICATION DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 RECORD-2 PIC X. (6)
01 RECORD-1. (2)
05 PAY PICTURE S9(5)V99.
05 HOURLY-RATE PICTURE S9V99.
05 HOURS PICTURE S99V9.
. . .
PROCEDURE DIVISION.
CALL "SUBPROG" USING RECORD-1. (1)
CALL "PAYMASTR" USING RECORD-1 RECORD-2. (5)
STOP RUN.
The following example shows how you would code dynamic calls:
DATA DIVISION.
WORKING-STORAGE SECTION.
77 PGM-NAME PICTURE X(8).
01 RECORD-2 PIC x. (6)
01 RECORD-1. (2)
05 PAY PICTURE S9(5)V99.
05 HOURLY-RATE PICTURE S9V99.
05 HOURS PICTURE S99V9.
. . .
PROCEDURE DIVISION.
. . .
MOVE "SUBPROG" TO PGM-NAME.
CALL PGM-NAME USING RECORD-1. (1)
CANCEL PGM-NAME.
MOVE "PAYMASTR" TO PGM-NAME. (4)
CALL PGM-NAME USING RECORD-1 RECORD-2. (5)
STOP RUN.
The following example shows a called subprogram that is called by each of the
two preceding calling programs:
IDENTIFICATION DIVISION.
PROGRAM-ID. SUBPROG.
DATA DIVISION.
LINKAGE SECTION.
01 PAYREC. (2)
10 PAY PICTURE S9(5)V99.
10 HOURLY-RATE PICTURE S9V99.
10 HOURS PICTURE S99V9.
77 PAY-CODE PICTURE 9. (6)
PROCEDURE DIVISION USING PAYREC. (1)
In any given execution of the called program and either of the two calling
programs, if the values within RECORD-1 are changed between the time of the first
CALL and the second, the values passed at the time of the second CALL statement
will be the changed, not the original, values. If you want to use the original values,
you must save them.
Use either CALL literal or CALL identifier statements to make calls to nested
programs.
You cannot use the THREAD option when compiling programs that contain nested
programs.
RELATED CONCEPTS
Nested programs
RELATED REFERENCES
Scope of names on page 476
Nested programs
A COBOL program can nest, or contain, other COBOL programs. The nested
programs can themselves contain other programs. A nested program can be
directly or indirectly contained in a program.
The following example describes a nested structure that has directly and indirectly
contained programs:
RELATED TASKS
Calling nested COBOL programs on page 473
RELATED REFERENCES
Scope of names on page 476
Scope of names
Names in nested structures are divided into two classes: local and global. The class
determines whether a name is known beyond the scope of the program that
declares it. A specific search sequence locates the declaration of a name after it is
referenced in a program.
Local names:
Names (except the program-name) are local unless declared to be otherwise. Local
names are visible or accessible only within the program in which they are declared.
They are not visible or accessible to contained and containing programs.
Global names:
A name that is global (indicated by using the GLOBAL clause) is visible and
accessible to the program in which it is declared and to all the programs that are
directly and indirectly contained in that program. Therefore, the contained
programs can share common data and files from the containing program simply by
referencing the names of the items.
You can declare the same name with the GLOBAL clause more than one time,
provided that each declaration occurs in a different program. Be aware that you
can mask, or hide, a name in a nested structure by having the same name occur in
different programs in the same containing structure. However, such masking could
cause problems during a search for a name declaration.
The search is for a global name, not for a particular type of object associated with
the name such as a data item or file connector. The search stops when any match is
found, regardless of the type of object. If the object declared is of a different type
than that expected, an error condition exists.
To make a recursive call, you must code the RECURSIVE clause in the PROGRAM-ID
paragraph of the recursively called program. If you try to recursively call a
COBOL program that does not have the RECURSIVE clause in the PROGRAM-ID
paragraph, a condition is signaled. If the condition remains unhandled, the run
unit will end.
RELATED TASKS
Identifying a program as recursive on page 4
RELATED REFERENCES
PROGRAM-ID paragraph (Enterprise COBOL Language Reference)
Calls to or from COBOL DLL programs must either use DLL linkage or be static
calls. COBOL dynamic calls to or from COBOL DLL programs are not supported.
If you must call a COBOL DLL program from a COBOL non-DLL program, other
means to ensure that the DLL linkage mechanism is followed are available.
Procedure pointers are data items defined with the USAGE IS PROCEDURE-POINTER
clause. Function pointers are data items defined with the USAGE IS
FUNCTION-POINTER clause. In this information, pointer refers to either a
procedure-pointer data item or a function-pointer data item. You can set either of
these data items to contain entry addresses of, or pointers to, these entry points:
v Another COBOL program that is not nested. For example, to have a user-written
error-handling routine take control when an exception condition occurs, you
must first pass the entry address of the routine to CEEHDLR, a
condition-management Language Environment callable service, so that the
routine is registered.
The SET statement sets the pointer to refer either to an entry point in the same
| program object as your program, to a separate program object, or to an entry point
that is exported from a DLL, depending on the DYNAM|NODYNAM and DLL|NODLL
compiler options. Therefore, consider these factors when using these pointer data
items:
v If you compile a program with the NODYNAM and NODLL options and set a pointer
item to a literal value (to an actual name of an entry point), the value must refer
| to an entry point in the same program object. Otherwise the reference cannot be
resolved.
v If you compile a program with the NODLL option and either set a pointer item to
an identifier that will contain the name of the entry point at run time or set the
pointer item to a literal and compile with the DYNAM option, then the pointer
item, whether a literal or variable, must point to an entry point in a separate
| program objectlink. The entry point can be either the primary entry point or an
| alternate entry point named in an ALIAS binder (linkage-editor) statement.
v If you compile with the NODYNAM and DLL options and set a pointer item to a
literal value (the actual name of an entry point), the value must refer to an entry
| point in the same program object or to an entry-point name that is exported
from a DLL module. In the latter case you must include the DLL side file for the
| target DLL module in the link-edit of your program object.
v If you compile with the NODYNAM and DLL options and set a pointer item to an
identifier (a data item that contains the entry point name at run time), the
identifier value must refer to the entry-point name that is exported from a DLL
module. In this case the DLL module name must match the name of the
exported entry point.
Procedure pointer and function pointer calls are supported for AMODE 24
applications. However, the addressing mode cannot be switched for these calls, so
the called and calling programs must have the same addressing mode at execution
time.
COBOL entry points with the AMODE ANY attribute can be entered in either AMODE 31
or AMODE 24. However, the AMODE value that is in effect when the program is
entered for the first time must also be in effect for all subsequent reentries of the
program during the current Language Environment enclave.
RELATED TASKS
Deciding which type of pointer to use on page 479
Calling alternate entry points on page 479
Using procedure or function pointers with DLLs on page 503
RELATED REFERENCES
DLL on page 321
DYNAM on page 323
Procedure pointers are more efficient than function pointers for COBOL-to-COBOL
calls, and are required for calls to Language Environment condition-handling
services.
Many callable services written in C return function pointers. You can call such a C
function pointer from your COBOL program by using COBOL function pointers as
shown below.
IDENTIFICATION DIVISION.
PROGRAM-ID. DEMO.
ENVIRONMENT DIVISION.
DATA DIVISION.
*
WORKING-STORAGE SECTION.
01 FP USAGE FUNCTION-POINTER.
*
PROCEDURE DIVISION.
CALL "c-function" RETURNING FP.
CALL FP.
RELATED TASKS
Using procedure or function pointers with DLLs on page 503
Accessing JNI services on page 623
You can specify another entry point at which a program will begin running by
using the ENTRY label in the called program. However, this method is not
recommended in a structured program.
RELATED REFERENCES
NAME on page 337
CANCEL statement (Enterprise COBOL Language Reference)
ENTRY statement (Enterprise COBOL Language Reference)
MVS Program Management: User's Guide and Reference
You do not need to worry about multiple copies of variables. The compiler creates
the necessary reentrancy controls in the object module.
For reentrant programs, use the DATA compiler option and the HEAP and ALL31
runtime options to control whether dynamic data areas, such as WORKING-STORAGE,
are obtained from storage below or above the 16 MB line.
RELATED CONCEPTS
Storage and its addressability on page 39
RELATED TASKS
Compiling programs to create DLLs on page 498
Chapter 16, Compiling, linking, and running OO applications, on page 291
RELATED REFERENCES
RENT on page 348
DATA on page 318
Language Environment Programming Reference (ALL31, HEAP)
This information describes how you can write programs that share data with other
programs. In this information, a subprogram is any program that is called by
another program.
RELATED TASKS
Using data from another program on page 16
Sharing data with Java on page 627
Passing data
Coding the LINKAGE SECTION on page 485
Coding the PROCEDURE DIVISION for passing arguments on page 486
Passing return-code information on page 490
Sharing data by using the EXTERNAL clause on page 491
Sharing files between programs (external files) on page 491
Accessing main program parameters under z/OS on page 495
Passing data
You can choose among three ways of passing data between programs: BY
REFERENCE, BY CONTENT, or BY VALUE.
BY REFERENCE
The subprogram refers to and processes the data items in the storage of the
calling program rather than working on a copy of the data. BY REFERENCE is
the assumed passing mechanism for a parameter if none of the three ways
is specified or implied for the parameter.
BY CONTENT
The calling program passes only the contents of the literal or identifier. The
called program cannot change the value of the literal or identifier in the
calling program, even if it modifies the data item in which it received the
literal or identifier.
BY VALUE
The calling program or method passes the value of the literal or identifier,
not a reference to the sending data item. The called program or invoked
method can change the parameter. However, because the subprogram or
method has access only to a temporary copy of the sending data item, any
change does not affect the argument in the calling program.
1. File-names as CALL operands are allowed as an IBM extension to COBOL. Any use of the extension generally
depends on the specific internal implementation of the compiler. Control block field settings might change in
future releases. Any changes made to the control block are the user's responsibility and are not supported by
IBM.
RELATED CONCEPTS
Storage and its addressability on page 39
RELATED TASKS
Describing arguments in the calling program
Describing parameters in the called program on page 484
Testing for OMITTED arguments on page 485
Specifying CALL . . . RETURNING on page 491
Sharing data by using the EXTERNAL clause on page 491
Sharing files between programs (external files) on page 491
Sharing data with Java on page 627
RELATED REFERENCES
CALL statement (Enterprise COBOL Language Reference)
The USING phrase (Enterprise COBOL Language Reference)
INVOKE statement (Enterprise COBOL Language Reference)
Storage for arguments is allocated only in the outermost program. For example,
program A calls program B, which calls program C. Data items are allocated in
program A. They are described in the LINKAGE SECTION of programs B and C,
making the one set of data available to all three programs.
If you reference data in a file, the file must be open when the data is referenced.
Code the USING phrase of the CALL statement to pass the arguments. If you pass a
data item BY VALUE, it must be an elementary item.
To pass CALL arguments from AMODE 31 programs to AMODE 24 programs, you must
ensure that the arguments are in storage below the 16 MB line to be addressed by
the AMODE 24 subprogram.
v For reentrant AMODE 31 programs, compile the program with the DATA(24)
option, or specify the Language Environment runtime option HEAP(,,BELOW) if
RELATED CONCEPTS
Storage and its addressability on page 39
RELATED TASKS
Coding the LINKAGE SECTION on page 485
Coding the PROCEDURE DIVISION for passing arguments on page 486
RELATED REFERENCES
The USING phrase (Enterprise COBOL Language Reference)
Code the USING phrase after the PROCEDURE DIVISION header to name the
parameters that receive the data that is passed from the calling program.
When arguments are passed to the subprogram BY REFERENCE, it is invalid for the
subprogram to specify any relationship between its parameters and any fields
other than those that are passed and defined in the main program. The
subprogram must not:
v Define a parameter to be larger in total number of bytes than the corresponding
argument.
v Use subscript references to refer to elements beyond the limits of tables that are
passed as arguments by the calling program.
v Use reference modification to access data beyond the length of defined
parameters.
v Manipulate the address of a parameter in order to access other data items that
are defined in the calling program.
If any of the rules above are violated, unexpected results might occur.
RELATED TASKS
Coding the LINKAGE SECTION on page 485
RELATED REFERENCES
The USING phrase (Enterprise COBOL Language Reference)
For example, to omit the second argument when calling program sub1, code this
statement:
Call sub1 Using PARM1, OMITTED, PARM3
The arguments in the USING phrase of the CALL statement must match the
parameters of the called program in number and position.
In a called program, you can test whether an argument was passed as OMITTED by
comparing the address of the corresponding parameter to NULL. For example:
Program-ID. sub1.
. . .
Procedure Division Using RPARM1, RPARM2, RPARM3.
If Address Of RPARM2 = Null Then
Display No 2nd argument was passed this time
Else
Perform Process-Parm-2
End-If
RELATED REFERENCES
CALL statement (Enterprise COBOL Language Reference)
The USING phrase (Enterprise COBOL Language Reference)
You will introduce errors if the number of data-names in the identifier list of a
called program is greater than the number of arguments passed from the calling
program. The compiler does not try to match arguments and parameters.
The following figure shows a data item being passed from one program to another
(implicitly BY REFERENCE):
RELATED TASKS
Accessing main program parameters under z/OS on page 495
The first header above indicates that the data items are passed BY VALUE; the
second or third headers indicate that the items are passed BY REFERENCE or BY
CONTENT.
RELATED REFERENCES
The procedure division header (Enterprise COBOL Language Reference)
The USING phrase (Enterprise COBOL Language Reference)
CALL statement (Enterprise COBOL Language Reference)
Note that if you pass a data item BY VALUE, it must be an elementary item.
To lessen the possibility of mismatched records, put the level-01 record into a copy
library and copy it into both programs. That is, copy it in the WORKING-STORAGE
SECTION of the calling program and in the LINKAGE SECTION of the called program.
RELATED TASKS
Coding the LINKAGE SECTION on page 485
RELATED REFERENCES
CALL statement (Enterprise COBOL Language Reference)
RELATED TASKS
Manipulating null-terminated strings on page 110
RELATED REFERENCES
Null-terminated alphanumeric literals (Enterprise COBOL Language Reference)
A typical application for using pointer data items is in processing a chained list, a
series of records in which each record points to the next.
When you pass addresses between programs in a chained list, you can use NULL to
assign the value of an address that is not valid (nonnumeric 0) to a pointer item in
either of two ways:
v Use a VALUE IS NULL clause in its data definition.
v Use NULL as the sending field in a SET statement.
In the case of a chained list in which the pointer data item in the last record
contains a null value, you can use this code to check for the end of the list:
IF PTR-NEXT-REC = NULL
. . .
(logic for end of chain)
If the program has not reached the end of the list, the program can process the
record and move on to the next record.
The data passed from a calling program might contain header information that you
want to ignore. Because pointer data items are not numeric, you cannot directly
perform arithmetic on them. However, to bypass header information, you can use
the SET statement to increment the passed address.
RELATED REFERENCES
SET statement (Enterprise COBOL Language Reference)
For this example, picture a chained list of data that consists of individual salary
records. The following figure shows one way to visualize how the records are
linked in storage. The first item in each record except the last points to the next
record. The first item in the last record contains a null value (instead of a valid
address) to indicate that it is the last record.
The high-level pseudocode for an application that processes these records might
be:
Obtain address of first record in chained list from routine
Check for end of the list
Do until end of the list
Process record
Traverse to the next record
End
The following code contains an outline of the calling program, LISTS, used in this
example of processing a chained list.
IDENTIFICATION DIVISION.
PROGRAM-ID. LISTS.
ENVIRONMENT DIVISION.
DATA DIVISION.
******
WORKING-STORAGE SECTION.
77 PTR-FIRST POINTER VALUE IS NULL. (1)
77 DEPT-TOTAL PIC 9(4) VALUE IS 0.
******
LINKAGE SECTION.
01 SALARY-REC.
02 PTR-NEXT-REC POINTER. (2)
02 NAME PIC X(20).
02 DEPT PIC 9(4).
02 SALARY PIC 9(6).
01 DEPT-X PIC 9(4).
******
PROCEDURE DIVISION USING DEPT-X.
******
* FOR EVERYONE IN THE DEPARTMENT RECEIVED AS DEPT-X,
* GO THROUGH ALL THE RECORDS IN THE CHAINED LIST BASED ON THE
* ADDRESS OBTAINED FROM THE PROGRAM CHAIN-ANCH
* AND ACCUMULATE THE SALARIES.
* IN EACH RECORD, PTR-NEXT-REC IS A POINTER TO THE NEXT RECORD
IF DEPT = DEPT-X
THEN ADD SALARY TO DEPT-TOTAL
ELSE CONTINUE
END-IF
SET ADDRESS OF SALARY-REC TO PTR-NEXT-REC (6)
END-PERFORM
******
DISPLAY DEPT-TOTAL
GOBACK.
(1) PTR-FIRST is defined as a pointer data item with an initial value of NULL.
On a successful return from the call to CHAIN-ANCH, PTR-FIRST contains the
address of the first record in the chained list. If something goes wrong
with the call, and PTR-FIRST never receives the value of the address of the
first record in the chain, a null value remains in PTR-FIRST and, according
to the logic of the program, the records will not be processed.
(2) The LINKAGE SECTION of the calling program contains the description of the
records in the chained list. It also contains the description of the
department code that is passed in the USING clause of the CALL statement.
(3) To obtain the address of the first SALARY-REC record area, the LISTS
program calls the program CHAIN-ANCH.
(4) The SET statement bases the record description SALARY-REC on the address
contained in PTR-FIRST.
(5) The chained list in this example is set up so that the last record contains an
address that is not valid. This check for the end of the chained list is
accomplished with a do-while structure where the value NULL is assigned
to the pointer data item in the last record.
(6) The address of the record in the LINKAGE-SECTION is set equal to the
address of the next record by means of the pointer data item sent as the
first field in SALARY-REC. The record-processing routine repeats, processing
the next record in the chained list.
To increment addresses received from another program, you could set up the
LINKAGE SECTION and PROCEDURE DIVISION like this:
LINKAGE SECTION.
01 RECORD-A.
02 HEADER PIC X(12).
02 REAL-SALARY-REC PIC X(30).
. . .
01 SALARY-REC.
02 PTR-NEXT-REC POINTER.
02 NAME PIC X(20).
02 DEPT PIC 9(4).
02 SALARY PIC 9(6).
. . .
PROCEDURE DIVISION USING DEPT-X.
. . .
SET ADDRESS OF SALARY-REC TO ADDRESS OF REAL-SALARY-REC
RELATED TASKS
Using pointers to process a chained list on page 487
You can also use the RETURNING phrase in the PROCEDURE DIVISION header of a
method to return information to an invoking program or method. If you use
PROCEDURE DIVISION . . . RETURNING with CALL . . . RETURNING, the RETURN-CODE
register will not be set.
When control is returned to a COBOL program or method from a call, the contents
of register 15 are stored into the RETURN-CODE special register of the calling program
or method. When control is returned from a COBOL program to the operating
system, the special register contents are returned as a user return code.
You might need to think about this handling of the RETURN-CODE special register
when control is returned to a COBOL program from a non-COBOL program. If the
non-COBOL program does not use register 15 to pass back the return code, the
RETURN-CODE special register of the COBOL program might be updated with an
invalid value. Unless you set this special register to a meaningful value before
your Enterprise COBOL program returns to the operating system, a return code
that is invalid will be passed to the system.
For equivalent function between COBOL and C programs, have your COBOL
program call the C program with the RETURNING phrase. If the C program
(function) correctly declares a function value, the RETURNING value of the calling
COBOL program will be set.
You cannot set the RETURN-CODE special register by using the INVOKE statement.
When the called program in the example above successfully returns to its caller,
the value in dataname2 is stored into the identifier that was specified in the
RETURNING phrase of the CALL statement:
CALL . . . RETURNING dataname2
The return value of the called program is stored into dataname2. You must define
dataname2 in the DATA DIVISION of the calling program. The data type of the return
value that is declared in the target function must be identical to the data type of
dataname2.
In the run unit, any COBOL program or method that has the same data description
for the item as the program that contains the item can access and process that item.
For example, suppose program A has the following data description:
01 EXT-ITEM1 EXTERNAL PIC 99.
Program B can access that data item if B has the identical data description in its
WORKING-STORAGE SECTION.
Any program that has access to an EXTERNAL data item can change the value of that
item. Therefore do not use this clause for data items that you need to protect.
RELATED TASKS
Using data in input and output operations on page 11
RELATED REFERENCES
EXTERNAL clause (Enterprise COBOL Language Reference)
Name Function
ef1 The main program, which calls all the subprograms and then verifies the
contents of a record area
ef1openo Opens the external file for output and checks the file status code
ef1write Writes a record to the external file and checks the file status code
ef1openi Opens the external file for input and checks the file status code
ef1read Reads a record from the external file and checks the file status code
ef1close Closes the external file and checks the file status code
You can access the parameter string by using a LINKAGE SECTION and standard
COBOL coding as shown in the example referenced below:
Alternatively, you can obtain the parameter string by calling either of the following
Language Environment callable services, which are described in the related
references below:
v CEE3PRM (query parameter string): obtain the parameter string (if not longer
than 80 characters)
v CEE3PR2 (query parameter string long): obtain the parameter string and its
length
In either case, the parameter string might contain program arguments, runtime
options, or both. The setting of the CBLOPTS runtime option determines the relative
order in which program arguments and runtime options are expected. If
CBLOPTS(ON) (the default) is in effect, and program arguments and runtime options
are both passed in the parameter string, they must appear in the following order,
separated by a forward slash:
program_arguments/runtime_options
RELATED TASKS
Coding the LINKAGE SECTION on page 485
Accessing main program parameters under z/OS UNIX on page 458
Language Environment Programming Guide (Specifying runtime options and
program arguments, Preparing your main routine to receive parameters)
RELATED REFERENCES
Language Environment Customization (CBLOPTS (COBOL only))
Language Environment Programming Reference (CEE3PRM, CEE3PR2)
Suppose that the CBLOPTS(ON) runtime option is in effect, and that you pass the
following argument in the JCL or TSO command that you use to run the program:
95/
RELATED CONCEPTS
Dynamic link libraries (DLLs)
RELATED TASKS
Creating a DLL under z/OS UNIX on page 286
Compiling programs to create DLLs on page 498
Linking DLLs on page 499
Using CALL identifier with DLLs on page 500
Using DLL linkage and dynamic calls together on page 502
Using COBOL DLLs with C/C++ programs on page 505
Using DLLs in OO COBOL applications on page 506
Using procedure or function pointers with DLLs on page 503
Although some functions of z/OS DLLs overlap the functions provided by COBOL
dynamic CALL statements, DLLs have several advantages over regular z/OS
| program objects and dynamic calls:
v DLLs are common across COBOL and C/C++, thus providing better
interoperation for applications that use multiple programming languages.
Reentrant COBOL and C/C++ DLLs can also interoperate smoothly.
v You can make calls to programs in separate DLL modules that have long
program-names. (Dynamic call resolution truncates program-names to eight
characters.) Using the COBOL option PGMNAME(LONGUPPER) or PGMNAME(LONGMIXED)
| and the COBOL DLL support, you can make calls between program objects with
names of up to 160 characters.
RELATED REFERENCES
PGMNAME on page 345
MVS Program Management: User's Guide and Reference (Binder support for DLLs)
In an application with DLL support, use the following compiler options depending
on where the programs or classes are:
Table 62. Compiler options for DLL applications
Programs or classes in: Compile with:
| Root program object DLL, RENT, NOEXPORTALL
| DLL program objects used by other program DLL, RENT, EXPORTALL
| objects
RELATED TASKS
Creating a DLL under z/OS UNIX on page 286
Linking DLLs
Chapter 26, Creating a DLL or a DLL application, on page 497
RELATED REFERENCES
DLL on page 321
EXPORTALL on page 326
RENT on page 348
Linking DLLs
| You can link DLL-enabled object modules into separate DLL program objects, or
you can link them together statically. You can decide whether to package the
application as one module or as several DLL modules at link time.
The DLL support in the z/OS binder is recommended for linking DLL
applications. The binder can directly receive the output of COBOL compilers.
A binder-based DLL must reside in a PDSE or in a z/OS UNIX file rather than in a
PDS.
When using the binder to link a DLL application, use the following options:
Table 63. Binder options for DLL applications
Type of code Link using binder parameters:
DLL applications DYNAM(DLL), RENT
Applications that use mixed-case exported CASE(MIXED)
program-names
You must specify a SYSDEFSD DD statement to indicate the data set in which the
binder should create a DLL definition side file. This side file contains IMPORT
control statements for each symbol exported by a DLL. The binder SYSLIN input
(the binding code that references the DLL code) must include the DLL definition
side files for DLLs that are to be referenced from the module being linked.
If there are programs in the module that you do not want to make available with
DLL linkage, you can edit the definition side file to remove these programs.
RELATED TASKS
Creating a DLL under z/OS UNIX on page 286
Chapter 26, Creating a DLL or a DLL application, on page 497
Compiling programs to create DLLs on page 498
RELATED REFERENCES
MVS Program Management: User's Guide and Reference (Binder support for DLLs)
| The first step creates the DLL program object that contains the subprogram
| DemoDLLSubprogram. The second step creates the main program object that contains
the program MainProgram. The third step runs the application.
//DLLSAMP JOB ,
// TIME=(1),MSGLEVEL=(1,1),MSGCLASS=H,CLASS=A,
// NOTIFY=&SYSUID,USER=&SYSUID
// SET LEPFX=SYS1
//*---------------------------------------------------------------------
//* Compile COBOL subprogram, bind to form a DLL.
//*---------------------------------------------------------------------
//STEP1 EXEC IGYWCL,REGION=80M,GOPGM=DEMODLL,
// PARM.COBOL=RENT,PGMN(LM),DLL,EXPORTALL,
// PARM.LKED=RENT,LIST,XREF,LET,MAP,DYNAM(DLL),CASE(MIXED)
//COBOL.SYSIN DD *
Identification division.
Program-id. "DemoDLLSubprogram".
Procedure division.
Display "Hello from DemoDLLSubprogram!".
End program "DemoDLLSubprogram".
/*
//LKED.SYSDEFSD DD DSN=&&SIDEDECK,UNIT=SYSDA,DISP=(NEW,PASS),
// SPACE=(TRK,(1,1))
//LKED.SYSLMOD DD DSN=&&GOSET(&GOPGM),DSNTYPE=LIBRARY,DISP=(MOD,PASS)
//LKED.SYSIN DD DUMMY
//*---------------------------------------------------------------------
//* Compile and bind COBOL main program
//*---------------------------------------------------------------------
//STEP2 EXEC IGYWCL,REGION=80M,GOPGM=MAINPGM,
// PARM.COBOL=RENT,PGMNAME(LM),DLL,
// PARM.LKED=RENT,LIST,XREF,LET,MAP,DYNAM(DLL),CASE(MIXED)
//COBOL.SYSIN DD *
Identification division.
Program-id. "MainProgram".
Procedure division.
Call "DemoDLLSubprogram"
Stop Run.
End program "MainProgram".
/*
//LKED.SYSIN DD DSN=&&SIDEDECK,DISP=(OLD,DELETE)
//*---------------------------------------------------------------------
//* Execute the main program, calling the subprogram DLL.
//*---------------------------------------------------------------------
//STEP3 EXEC PGM=MAINPGM,REGION=80M
//STEPLIB DD DSN=&&GOSET,DISP=(OLD,DELETE)
// DD DSN=&LEPFX..SCEERUN,DISP=SHR
// DD DSN=&LEPFX..SCEERUN2,DISP=SHR
//SYSOUT DD SYSOUT=*
//CEEDUMP DD SYSOUT=*
For the content of the identifier or for the literal, use the name of either of the
following programs:
The search for the target DLL in the z/OS UNIX file system is case sensitive. If the
target DLL is a PDS or PDSE member, the DLL member name must be eight
characters or less. For the purpose of the search for the DLL as a PDS or PDSE
member, the run time automatically converts the name to uppercase.
If the runtime environment cannot resolve the CALL statement in either of these
cases, control is transferred to the ON EXCEPTION or ON OVERFLOW phrase of the CALL
statement. If the CALL statement does not specify one of these phrases in this
situation, Language Environment raises a severity-3 condition.
RELATED TASKS
Using DLL linkage and dynamic calls together on page 502
Compiling programs to create DLLs on page 498
Linking DLLs on page 499
RELATED REFERENCES
DLL on page 321
PGMNAME on page 345
CALL statement (Enterprise COBOL Language Reference)
Search order for DLLs in the z/OS UNIX file system
If the POSIX runtime option is set to OFF, the search order is reversed:
1. The runtime environment tries to load the DLL from the search order for the
load library of the caller.
2. If the runtime environment cannot load the DLL from this load library, it tries
to load the DLL from the z/OS UNIX file system.
RELATED REFERENCES
Language Environment Programming Reference (POSIX)
| DLL linkage refers to a call in a program that is compiled with the DLL and NODYNAM
| options, or a call with the CALLINTERFACE compiler directive that specifies DLL. In
| such calls, the called subprogram is resolved to an exported name in a separate
| module. DLL linkage can also refer to an invocation of a method that is defined in
| a separate module.
| Within a compilation unit you can call a specific program with only one of the
| calling conventions: Dynamic, DLL or Static. If a program is called by using
| different calling conventions, the compiler diagnoses this case and force all the
| calls to have the same convention as the first call statement that is encountered for
| that program.
| A program can contain CALL statements with both dynamic call linkage and DLL
| linkage. It can do so by using the CALL INTERFACE compiler directive to specify
| the linkage type of a particular call. All components of a DLL application must
| have the same AMODE. The automatic AMODE switching normally provided by
| COBOL dynamic calls is not available for DLL linkages. You cannot cancel
| programs that are called by using DLL linkage.
All components of a DLL application must have the same AMODE. The automatic
AMODE switching normally provided by COBOL dynamic calls is not available
for DLL linkages.
You cannot cancel programs that are called using DLL linkage.
RELATED CONCEPTS
Dynamic link libraries (DLLs) on page 497
RELATED TASKS
Compiling programs to create DLLs on page 498
Linking DLLs on page 499
Using procedure or function pointers with DLLs on page 503
Calling DLLs from non-DLLs on page 503
RELATED REFERENCES
DLL on page 321
EXPORTALL on page 326
| CALLINTERFACE (Enterprise COBOL Language Reference)
RELATED TASKS
Using CALL identifier with DLLs on page 500
Using procedure and function pointers on page 477
Compiling programs to create DLLs on page 498
Linking DLLs on page 499
RELATED REFERENCES
DLL on page 321
EXPORTALL on page 326
| CALLINTERFACE (Enterprise COBOL Language Reference)
You can use the following methods to ensure that the DLL linkage is followed:
v Put the COBOL DLL programs that you want to call from the COBOL non-DLL
| programs in the program object that contains the main program. Use static calls
from the COBOL non-DLL programs to call the COBOL DLL programs.
| The COBOL DLL programs in the program object that contains the main
program can call COBOL DLL programs in other DLLs.
v Put the COBOL DLL programs in DLLs and call them from COBOL non-DLL
programs with CALL function-pointer, where function-pointer is set to a function
RELATED TASKS
Using procedure and function pointers on page 477
PROCEDURE DIVISION.
IF DLL-NOT-LOADED
THEN
* Move the names in. They must be null terminated.
MOVE ZOOC05R TO DLL-LOADMOD-NAME
MOVE Zooc05r TO DLL-PROGRAM-NAME
GOBACK.
#include <stdio.h>
COBOL data items that are declared with the EXTERNAL attribute are independent of
DLL support. These data items are accessible by name from any COBOL program
in the run unit that declares them, regardless of whether the programs are in DLLs.
The COBOL options DLL, RENT, and EXPORTALL work much the same way as the
C/C++ DLL, RENT, and EXPORTALL options. (The DLL option applies only to C.)
However, the C/C++ compiler produces DLL-enabled code by default.
You can pass a C/C++ DLL function pointer to COBOL and use it within COBOL,
receiving the C/C++ function pointer as a function-pointer data item. The
following example shows a COBOL call to a C function that returns a function
pointer to a service, followed by a COBOL call to the service.
Identification Division.
Program-id. Demo.
Data Division.
Working-Storage section.
01 fp usage function-pointer.
Procedure Division.
Call "c-function" returning fp.
Call fp.
RELATED REFERENCES
DLL on page 321
EXPORTALL on page 326
RENT on page 348
EXTERNAL clause (Enterprise COBOL Language Reference)
| CALLINTERFACE (Enterprise COBOL Language Reference)
RELATED TASKS
Chapter 16, Compiling, linking, and running OO applications, on page 291
Compiling programs to create DLLs on page 498
Linking DLLs on page 499
RELATED REFERENCES
DLL on page 321
THREAD on page 362
RENT on page 348
DBCS on page 318
COBOL does not directly support managing program threads. However, you can
run COBOL programs that you compile with the THREAD compiler option in
multithreaded application servers, in applications that use a C/C++ driver
program to create the threads, in programs that interoperate with Java and use
Java threads, and in applications that use PL/I tasking. In other words, other
programs can call COBOL programs in such a way that the COBOL programs run
in multiple threads within a process or as multiple program invocation instances
within a thread. Your threaded application must run within a single Language
Environment enclave.
For the data that you want to isolate to an individual program invocation instance,
define the data in the LOCAL-STORAGE SECTION. In general, this choice is appropriate
| for working data in threaded programs. If you define data in WORKING-STORAGE and
your program changes the contents of the data, you must take one of the following
actions:
v Structure your application so that you do not access data in WORKING-STORAGE
simultaneously from multiple threads.
v If you do access data simultaneously from separate threads, write appropriate
serialization code.
RELATED CONCEPTS
Multithreading on page 508
RELATED TASKS
Choosing THREAD to support multithreading on page 509
Transferring control to multithreaded programs on page 509
Ending multithreaded programs on page 510
Processing files with multithreading on page 510
Handling COBOL limitations with multithreading on page 512
RELATED REFERENCES
THREAD on page 362
PROGRAM-ID paragraph (Enterprise COBOL Language Reference)
The operating system and multithreaded applications can handle execution flow
within a process, which is the course of events when all or part of a program runs.
Programs that run within a process can share resources. Processes can be
manipulated. For example, they can have a high or low priority in terms of the
amount of time that the system devotes to running the process.
Within a process, an application can initiate one or more threads, each of which is a
stream of computer instructions that controls that thread. A multithreaded process
begins with one stream of instructions (one thread) and can later create other
instruction streams to perform tasks. These multiple threads can run concurrently.
Within a thread, control is transferred between executing programs.
RELATED CONCEPTS
Language Environment Programming Guide (Program management model,
Understanding the basics: threads)
RELATED REFERENCES
THREAD on page 362
In order to run COBOL programs in more than one thread, you must compile all
of the COBOL programs in the application using the THREAD compiler option. You
must also compile them with the RENT compiler option and link them with the
| RENT option of the binder (linkage-editor).
Use the THREAD option when you compile object-oriented (OO) clients and classes.
Language restrictions: When you use the THREAD option, you cannot use certain
language elements. For details, see the related reference below.
Recursion: Before you compile a program using the THREAD compiler option, you
must specify the RECURSIVE phrase in the PROGRAM-ID paragraph. If you do not do
so, an error will occur.
RELATED TASKS
Sharing data in recursive or multithreaded programs on page 17
Compiling OO applications under z/OS UNIX on page 291
RELATED REFERENCES
THREAD on page 362
RELATED TASKS
Ending multithreaded programs
Ending and reentering main programs or subprograms on page 464
Use GOBACK to return to the caller of the program. When you use GOBACK from the
first program in a thread, the thread is terminated. If that thread is the initial
thread in an enclave, the entire enclave is terminated.
Use EXIT PROGRAM as you would GOBACK, except from a main program where it has
no effect.
Use STOP RUN to terminate the entire Language Environment enclave and to return
control to the caller of the main program (which might be the operating system).
All threads that are executing within the enclave are terminated.
RELATED CONCEPTS
Language Environment Programming Guide (What happens during termination:
enclave termination)
RELATED TASKS
Ending and reentering main programs or subprograms on page 464
Each file definition (FD) has an implicit serialization lock. This lock is used with
automatic serialization logic during the input or output operation that is associated
with the execution of the following statements:
v OPEN
v CLOSE
v READ
v WRITE
v REWRITE
v START
v DELETE
Automatic serialization also occurs for the implicit MOVE that is associated with the
following statements:
WRITE record-name FROM identifier
READ file-name INTO identifier
RELATED CONCEPTS
File-definition (FD) storage
RELATED TASKS
Closing QSAM files on page 173
Closing VSAM files on page 200
Coding ERROR declaratives on page 244
Serializing file access with multithreading
All threads of execution share this storage. You can depend on automatic
serialization for this storage during the execution of the OPEN, CLOSE, READ, WRITE,
REWRITE, START, and DELETE statements, but not between uses of these statements.
RELATED TASKS
Serializing file access with multithreading
To avoid serialization problems when you access a file from multiple threads,
define the data items that are associated with the file (such as file-status data items
and key arguments) in the LOCAL-STORAGE SECTION.
RELATED TASKS
Calling UNIX/POSIX APIs on page 456
In each example, two instances of a program that contains the sample operations
are running within one run unit on two different threads.
READ F1
. . .
REWRITE R1
In the example above, the second thread might execute the READ statement after the
READ statement is executed on the first thread but before the REWRITE statement is
executed on the first thread. The REWRITE statement might not update the record
that you intended. To ensure the results that you want, write explicit serialization
logic.
READ F1
. . .
* Process the data in the FD record description entry for F1
. . .
In the example above, the second thread might execute the READ statement while
the first thread is still processing a record in the FD record description entry. The
second READ statement would overlay the record that the first thread is processing.
To avoid this problem, use the recommended technique:
READ F1 INTO LOCAL-STORAGE-item
Other cases: You must give similar consideration to other usage patterns that
involve a sequence of related input and output operations, such as START followed
by READ NEXT, or READ followed by DELETE. Take appropriate steps to ensure the
correct processing of file input and output.
CICS: You cannot run multithreaded applications in CICS. In CICS, you can run a
COBOL program that has been compiled with the THREAD option and that is part of
an application that has no multiple threads or PL/I tasks.
Reentrancy: You must compile your multithreading programs with the RENT
| compiler option and link them with the RENT option of the binder (linkage-editor).
POSIX and PL/I: If you use POSIX threads in your multithreaded application, you
must specify the Language Environment runtime option POSIX(ON). If the
application uses PL/I tasking, you must specify POSIX(OFF). You cannot mix
POSIX threads and PL/I tasks in the same application.
AMODE: You must run your multithreaded applications with AMODE 31. You can
run a COBOL program that has been compiled with the THREAD option with AMODE
24 as part of an application that does not have multiple threads or PL/I tasks.
IGZETUN and IGZEOPT: Do not use the modules IGZETUN (for storage tuning)
or IGZEOPT (for runtime options) for applications in which the main program has
been compiled with the THREAD option; these CSECTs are ignored.
UPSI switches: All programs and all threads in an application share a single copy
of UPSI switches. If you modify switches in a threaded application, you must code
appropriate serialization logic.
RELATED TASKS
Making recursive calls on page 477
Serializing file access with multithreading on page 511
XL C/C++ Programming Guide (Using threads in z/OS UNIX System Services
applications)
Language Environment Writing ILC Communication Applications
| The XML PARSE statement is the COBOL language interface to either of two
| high-speed XML parsers. You use the XMLPARSE compiler option to select the
| appropriate parser for your application:
| v XMLPARSE(XMLSS) selects the z/OS XML System Services parser.
| This option provides enhanced features such as namespace processing,
| validation of XML documents with respect to an XML schema, and conversion
| of text fragments to national character representation (Unicode UTF-16).
| v XMLPARSE(COMPAT) selects the XML parser that is built into the COBOL library.
| This option provides compatibility with XML parsing in Enterprise COBOL
| Version 3 and Version 4.
Processing XML input involves passing control between the XML parser and a
processing procedure in which you handle parser events.
You can use the ENCODING, VALIDATING, and RETURNING NATIONAL phrases of the XML
| PARSE statement only if XMLPARSE(XMLSS) is in effect.
Link-edit consideration: COBOL programs that contain the XML PARSE statement
must be link-edited with AMODE 31.
RELATED CONCEPTS
XML parser in COBOL
RELATED TASKS
Accessing XML documents on page 520
Parsing XML documents on page 520
Handling XML PARSE exceptions on page 542
Terminating XML parsing on page 546
RELATED REFERENCES
XMLPARSE on page 368 (compiler option)
The encoding of XML documents on page 536
Appendix C, XML reference material, on page 691
Extensible Markup Language (XML)
The XML parser finds fragments within the source XML document, and your
processing procedure acts on those fragments. The fragments are associated with
XML events; you code the processing procedure to handle each XML event.
Execution of the XML PARSE statement begins the parsing and establishes the
processing procedure with the parser. The parser transfers control to the processing
procedure for each XML event that it detects while processing the document. After
processing the event, the processing procedure automatically returns control to the
parser. Each normal return from the processing procedure causes the parser to
continue analyzing the XML document to report the next event. Throughout this
operation, control passes back and forth between the parser and the processing
procedure.
In the XML PARSE statement, you can also specify two imperative statements to
which you want control to be passed at the end of the parsing: one if a normal end
occurs, and the other if an exception condition exists.
The following figure shows a high-level overview of the basic exchange of control
between the parser and your COBOL program:
The XML parser checks XML documents for most aspects of well formedness. A
document is well formed if it adheres to the XML syntax in the XML specification
and follows some additional rules such as proper use of end tags and uniqueness
of attribute names.
When you parse an XML document with validation against an XML schema, the
z/OS XML System Services parser additionally verifies that the XML document
adheres to the content and structure prescribed in the schema. For example, the
parser checks that there are no unexpected elements or attributes, that no required
elements or attributes are missing, and that any values of elements or attributes are
legal.
RELATED CONCEPTS
XML schemas on page 532
XML input document encoding on page 537
RELATED TASKS
Parsing XML documents on page 520
Parsing XML documents with validation on page 530
Handling XML PARSE exceptions on page 542
Terminating XML parsing on page 546
RELATED REFERENCES
The encoding of XML documents on page 536
XML specification
If the XML document that you want to parse is held in a file, use ordinary COBOL
facilities to place the document into a data item in your program:
v A FILE-CONTROL entry to define the file to your program.
v An OPEN statement to open the file.
v READ statements to read all the records from the file into a data item (either an
elementary item of category alphanumeric or national, or an alphanumeric or
national group). You can define the data item in the WORKING-STORAGE SECTION or
the LOCAL-STORAGE SECTION.
v Optionally, the STRING statement to string all of the separate records together
into one continuous stream, to remove extraneous blanks, and to handle
variable-length records.
| If the XMLPARSE(XMLSS) option is in effect, you can parse an XML document that is
| in a file by passing the parser one record (or segment) of text from the file at a
| time. This capability is useful for parsing very large XML documents.
RELATED TASKS
Coding COBOL programs to run under CICS on page 419
Chapter 22, Developing COBOL programs for IMS, on page 443
Parsing XML documents one segment at a time on page 533
| RELATED REFERENCES
| XMLPARSE on page 368 (compiler option)
In the XML PARSE statement, you first identify the parse data item (xml-document in
the example above) that contains the XML document character stream. In the DATA
DIVISION, define the parse data item as an elementary data item of category
national or as a national group item if the encoding of the document is Unicode
UTF-16; otherwise, define the parse data item as an elementary alphanumeric data
item or an alphanumeric group item:
v If the parse data item is national, the XML document must be encoded in
UTF-16, CCSID 1200.
| If the XMLPARSE(XMLSS) compiler option is in effect, you can also use any of these
| optional phrases of the XML PARSE statement:
| v ENCODING, to specify the CCSID of the document
| v RETURNING NATIONAL, to cause the parser to automatically convert UTF-8 or
| single-byte characters to national characters for return to the processing
| procedure
| v VALIDATING, to cause the parser to validate the document against an XML
| schema
In addition, you can specify either or both of the following optional phrases (as
shown in the fragment above) to indicate the action to be taken after parsing
finishes:
v ON EXCEPTION, to receive control if an unhandled exception occurs during
parsing
v NOT ON EXCEPTION, to receive control otherwise
You can end the XML PARSE statement with the explicit scope terminator END-XML.
Use END-XML to nest an XML PARSE statement that uses the ON EXCEPTION or NOT ON
EXCEPTION phrase in a conditional statement.
The parser passes control to the processing procedure for each XML event. Control
returns to the parser at the end of the processing procedure. This exchange of
control between the XML parser and the processing procedure continues until one
of the following events occurs:
v The entire XML document was parsed, as indicated by the END-OF-DOCUMENT
event.
| v If XMLPARSE(XMLSS) is in effect, either:
| The parser detects an error in the document and signals an EXCEPTION event
| (regardless of the kind of exception).
| The parser signals an END-OF-INPUT event, and the processing procedure
| returns to the parser with special register XML-CODE still set to zero, which
| indicates that no further XML data will be provided to the parser.
| v If XMLPARSE(COMPAT) is in effect, either:
| The parser signals an encoding conflict EXCEPTION event, and the processing
| procedure does not reset special register XML-CODE to zero or to the correct
| CCSID before returning to the parser.
| The parser detects an error in the document and signals an EXCEPTION event
| (other than an encoding conflict), and the processing procedure does not reset
| special register XML-CODE to zero before returning to the parser.
v The parsing process is terminated deliberately by the user's code in the
processing procedure that sets the XML-CODE special register to -1 before it
returns to the parser.
RELATED CONCEPTS
XML events on page 524
RELATED TASKS
Writing procedures to process XML
Parsing XML documents with validation on page 530
Parsing XML documents one segment at a time on page 533
Parsing XML documents encoded in UTF-8 on page 541
| RELATED REFERENCES
| XMLPARSE on page 368 (compiler option)
The encoding of XML documents on page 536
| XML PARSE exceptions with XMLPARSE(XMLSS) in effect on page 691
| XML PARSE exceptions with XMLPARSE(COMPAT) in effect on page 693
XML PARSE statement (Enterprise COBOL Language Reference)
For each event that the parser encounters, the parser passes information to the
processing procedure in several special registers. Use the content of those special
registers to populate COBOL data structures and to control the processing.
Examine the XML-EVENT special register to determine which event the parser passed
to the processing procedure. XML-EVENT contains an event name, such as
'START-OF-ELEMENT'. Obtain the text associated with the event from the XML-TEXT or
XML-NTEXT special register.
When used in nested programs, the XML special registers are implicitly defined as
GLOBAL in the outermost program.
For additional details about the XML special registers, see the following table.
Table 64. Special registers used by the XML parser
Special register Implicit definition and usage Content
XML-EVENT1 PICTURE X(30) USAGE DISPLAY VALUE SPACE The name of the XML event
2
XML-CODE PICTURE S9(9) USAGE BINARY VALUE ZERO An exception code or zero for each XML event
XML-INFORMATION1 PICTURE S9(9) USAGE BINARY VALUE 0 A mechanism to easily determine whether an XML
EVENT is complete
XML-TEXT1 Variable-length elementary category Text (corresponding to the event that the parser
alphanumeric item encountered) from the XML document if you specify
an alphanumeric item for the XML PARSE identifier3
XML-NTEXT1 Variable-length elementary category national Text (corresponding to the event that the parser
item encountered) from the XML document if you specify a
national item for the XML PARSE identifier3
XML-NAMESPACE1, 4 Variable-length elementary category The namespace identifier for a NAMESPACE-DECLARATION
alphanumeric item XML event or for an element or attribute name that is
in a namespace, if the XML document is in an
alphanumeric data item3
Restrictions:
v A processing procedure must not directly execute an XML PARSE statement.
However, if a processing procedure passes control to a method or outermost
program by using an INVOKE or CALL statement, the target method or program
can execute the same or a different XML PARSE statement. You can also execute
the same XML statement or different XML statements simultaneously from a
program that is running on multiple threads.
v The range of the processing procedure must not cause the execution of any
GOBACK or EXIT PROGRAM statement, except to return control from a method or
program to which control was passed by an INVOKE or CALL statement,
respectively, that is executed in the range of the processing procedure.
You can code a STOP RUN statement in a processing procedure to end the run
unit.
The compiler inserts a return mechanism after the last statement in each processing
procedure.
RELATED CONCEPTS
XML events on page 524
XML-CODE on page 525
XML-TEXT and XML-NTEXT on page 527
XML-NAMESPACE and XML-NNAMESPACE on page 527
XML-NAMESPACE-PREFIX and XML-NNAMESPACE-PREFIX on page 528
RELATED TASKS
Parsing XML documents one segment at a time on page 533
Parsing XML documents with validation on page 530
Terminating XML parsing on page 546
XML events
An XML event results when the XML parser detects various conditions (such as
END-OF-INPUT or EXCEPTION) or encounters document fragments (such as
CONTENT-CHARACTERS or START-OF-CDATA-SECTION) while processing an XML
document.
For each event that occurs during XML parsing, the parser sets the associated
event name in the XML-EVENT special register, and passes the XML-EVENT special
register to the processing procedure. Depending on the event, the parser sets other
special registers to contain additional information about the event.
In most cases, the parser sets the XML-TEXT or XML-NTEXT special register to the XML
fragment that caused the event:
| v If the XMLPARSE(COMPAT) compiler option is in effect, the parser sets XML-NTEXT if
| the XML document is in a national data item, or if the parser finds a character
| reference; otherwise, the parser sets XML-TEXT.
| v If XMLPARSE(XMLSS) is in effect, the parser sets XML-NTEXT if the RETURNING
| NATIONAL phrase is specified in the XML PARSE statement, or if the XML document
| is in a national data item; otherwise, the parser sets XML-TEXT.
| If XMLPARSE(XMLSS) is in effect, the parser sets the namespace special registers for a
| NAMESPACE-DECLARATION event, or if it encounters a name that is in a namespace.
For a detailed description of the set of XML events, see the related reference about
XML-EVENT.
RELATED CONCEPTS
XML parser in COBOL on page 518
XML-CODE on page 525
XML-INFORMATION on page 526
XML-TEXT and XML-NTEXT on page 527
XML-NAMESPACE and XML-NNAMESPACE on page 527
XML-NAMESPACE-PREFIX and XML-NNAMESPACE-PREFIX on page 528
RELATED TASKS
Writing procedures to process XML on page 522
Parsing XML documents with validation on page 530
RELATED REFERENCES
| XMLPARSE on page 368 (compiler option)
| XML PARSE exceptions with XMLPARSE(XMLSS) in effect on page 691
| XML PARSE exceptions with XMLPARSE(COMPAT) in effect on page 693
XML-EVENT (Enterprise COBOL Language Reference)
For information about the possible exception codes, see the related references.
When the parser returns control to the XML PARSE statement from your processing
procedure, XML-CODE generally contains the most recent value that was set by the
parser. However, for any event other than EXCEPTION, if you set XML-CODE to -1 in
your processing procedure, parsing terminates with a user-initiated exception
condition when control returns to the parser, and XML-CODE retains the value -1.
The following table shows the results of setting XML-CODE to various values. The
leftmost column shows the type of XML event passed to the processing procedure;
the other column headings show the XML-CODE value set by the processing
procedure. The cell at the intersection of each row and column shows the action
that the parser takes upon return from the processing procedure for a given
combination of XML event and XML-CODE value.
| Table 65. Results of processing-procedure changes to XML-CODE with XMLPARSE(XMLSS) in effect
| XML-CODE set to
| XML event type XML-CODE set to -1 XML-CODE set to 0 XML-CODE set to 1 other nonzero values
| Fatal EXCEPTION Ignores setting; keeps Ignores setting; keeps Ignores setting; keeps Ignores setting; keeps
| original XML-CODE original XML-CODE original XML-CODE original XML-CODE
| value value value value
| Warning EXCEPTION Ignores setting; keeps Next event is Ignores setting; keeps Ignores setting; keeps
| (Reason code 800 or original XML-CODE ATTRIBUTE-NAME or original XML-CODE original XML-CODE
| 801) value START-OF-ELEMENT value value
| END-OF-INPUT Ends immediately; Next event is Next event depends Fatal runtime error
| XML-CODE = -11 END-OF-DOCUMENT2 on input2 (message 230S)
| Normal event Ends immediately; XML-CODE already 0, Fatal runtime error Fatal runtime error
| XML-CODE = -11 no change (message 230S) (message 230S)
| 1. See the exception codes in the related reference about XML PARSE exceptions with XMLPARSE(COMPAT) in effect.
| 2. See the related task about handling encoding conflicts.
| 3. See the related task about handling XML PARSE exceptions.
| 4. See the related task about terminating XML parsing.
|
XML generation also uses the XML-CODE special register. For details, see the related
task about handling XML GENERATE exceptions.
RELATED CONCEPTS
How the XML parser handles errors on page 544
RELATED TASKS
Writing procedures to process XML on page 522
Parsing XML documents one segment at a time on page 533
Handling XML PARSE exceptions on page 542
Terminating XML parsing on page 546
Handling XML GENERATE exceptions on page 567
RELATED REFERENCES
| XML PARSE exceptions with XMLPARSE(XMLSS) in effect on page 691
| XML PARSE exceptions with XMLPARSE(COMPAT) in effect on page 693
XML GENERATE exceptions on page 700
XML-CODE (Enterprise COBOL Language Reference)
XML-EVENT (Enterprise COBOL Language Reference)
XML-INFORMATION
For most XML events, the parser sets XML-INFORMATION to indicate whether an XML
EVENT is complete or whether the XML content spans multiple events.
The application program logic can use the XML-INFORMATION special register to
concatenate pieces of parsed XML content together.
RELATED TASKS
Writing procedures to process XML on page 522
RELATED REFERENCES
XML-TEXT (Enterprise COBOL Language Reference)
XML-NTEXT (Enterprise COBOL Language Reference)
Typically, the parser sets XML-TEXT if the XML document is in an alphanumeric data
item. The parser sets XML-NTEXT if:
v The XML document is in a national data item.
| v The XMLPARSE(XMLSS) option is in effect and the RETURNING NATIONAL phrase is
| specified in the XML PARSE statement.
v The ATTRIBUTE-NATIONAL-CHARACTER or CONTENT-NATIONAL-CHARACTER event
occurs.
The special registers XML-TEXT and XML-NTEXT are mutually exclusive. When the
parser sets XML-TEXT, XML-NTEXT is empty with length zero. When the parser sets
XML-NTEXT, XML-TEXT is empty with length zero.
To determine the number of character encoding units in XML-NTEXT, use the LENGTH
intrinsic function; for example FUNCTION LENGTH(XML-NTEXT). To determine the
number of bytes in XML-NTEXT, use special register LENGTH OF XML-NTEXT. The
number of character encoding units differs from the number of bytes.
To determine the number of bytes in XML-TEXT, use either special register LENGTH OF
XML-TEXT or the LENGTH intrinsic function; each returns the number of bytes.
The XML-TEXT and XML-NTEXT special registers are undefined outside the processing
procedure.
RELATED CONCEPTS
XML events on page 524
XML-CODE on page 525
RELATED TASKS
Writing procedures to process XML on page 522
| RELATED REFERENCES
| XMLPARSE on page 368 (compiler option)
XML-TEXT (Enterprise COBOL Language Reference)
XML-NTEXT (Enterprise COBOL Language Reference)
The XML namespace special registers are undefined outside the processing
procedure.
RELATED CONCEPTS
XML events on page 524
XML-CODE on page 525
XML-NAMESPACE-PREFIX and XML-NNAMESPACE-PREFIX
XML-TEXT and XML-NTEXT on page 527
RELATED TASKS
Writing procedures to process XML on page 522
| RELATED REFERENCES
| XMLPARSE on page 368 (compiler option)
The XML namespace-prefix special registers are undefined outside the processing
procedure.
RELATED CONCEPTS
XML events on page 524
XML-NAMESPACE and XML-NNAMESPACE on page 527
RELATED TASKS
Writing procedures to process XML on page 522
| RELATED REFERENCES
| XMLPARSE on page 368 (compiler option)
For alphanumeric items, decide whether the XML data should go at the left
(default) end, or at the right end, of the COBOL data item. If the data should go at
| the right end, specify the JUSTIFIED RIGHT clause in the definition of the item.
Use one of the following techniques when you move XML data to COBOL data
items:
v If the format is reasonably regular, code a MOVE to an alphanumeric item that you
redefine appropriately as a numeric-edited item. Then do the final move to a
numeric (operational) item by moving from, and thus de-editing, the
numeric-edited item. (A regular format would have the same number of digits
after the decimal point, a comma separator for values greater than 999, and so
on.)
v For simplicity and vastly increased flexibility, use the following intrinsic
functions for alphanumeric XML data:
NUMVAL to extract and decode simple numeric values from XML data that
represents plain numbers
NUMVAL-C to extract and decode numeric values from XML data that represents
monetary quantities
However, using these functions is at the expense of performance.
RELATED TASKS
Converting to numbers (NUMVAL, NUMVAL-C) on page 117
Using national data (Unicode) in COBOL on page 130
Writing procedures to process XML on page 522
To validate XML documents while parsing, use the VALIDATING phrase of the XML
| PARSE statement. To do so, you must compile your program using the
| XMLPARSE(XMLSS) compiler option.
Use one of two forms of the VALIDATING phrase, depending on the location of the
preprocessed schema:
v In one form, you use the FILE keyword and specify an XML schema name. In
this case, the schema must be in an MVS data set or a z/OS UNIX file.
v In the other form, you specify the identifier of a data item that contains the
schema.
If you use the FILE keyword and specify an XML schema name, the COBOL
runtime library automatically retrieves the schema during execution of the XML
PARSE statement. The following code fragment shows this method of specifying
validation:
XML PARSE document-item
VALIDATING WITH FILE schema-name
PROCESSING PROCEDURE xml-event-handler
ON EXCEPTION
DISPLAY Document has an error.
GOBACK
NOT ON EXCEPTION
DISPLAY Document is valid.
END-XML
To associate an XML schema name with the external file that contains the schema,
code the XML-SCHEMA clause in the SPECIAL-NAMES paragraph, specifying either a
literal or a user-defined word to identify the file.
For example, you can associate the XML schema name schema-name shown in the
fragment above with the ddname DDSCHEMA by coding the ddname as a literal in
the XML-SCHEMA clause as follows:
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
XML-SCHEMA schema-name IS DDSCHEMA.
If your schema is in an MVS data set, the data set can be any sequential data set
(for example, QSAM fixed blocked or variable blocked, or VSAM ESDS).
For further details about how to associate an XML schema name with the external
file that contains the schema, see the related reference about the XML-SCHEMA clause.
Restriction: XML validation using the FILE keyword is not supported under
CICS.
The automatic retrieval that occurs when you use the FILE keyword is convenient.
But if you have several XML documents of the same type to validate, reading the
schema into memory once and then reusing the schema for each of the documents
provides better performance than automatic retrieval. In this case, you use the
other form of the VALIDATING phrase, in which you specify an identifier that
references an alphanumeric data item that contains the XML schema. For example:
XML PARSE document-item
VALIDATING WITH xmlschema
PROCESSING PROCEDURE xml-event-handler
ON EXCEPTION
DISPLAY Document has an error.
GOBACK
NOT ON EXCEPTION
DISPLAY Document is valid.
END-XML
Read the preprocessed schema into the data item, for example by using normal
COBOL statements.
For more information about this form of the VALIDATING phrase, see the related
reference about the XML PARSE statement.
During parsing with validation, normal XML events are returned until an
exception occurs due to a validation error or well-formedness error. If an XML
document is not valid, the parser signals an XML exception and passes control to
the processing procedure with special register XML-EVENT containing 'EXCEPTION'
and special register XML-CODE containing return code 24 in the high-order halfword
and a specific validation reason code in the low-order halfword.
| For information about the return code and reason code for exceptions that might
| occur when parsing XML documents with validation, see the related reference
| about exceptions with XMLPARSE(XMLSS) in effect.
RELATED CONCEPTS
XML-CODE on page 525
XML schemas on page 532
RELATED REFERENCES
| XMLPARSE on page 368 (compiler option)
| XML PARSE exceptions with XMLPARSE(XMLSS) in effect on page 691
XML PARSE statement (Enterprise COBOL Language Reference)
XML-SCHEMA clause (Enterprise COBOL Language Reference)
z/OS XML System Services User's Guide and Reference
XML schemas
An XML schema is a mechanism, defined by the W3C, for describing and
constraining the structure and content of XML documents. An XML schema, which
is itself expressed in XML, effectively defines a class of XML documents of a given
type, for example, purchase orders.
For Enterprise COBOL, XML schemas used for validating XML documents must be
in a preprocessed format known as Optimized Schema Representation (OSR). For
information about this format, see the related reference about z/OS XML System
Services.
The example document above is both well formed and valid according to the
following schema. (The numbers that precede each line are not part of the schema,
but are used in the explanations after the schema.)
1. <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
2.
3. <xsd:element name="stockItem" type="stockItemType"/>
4.
5. <xsd:complexType name="stockItemType">
6. <xsd:sequence>
7. <xsd:element name="itemName" type="xsd:string" minOccurs="0"/>
8. <xsd:element name="quantityOnHand">
9. <xsd:simpleType>
10. <xsd:restriction base="xsd:nonNegativeInteger">
11. <xsd:maxExclusive value="100"/>
12. </xsd:restriction>
13. </xsd:simpleType>
14. </xsd:element>
15. </xsd:sequence>
16. <xsd:attribute name="itemNumber" type="SKU" use="required"/>
17. </xsd:complexType>
18.
19. <xsd:simpleType name="SKU">
20. <xsd:restriction base="xsd:string">
21. <xsd:pattern value="\d{3}-[A-Z]{2}"/>
22. </xsd:restriction>
23. </xsd:simpleType>
24.
25. </xsd:schema>
The schema declares (line 3) that the root element is stockItem, which has a
mandatory itemNumber attribute (line 16) of type SKU, and includes a sequence
(lines 6 - 15) of other elements:
v An optional itemName element of type string (line 7)
Type declarations can be inline and unnamed, as in lines 9 - 13, which include the
maxExclusive facet to specify the legal values for the quantityOnHand element.
For the itemNumber attribute, by contrast, the named type SKU is declared separately
in lines 19 - 23, which include a pattern facet that uses regular expression syntax to
specify that the legal values for that type consist of (in order): 3 digits, a
hyphen-minus, then two uppercase letters.
The example referenced below shows a program that parses documents against
this schema.
RELATED TASKS
Parsing XML documents with validation on page 530
RELATED REFERENCES
z/OS XML System Services User's Guide and Reference
| To use this feature, compile your program with the XMLPARSE(XMLSS) compiler
| option in effect.
You parse an XML document a segment at a time by initializing the parse data
item to the first segment of the XML document, and then executing the XML PARSE
statement. The parser processes the XML text and returns XML events to your
processing procedure as usual.
At the end of the text segment, the parser signals an END-OF-INPUT XML event,
with XML-CODE set to zero. If there is another segment of the document to process,
in your processing procedure move the next segment of XML data to the parse
data item, set XML-CODE to one, and return to the parser. To signal the end of XML
segments to the parser, return to the parser with XML-CODE still set to zero.
The length of the parse data item is evaluated for each segment, and determines
the segment length.
For example, if the document is split into two segments with the split point in the
middle of a string of content characters, the parser returns the content in two
separate CONTENT-CHARACTERS events. In the processing procedure, you must
reassemble the string of content as needed by the application.
If a segment split occurs between the bytes of a multibyte character, the parser
detects the split and reassembles the character for delivery in a single event.
For each such element in a given document, manage the table size using one of the
following methods:
v Calculating number of elements:
1. Count the number of elements in the document during an initial parse.
2. Set the OCCURS DEPENDING ON object for the table to that size
3. Allocate storage for the table
4. Parse the document a second time to process the XML
v Incremental expansion:
1. Set an initial size in the OCCURS DEPENDING ON object for the unbounded table
2. Parse the document normally. For each element
a. Check the limit and expand the unbounded table if necessary.
3. Allocate a new, larger storage area:
4. Copy the data from the smaller area
5. Free the smaller area
6. Set the table pointer to the address of the larger storage area.
QSAM and VSAM files: You can process XML documents stored in a QSAM or
VSAM file as follows:
1. Open the file and read the first record of the XML document.
2. Execute the XML PARSE statement with the FD record as the parse data item.
3. In the processing-procedure logic for handling the END-OF-INPUT event, read the
next record of the XML document into the parse data item. If not end-of-file
(file status code 10), set XML-CODE to one and return to the parser. If end-of-file,
return to the parser with XML-CODE still set to zero.
4. In your processing procedure logic for the END-OF-DOCUMENT event, close the file.
Tip: To provide successive segments of XML data after the end of the root element,
include at least the first nonspace character of an XML item at the end of each
segment. Include a complete item only on the last segment that you want the
parser to process.
For instance, in the following example, in which each line represents a segment of
an XML document, the segment that includes the text This comment ends this
segment is the last segment to be parsed:
<Tagline>
COBOL is the language of the future!
</Tagline> <
!--First comment--
> <?pi data?> <!-
-This comment ends this segment-->
<!-- This segment is not included in the parse-->
RELATED CONCEPTS
XML events on page 524
XML-CODE on page 525
RELATED TASKS
Parsing XML documents one segment at a time on page 533
XML-CODE on page 525
| RELATED REFERENCES
| XMLPARSE on page 368 (compiler option)
To use this feature, compile your program with the XMLPARSE(XMLSS) compiler
option in effect.
Splits in character content might occur at arbitrary points in the XML data stream,
even with unsegmented input. The XML-INFORMATION special register simplifies the
reassembly of content. This register may be required for any and all attribute
values and element character content.
The length of the parse data item is evaluated for each segment, and determines
the segment length.
The example, Example: program for processing XML on page 548, demonstrates
various ways of assigning values obtained from the XML document to program
data items for later processing.
The XML data is provided to the parser in 40-byte records, imitating the way an
XML document might be acquired from an external source such as a data file. The
In the example, the XML-INFORMATION special register is only used to simplify the
reassembly of content for the "filling" element. This register could be used for
any attribute values and element character content. An XML-INFORMATION value of 2
indicates that the character data for an ATTRIBUTE-CHARACTERS or
CONTENT-CHARACTERS XML event is continued in a subsequent XML event, and
should thus be buffered in order to accumulate the complete character string. A
subsequent XML event of the same type with an XML-INFORMATION value of 1
indicates that XML-TEXT or XML-NTEXT contains the final piece of the character
content, and that the complete string can be moved to the appropriate data item.
In the example, the STRING ... WITH POINTER statement accumulates and
describes properly the complete character value for assignment to the "filling"
identifier.
String xml-text delimited by size into
content-buffer with pointer tally
On overflow
Display content buffer (
length of content-buffer
bytes) is too small
Move -1 to xml-code
End-string
RELATED CONCEPTS
XML events on page 524
XML-CODE on page 525
RELATED REFERENCES
XMLPARSE on page 368 (compiler option)
Example: program for processing XML on page 548
XML documents generated in or parsed from national data items must be encoded
in Unicode UTF-16 in big-endian format, CCSID 1200.
For XML PARSE statements, documents in alphanumeric data items must be encoded
as follows:
| v If XMLPARSE(XMLSS) is in effect:
| If the RETURNING NATIONAL phrase is specified in the XML PARSE statement, in
| any EBCDIC or ASCII encoding that is supported by z/OS Unicode Services
| for conversion to UTF-16
| If the RETURNING NATIONAL phrase is not specified in the XML PARSE statement,
| in UTF-8 (CCSID 1208) or one of the single-byte EBCDIC encodings listed in
| the table below
If XMLPARSE(XMLSS) is in effect, you can use any supported CCSID (as described
above for XML PARSE) in the ENCODING phrase of the XML PARSE statement.
Table 67. Coded character sets for XML documents
CCSID Description
1208 UTF-81
1047 Latin 1 / Open Systems
1140, 37 USA, Canada, . . . Euro Country Extended Code Page (ECECP),
Country Extended Code Page (CECP)
1141, 273 Austria, Germany ECECP, CECP
1142, 277 Denmark, Norway ECECP, CECP
1143, 278 Finland, Sweden ECECP, CECP
1144, 280 Italy ECECP, CECP
1145, 284 Spain, Latin America (Spanish) ECECP, CECP
1146, 285 UK ECECP, CECP
1147, 297 France ECECP, CECP
1148, 500 International ECECP, CECP
1149, 871 Iceland ECECP, CECP
1. Supported for the XML PARSE statement in the ENCODING phrase if XMLPARSE(XMLSS) is in
effect
RELATED CONCEPTS
XML input document encoding
RELATED TASKS
Specifying the encoding on page 539
Parsing XML documents encoded in UTF-8 on page 541
Chapter 29, Producing XML output, on page 561
RELATED REFERENCES
CODEPAGE on page 313
| XMLPARSE on page 368 (compiler option)
For XML documents that are contained in a national data item, the supported
encoding is Unicode UTF-16 in big-endian format, CCSID 1200.
| For XML documents that are contained in an alphanumeric data item, the
| supported CCSIDs if XMLPARSE(COMPAT) is in effect are those specified in the related
| reference about the encoding of XML documents.
XML documents can begin with white space only if they do not have an XML
declaration:
v If an XML document begins with an XML declaration, the first angle bracket (<)
in the document must be the first character in the document.
v If an XML document does not begin with an XML declaration, the first angle
bracket in the document can be preceded only by white space.
White-space characters have the hexadecimal values shown in the following table.
Table 68. Hexadecimal values of white-space characters
White-space character EBCDIC Unicode
Space X'40' X'0020'
Horizontal tabulation X'05' X'0009'
Carriage return X'0D' X'000D'
Line feed X'25' X'000A'
New line / next line X'15' X'0085'
If the specified encoding is not one of the supported coded character sets, the
parser signals an XML exception event before beginning the parse operation. If the
actual document encoding does not match the specified encoding, the parser signals
an appropriate XML exception after beginning the parse operation.
| If XMLPARSE(XMLSS) is in effect:
v Any encoding declaration specified within the XML document is ignored.
v For XML documents that are contained in a national data item, the ENCODING
phrase of the XML PARSE statement must be omitted or must specify CCSID 1200.
The CCSID specified in the CODEPAGE compiler option is ignored. The parser
signals an XML exception event if the actual document encoding is not UTF-16
in big-endian format.
v For XML documents that are contained in an alphanumeric data item, the
CCSID specified in the ENCODING phrase overrides the CODEPAGE compiler option.
The parser raises an XML exception event at the beginning of the parse
operation if the actual document encoding is not consistent with the specified
CCSID.
RELATED TASKS
Converting to or from national (Unicode) representation on page 137
Specifying the encoding
Parsing XML documents encoded in UTF-8 on page 541
Handling XML PARSE exceptions on page 542
RELATED REFERENCES
| XMLPARSE on page 368 (compiler option)
The encoding of XML documents on page 536
EBCDIC code-page-sensitive characters in XML markup on page 540
The preferred way is to omit the encoding declaration from the document and to
| specify the encoding using one of the following means:
| v If XMLPARSE(XMLSS) is in effect: the ENCODING phrase of the XML PARSE statement,
| or the CODEPAGE compiler option
| v If XMLPARSE(COMPAT) is in effect: the CODEPAGE compiler option
| For XMLPARSE(COMPAT):
| You can instead specify an encoding declaration in the XML declaration with
| which most XML documents begin. For example:
| <?xml version="1.0" encoding="ibm-1140"?>
For more information about the CCSIDs that are supported for XML parsing, see
the related reference about the encoding of XML documents.
RELATED CONCEPTS
XML input document encoding on page 537
RELATED TASKS
Parsing XML documents encoded in UTF-8 on page 541
| Handling encoding conflicts on page 545
RELATED REFERENCES
The encoding of XML documents on page 536
The following table shows those special characters and their hexadecimal values
for various EBCDIC CCSIDs.
Table 70. Hexadecimal values of special characters for various EBCDIC CCSIDs
Character 1047 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149
[ X'AD' X'BA' X'63' X'9E' X'B5' X'90' X'4A' X'B1' X'90' X'4A' X'AE'
] X'BD' X'BB' X'FC' X'9F' X'9F' X'51' X'5A' X'BB' X'B5' X'5A' X'9E'
! X'5A' X'5A' X'4F' X'4F' X'4F' X'4F' X'BB' X'5A' X'4F' X'4F' X'4F'
| X'4F' X'4F' X'BB' X'BB' X'BB' X'BB' X'4F' X'4F' X'BB' X'BB' X'BB'
# X'7B' X'7B' X'7B' X'4A' X'63' X'B1' X'69' X'7B' X'B1' X'7B' X'7B'
To parse a UTF-8 XML document, you must specify CCSID 1208 in the ENCODING
phrase of the XML PARSE statement, as shown in the following code fragment:
XML PARSE xml-document
WITH ENCODING 1208
PROCESSING PROCEDURE xml-event-handler
. . .
END-XML
If you do not code the RETURNING NATIONAL phrase in the XML PARSE statement, the
parser returns the XML document fragments in the alphanumeric special registers
XML-TEXT, XML-NAMESPACE, and XML-NAMESPACE-PREFIX.
UTF-8 characters are encoded using a variable number of bytes per character. Most
COBOL operations on alphanumeric data assume a single-byte encoding, in which
each character is encoded in 1 byte. When you operate on UTF-8 characters as
alphanumeric data, you must ensure that the data is processed correctly. Avoid
operations (such as reference modification and moves that involve truncation) that
can split a multibyte character between bytes. You cannot reliably use statements
such as INSPECT to process multibyte characters in alphanumeric data.
You can more reliably process UTF-8 document fragments by specifying the
RETURNING NATIONAL phrase in the XML PARSE statement. If you use the RETURNING
NATIONAL phrase, XML document fragments are efficiently converted to UTF-16
encoding and are returned to the application in the national special registers
XML-NTEXT, XML-NNAMESPACE, and XMLNNAMESPACE-PREFIX. Then you can process the
XML text fragments in national data items. (The UTF-16 encoding in national data
items greatly facilitates Unicode processing in COBOL.)
The following code fragment illustrates the use of both the ENCODING phrase and
the RETURNING NATIONAL phrase for parsing a UTF-8 XML document:
XML PARSE xml-document
WITH ENCODING 1208 RETURNING NATIONAL
PROCESSING PROCEDURE xml-event-handler
ON EXCEPTION
DISPLAY XML document error XML-CODE
STOP RUN
NOT ON EXCEPTION
DISPLAY XML document was successfully parsed.
END-XML
RELATED CONCEPTS
XML-TEXT and XML-NTEXT on page 527
XML-NAMESPACE and XML-NNAMESPACE on page 527
XML-NAMESPACE-PREFIX and XML-NNAMESPACE-PREFIX on page 528
RELATED TASKS
Processing UTF-8 data on page 141
Parsing XML documents on page 520
Specifying the encoding on page 539
| For XMLPARSE(XMLSS):
Return code and reason code: The exception code is formed from the return code
and the reason code that the parser generates. The return code and the reason code
are each a halfword binary value. The value in XML-CODE is a concatenation of these
two values.
As an example, the following XML document is not well formed because the
element end tag mmsg does not match the element start tag msg:
<msg>Hello</mmsg>
The return code is hexadecimal 000C (XRC_NOT_WELL_FORMED), and the reason code
is hexadecimal 3035 (XRSN_ENDTAG_NAME_MISMATCH), if you parse the document
without validation. The concatenation of these two values, hexadecimal 000C3035,
is returned to the processing procedure in the XML-CODE special register.
If you parse a document with validation, the values returned in XML-CODE for any
well-formedness errors differ from the values returned for the same errors when
you parse without validation. The return code generated by the z/OS XML System
Services parser for any validation error is 24 (hexadecimal 0018).
For more information about the return codes and reason codes that can be
generated, see the related reference about exceptions with XMLPARSE(XMLSS) in
effect.
| For XMLPARSE(COMPAT):
| If the exception code is within a certain range, you might be able to handle the
| exception event within your processing procedure, and resume parsing.
| You can handle exceptions in this way only if the exception code that is passed in
| XML-CODE is within one of the following ranges, which indicates that an encoding
| conflict was detected:
| v 50 - 99
| v 100,001 - 165,535
| Exception codes 1 - 49: In the processing procedure, you can do limited handling
| of exceptions for which the exception code is within the range 1 - 49. After an
| exception in this range occurs, the parser does not signal any further normal
| events, except the END-OF-DOCUMENT event, even if you set XML-CODE to zero before
| returning. If you set XML-CODE to zero, the parser continues parsing the document
| and signals any exceptions that it finds. (Doing so can provide a useful way to
| discover multiple errors in the document.)
| Restriction: The compatibility-mode COBOL XML parser might not signal all
| additional exception events. The number of exceptions is limited to the remaining
| space in the XML PARSE event token array, probably 8192 events.
| At the end of parsing after an exception that has an exception code in the range 1 -
| 49, control is passed to the statement specified in the ON EXCEPTION phrase. If you
| did not code an ON EXCEPTION phrase, control is passed to the end of the XML PARSE
| statement. XML-CODE contains the code set by the parser for the most recent
| exception.
| For all exceptions other than those having an exception code within one of the
| ranges described above, the parser does not signal any further events, but passes
| control to the statement specified in the ON EXCEPTION phrase. XML-CODE contains
| the original exception code even if you set XML-CODE in the processing procedure
| before returning control to the parser.
| If you do not want to handle an exception, return control to the parser without
| changing the value of XML-CODE. The parser transfers control to the statement
| specified in the ON EXCEPTION phrase. If you did not code an ON EXCEPTION phrase,
| control is transferred to the end of the XML PARSE statement.
| RELATED CONCEPTS
| XML-CODE on page 525
| XML input document encoding on page 537
| How the XML parser handles errors on page 544
| RELATED TASKS
| Writing procedures to process XML on page 522
| RELATED REFERENCES
| XMLPARSE on page 368 (compiler option)
| The encoding of XML documents on page 536
| XML PARSE exceptions with XMLPARSE(XMLSS) in effect on page 691
| XML PARSE exceptions with XMLPARSE(COMPAT) in effect on page 693
| z/OS XML System Services User's Guide and Reference
The parser passes the following information in special registers to the processing
procedure:
v XML-EVENT contains 'EXCEPTION'.
v XML-CODE contains a numeric exception code.
The exception codes are described in the related references about XML PARSE
exceptions.
v For fatal exceptions, XML-TEXT or XML-NTEXT contains the document text up to
and including the point where the exception was detected.
v For the warning exceptions issued for using an undeclared prefix, XML-TEXT or
XML-NTEXT contains the fully qualified attribute name or element name. That is,
the name includes the undeclared prefix and the separator colon (:).
| v If XMLPARSE(COMPAT) is in effect, XML-TEXT or XML-NTEXT contains the document
| text up to and including the point where the exception was detected.
| v If XMLPARSE(XMLSS) is in effect, XML-TEXT or XML-NTEXT contains the document text
| up to the point where the error or anomaly was detected. If you process the
| XML document one segment at a time, the applicable special register contains
| only the current segment.
All other XML special registers are empty with length zero.
| For XMLPARSE(XMLSS):
Parsing cannot continue after a fatal exception even if you set XML-CODE to zero in
the processing procedure. Upon return to the parser from the processing
procedure, the parser transfers control to the ON EXCEPTION phrase, if specified;
otherwise the parser transfers control to the end of the XML PARSE statement.
XML-CODE contains the original exception code set by the parser.
| For XMLPARSE(COMPAT):
| If the exception code has any other nonzero value, parsing cannot continue.
| Exception codes 1 - 49: An exception for which the exception code is in the range
| 1 - 49 is a fatal error according to the XML specification. Therefore, the parser does
| not continue normal parsing even if the processing procedure handles the
| exception. However, the parser does continue scanning for further errors until it
| reaches the end of the document, or until the existing XML EVENT token array is
| exhausted. For these exceptions, the parser does not signal any further normal
| events except the END-OF-DOCUMENT event.
RELATED CONCEPTS
XML events on page 524
XML-CODE on page 525
XML input document encoding on page 537
RELATED TASKS
Parsing XML documents one segment at a time on page 533
Handling XML PARSE exceptions on page 542
| Handling encoding conflicts
Terminating XML parsing on page 546
| RELATED REFERENCES
| XMLPARSE on page 368 (compiler option)
The encoding of XML documents on page 536
| XML PARSE exceptions with XMLPARSE(XMLSS) in effect on page 691
| XML PARSE exceptions with XMLPARSE(COMPAT) in effect on page 693
z/OS XML System Services User's Guide and Reference
XML specification
| For XMLPARSE(XMLSS):
| The parser does not continue after an encoding-conflict exception or after any
| other type of exception. Any changes that you make in the processing procedure to
| the value of XML-CODE are ignored. The value in XML-CODE when the parser returns
| to the XML PARSE statement is the original exception code that the parser set.
| For XMLPARSE(COMPAT):
| In this special case, you can choose to parse using the code page of the document
| by subtracting 100,000 from the value in XML-CODE. For instance, if XML-CODE
| The parser takes one of three actions after returning from a processing procedure
| for an encoding-conflict exception event:
| v If you set XML-CODE to zero, the parser uses the external code page: the value of
| the CODEPAGE compiler option.
| v If you set XML-CODE to the code page of the document (that is, the original
| XML-CODE value minus 100,000), the parser uses the code page of the document.
| This is the only case in which the parser continues when XML-CODE has a nonzero
| value upon returning from a processing procedure.
| v Otherwise, the parser stops processing the document and returns control to the
| XML PARSE statement with an exception condition. XML-CODE contains the
| exception code that was originally passed with the exception event.
| RELATED CONCEPTS
| XML-CODE on page 525
| XML input document encoding on page 537
| How the XML parser handles errors on page 544
| RELATED TASKS
| Handling XML PARSE exceptions on page 542
| RELATED REFERENCES
| XMLPARSE on page 368 (compiler option)
| The encoding of XML documents on page 536
| XML PARSE exceptions with XMLPARSE(XMLSS) in effect on page 691
| XML PARSE exceptions with XMLPARSE(COMPAT) in effect on page 693
| z/OS XML System Services User's Guide and Reference
|
Terminating XML parsing
You can terminate parsing immediately, without processing any remaining XML
text, by setting XML-CODE to -1 in your processing procedure before the procedure
returns to the parser from any normal XML event (that is, any event other than
EXCEPTION).
You can use this technique when the processing procedure has examined enough
of the document or has detected some irregularity in the document that precludes
further meaningful processing.
If you terminate parsing in this way, the parser does not signal any further XML
events, including the exception event. Control transfers to the ON EXCEPTION phrase
of the XML PARSE statement, if that phrase was specified.
| If the XMLPARSE(COMPAT) compiler option is in effect, you can also terminate parsing
| after any XML EXCEPTION event by returning to the parser from the processing
| procedure without changing the value in XML-CODE. The result is similar to the
RELATED CONCEPTS
XML-CODE on page 525
How the XML parser handles errors on page 544
RELATED TASKS
Writing procedures to process XML on page 522
Handling XML PARSE exceptions on page 542
| Use these examples to understand the basic use of XML PARSE and for
| XMLPARSE(XMLSS), specialized uses such as parsing documents that include
| namespaces, parsing documents one segment at a time, and parsing documents
| with validation against a schema.
Assume that the COBOL program contains the following XML document in data
item Doc:
<?xml version="1.0"?><msg type="short">Hello, World!</msg>
The following code fragment shows an XML PARSE statement for parsing Doc, and a
processing procedure, P, for handling the XML events:
XML Parse Doc
Processing procedure P
. . .
P. Display XML-Event XML-Text.
The processing procedure displays the content of XML-EVENT and XML-TEXT for each
event that the parser signals during parsing. The following table shows the events
and the text.
Table 71. XML events and special registers
XML-EVENT XML-TEXT
START-OF-DOCUMENT
VERSION-INFORMATION 1.0
START-OF-ELEMENT msg
RELATED CONCEPTS
XML events on page 524
XML-TEXT and XML-NTEXT on page 527
The XML document is shown in the program source to make it easier to follow the
| flow of the parsing. The output of the program with XMLPARSE(XMLSS) and with
| XMLPARSE(COMPAT) in effect is shown after the example.
To understand the interaction of the parser and the processing procedure, and to
match events to document fragments, compare the XML document to the output of
the program.
Process codepage(1047)
Identification division.
Program-id. XMLSAMPL.
Data division.
Working-storage section.
******************************************************************
* XML document data, encoded as initial values of data items. *
******************************************************************
1 xml-document-data.
2 pic x(39) value <?xml version="1.0" encoding="IBM-1047".
2 pic x(19) value standalone="yes"?>.
2 pic x(39) value <!--This document is just an example-->.
2 pic x(10) value <sandwich>.
2 pic x(33) value <bread type="baker's best"/>.
2 pic x(36) value <?spread Well use real mayonnaise?>.
2 pic x(29) value <meat>Ham & turkey</meat>.
2 pic x(34) value <filling>Cheese, lettuce, tomato, .
2 pic x(32) value and thats all, Folks!</filling>.
2 pic x(25) value <![CDATA[We should add a .
2 pic x(20) value <relish> element!]]>.
2 pic x(28) value <listprice>$4.99</listprice>.
2 pic x(25) value <discount>0.10</discount>.
2 pic x(31) value </sandwich>.
******************************************************************
* XML document, represented as fixed-length records. *
******************************************************************
1 xml-document redefines xml-document-data.
2 xml-segment pic x(40) occurs 10 times.
1 xml-segment-no comp pic s9(4).
1 content-buffer pic x(100).
1 current-element-stack.
2 current-element pic x(30) occurs 10 times.
******************************************************************
* Sample data definitions for processing numeric XML content. *
******************************************************************
Start of document
End of input
Next segment: {standalone="yes"?><!--This document is j}
Version: {1.0}
Encoding: {ibm-1047}
Standalone: {yes}
Comment: {This document is j}
End of input
Next segment: {ust an example--><sandwich><bread type="}
PI target: {spread}
PI data: {eal mayonnaise}
Start element tag: {meat}
Content characters: {Ham & turkey}
End of input
Next segment: {meat><filling>Cheese, lettuce, tomato, a}
RELATED CONCEPTS
XML events on page 524
RELATED REFERENCES
XMLPARSE on page 368 (compiler option)
XML-EVENT (Enterprise COBOL Language Reference)
Namespace identifiers and namespace prefixes are used in the program to qualify
element names and attribute names. This qualification makes it possible to use the
same name in more than one context: title is used both as an author's title (Mr)
and as a book title (Writing COBOL for Fun and Profit).
The following table lists the sequence of events that the processing procedure
receives from the parser, and shows the content of the associated XML special
registers.
Table 73. XML events and special registers from parsing XML document with an undeclared namespace prefix
XML-NAMESPACE-
XML-EVENT XML-CODE XML-TEXT PREFIX XML-NAMESPACE
START-OF-DOCUMENT 000000000
EXCEPTION 000264193 pfx0:root
START-OF-ELEMENT 000000000 root pfx0
NAMESPACE- 000000000 pfx1 http://whatever
DECLARATION
START-OF-ELEMENT 000000000 localElName1 pfx1 http://whatever
EXCEPTION 000264193 pfx2:localElName2
START-OF-ELEMENT 000000000 localElName2 pfx2
END-OF-ELEMENT 000000000 localElName2 pfx2
EXCEPTION 000264193 pfx3:localElName3
START-OF-ELEMENT 000000000 localElName3 pfx3
EXCEPTION 000264192 pfx4:localAtName4
ATTRIBUTE-NAME 000000000 localAtName4 pfx4
ATTRIBUTE- 000000000
CHARACTERS
CONTENT-CHARACTERS 000000000 c1
EXCEPTION 000264193 pfx5:localElName5
START-OF-ELEMENT 000000000 localElName5 pfx5
EXCEPTION 000264192 pfx6:localAtName6
ATTRIBUTE-NAME 000000000 localAtName6 pfx6
ATTRIBUTE- 000000000
CHARACTERS
END-OF-ELEMENT 000000000 localElName5 pfx5
CONTENT-CHARACTERS 000000000 c2
END-OF-ELEMENT 000000000 localElName3 pfx3
CONTENT-CHARACTERS 000000000 c3
END-OF-ELEMENT 000000000 localElName1 pfx1 http://whatever
END-OF-ELEMENT 000000000 root pfx0
END-OF-DOCUMENT 000000000
For a detailed description of the set of XML events, see the related reference about
XML-EVENT.
RELATED REFERENCES
| XMLPARSE on page 368 (compiler option)
XML-EVENT (Enterprise COBOL Language Reference)
The example shows the XML content of a file, the program that reads and submits
XML text to the parser, and the sequence of events that results from parsing the
input records.
Content of infile
The XML document that will be parsed a segment at a time is contained in file
infile, shown below.
<?xml version=1.0?>
<Tagline>
COBOL is the language of the future!
</Tagline>
Program PARSESEG
Program PARSESEG reads a segment (a record) of the XML document from file
infile, then passes the record to the parser using the XML PARSE statement. The
parser processes the XML text and transfers control to the processing procedure for
each XML event. The processing procedure handles each event and returns to the
parser.
At the end of the segment, the parser sets XML-EVENT to END-OF-INPUT, sets
XML-CODE to zero, and transfers control to the processing procedure. The processing
procedure reads the next XML record into the parse data item, sets XML-CODE to
one, and returns to the parser.
The exchange between the processing procedure and the parser continues until the
READ statement returns the end-of-file status code. The processing procedure
returns to the parser with XML-CODE still set to zero to indicate the end of segment
processing.
Identification division.
Program-id. PARSESEG.
Environment division.
Input-output section.
File-control.
Select Input-XML
Assign to infile
File status is Input-XML-status.
Data division.
File section.
FD Input-XML
Record is varying from 1 to 255 depending on Rec-length
Recording mode V.
1 fdrec.
2 pic X occurs 1 to 255 depending on Rec-length .
Working-storage section.
Notice the extra zero-length CONTENT-CHARACTERS XML event at event number 08.
(Such anomalies are typical when supplying XML text piecemeal.)
Starting with: <?xml version=1.0?>
Event number and name Content of XML-TEXT
01: START-OF-DOCUMENT {}
02: VERSION-INFORMATION {1.0}
03: END-OF-INPUT {}
Continuing with: <Tagline>
04: START-OF-ELEMENT {Tagline}
05: END-OF-INPUT {}
Continuing with: COBOL is the language of the future!
06: CONTENT-CHARACTERS {COBOL is the language of the future!}
07: END-OF-INPUT {}
For a detailed description of the XML events that were detected, see the related
reference about XML-EVENT.
RELATED REFERENCES
| XMLPARSE on page 368 (compiler option)
XML-EVENT (Enterprise COBOL Language Reference)
The example uses the schema that was described in the related concept about XML
schemas.
Assume that file item.xsd contains the schema in text format, and that the
preprocessed schema was generated in file item.osr by means of the following
z/OS UNIX command:
xsdosrg -v -o /u/HLQ/xml/item.osr /u/HLQ/xml/item.xsd
The example uses the XML-SCHEMA clause to associate the XML schema name schema
with the ddname ddschema. The following DD statement associates the ddname with
the external z/OS UNIX file that contains the schema:
//GO.DDSCHEMA DD PATH=/u/HLQ/xml/item.osr
Program ValidCk
Identification division.
Program-id. ValidCk.
Environment division.
Configuration section.
Special-names.
xml-schema schema is ddschema.
Data division.
Working-storage section.
1 xml-decode.
2 rtn comp Pic 9(2).
2 rsn comp-5 Pic 9(4).
1 hv pic x(16) value 0123456789ABCDEF.
1 T Pic 999 COMP.
1 xml-document-1.
2 pic x(52) value
<!--Valid: the "itemName" element can be omitted-->.
2 pic x(31) value <stockItem itemNumber="123-AB">.
2 pic x(36) value <quantityOnHand>1</quantityOnHand>.
2 pic x(12) value </stockItem>.
1 xml-document-2.
2 pic x(44)
value <!--Invalid: missing attribute itemNumber-->.
2 pic x(11) value <stockItem>.
2 pic x(30) value <itemName>No name</itemName>.
2 pic x(36) value <quantityOnHand>1</quantityOnHand>.
2 pic x(12) value </stockItem>.
For those documents that were not valid, the parser signaled an XML exception
and passed control to the processing procedure with special register XML-EVENT
containing 'EXCEPTION' and special-register XML-CODE containing the return code and
a specific reason code.
Valid: the "itemName" element can be omitted
Document successfully parsed.
RELATED CONCEPTS
XML-CODE on page 525
XML schemas on page 532
RELATED TASKS
Parsing XML documents with validation on page 530
Handling XML PARSE exceptions on page 542
RELATED REFERENCES
| XML PARSE exceptions with XMLPARSE(XMLSS) in effect on page 691
In the XML GENERATE statement, you identify the source and the output data items.
You can optionally also identify:
v A field to receive a count of the XML characters generated
v A code page in which the generated XML document is to be encoded
v A namespace for the generated document
v A namespace prefix to qualify the start and end tag of each element, if you
specify a namespace
v A user-defined element or attribute name in the generated XML document
v Attributes or elements to be suppressed according to some specified conditions
v Particular items to be specified as attributes, elements or content in the
generated XML output.
v A statement to receive control if an exception occurs
Optionally, you can generate an XML declaration for the document, and can cause
eligible source data items to be expressed as attributes in the output rather than as
elements.
You can use the XML-CODE special register to determine the status of XML
generation.
After you transform COBOL data items to XML, you can use the resulting XML
output in various ways, such as deploying it in a web service, passing it as a
message to WebSphere MQ, or transmitting it for subsequent conversion to a CICS
communication area.
RELATED TASKS
Generating XML output
Controlling the encoding of generated XML output on page 566
Handling XML GENERATE exceptions on page 567
Enhancing XML output on page 573
RELATED REFERENCES
Extensible Markup Language (XML)
XML GENERATE statement (Enterprise COBOL Language Reference)
In the XML GENERATE statement, you first identify the data item (XML-OUTPUT in the
example above) that is to receive the XML output. Define the data item to be large
enough to contain the generated XML output, typically five to 10 times the size of
the COBOL source data depending on the length of its data-name or data-names.
| In the DATA DIVISION, you can define the receiving identifier as alphanumeric
(either an alphanumeric group item or an elementary item of category
alphanumeric) or as national (either a national group item or an elementary item
of category national).
Next you identify the source data item that is to be transformed to XML format
(SOURCE-REC in the example). The source data item can be an alphanumeric group
item, national group item, or elementary data item of class alphanumeric or
national.
Some COBOL data items are not transformed to XML, but are ignored. Subordinate
data items of an alphanumeric group item or national group item that you
transform to XML are ignored if they:
v Specify the REDEFINES clause, or are subordinate to such a redefining item
v Specify the RENAMES clause
These items in the source data item are also ignored when you generate XML:
v Elementary FILLER (or unnamed) data items
v Slack bytes inserted for SYNCHRONIZED data items
No extra white space (for example, new lines or indentation) is inserted to make
the generated XML more readable.
Optionally, you can code the COUNT IN phrase to obtain the number of XML
character encoding units that are filled during generation of the XML output. If the
receiving identifier has category national, the count is in UTF-16 character
encoding units. For all other encodings (including UTF-8), the count is in bytes.
You can use the count field as a reference modification length to obtain only that
portion of the receiving data item that contains the generated XML output. For
example, XML-OUTPUT(1:XML-CHAR-COUNT) references the first XML-CHAR-COUNT
character positions of XML-OUTPUT.
Alternatively, you can specify the ATTRIBUTES phrase of the XML GENERATE
| statement. The ATTRIBUTES phrase causes every eligible data item included in the
| generated XML document to be expressed as an attribute of the containing XML
| element, rather than as a child element of the containing XML element. To be
| eligible, the data item must be elementary, must have a name other than FILLER,
| and must not have an OCCURS clause in its data description entry. The containing
| XML element corresponds to the group data item that is immediately
| superordinate to the elementary data item. Optionally, you can specify more
| precise control of which data items should be expressed as attributes or elements
| by using the TYPE OF phrase.
For example, suppose that the XML GENERATE statement in the program excerpt
above had instead been coded as follows:
XML Generate Doc from G with attributes
The code would then generate the following XML document, in which A and E are
expressed as attributes of element G, and C and D become attributes of element B:
<G A="aaa" E="eee"><B C="ccc" D="ddd"></B></G>
Optionally, you can code the ENCODING phrase of the XML GENERATE statement to
specify the CCSID of the generated XML document. If you do not use the ENCODING
phrase, the document encoding is determined by the category of the receiving data
item and by the CODEPAGE compiler option. For further details, see the related task
below about controlling the encoding of generated XML output.
Optionally, you can code the XML-DECLARATION phrase to cause the generated XML
document to have an XML declaration that includes version information and an
encoding declaration. If the receiving data item is of category:
v National: The encoding declaration has the value UTF-16 (encoding="UTF-16").
v Alphanumeric: The encoding declaration is derived from the ENCODING phrase, if
specified, or from the CODEPAGE compiler option in effect for the program if the
ENCODING phrase is not specified.
For example, the program excerpt below specifies the XML-DECLARATION phrase of
XML GENERATE, and specifies encoding with CCSID 1208 (UTF-8):
01 Greeting.
05 msg pic x(80) value Hello, world!.
. . .
XML Generate Doc from Greeting
with Encoding 1208
with XML-declaration
End-XML
Optionally, you can code the NAMESPACE phrase to specify a namespace for the
generated XML document. The namespace value must be a valid Uniform Resource
For example, consider the following data definitions and XML GENERATE statement:
01 Greeting.
05 msg pic x(80) value Hello, world!.
01 NS pic x(20) value http://example.
. . .
XML Generate Doc from Greeting
namespace is NS
If you do not specify a namespace, the element names in the generated XML
document are not in any namespace.
When the XML GENERATE statement is executed, the prefix value must be a valid
XML name, but without the colon (:); see the related reference below about
namespaces for details. The value can have trailing spaces, which are removed
before the prefix is used.
It is recommended that the prefix be short, because it qualifies the start and end
tag of each element.
For example, consider the following data definitions and XML GENERATE statement:
01 Greeting.
05 msg pic x(80) value Hello, world!.
01 NS pic x(20) value http://example.
01 NP pic x(5) value pre.
. . .
XML Generate Doc from Greeting
namespace is NS
namespace-prefix is NP
The resulting XML document has an explicit namespace (http://example), and the
prefix pre is applied to the start and end tag of the elements Greeting and msg, as
follows:
<pre:Greeting xmlns:pre="http://example"><pre:msg>Hello, world!</pre:msg></pre:Greeting>
For example, consider the following data structure and XML GENERATE statement:
| 01 Msg.
02 Msg-Severity pic 9 value 1.
02 Msg-Date pic 9999/99/99 value "2012/04/12".
02 Msg-Text pic X(50) value "Sell everything!".
| 01 Doc pic X(500).
XML Generate Doc from Msg
With attributes
Name of Msg is "Message"
Msg-Severity is "Severity"
Msg-Date is "Date"
Msg-Text is "Text"
| End-XML
Optionally, you can code the SUPPRESS phrase to specify whether individual data
items are generated based on whether or not they meet certain criteria.
For example, consider the following data structure and XML GENERATE statement to
suppress spaces and zeros:
| 01 G.
| 02 SensitiveInfo.
| 03 SSN pic x(11) value 123-45-6789.
| 03 HomeAddress pic x(50) value 123 Main St, Anytown, USA.
| 02 Aarray value spaces.
| 03 A pic AAA occurs 5.
| 02 Barray value spaces.
| 03 B pic XXX occurs 5.
| 02 Carray value zeros.
| 03 C pic 999 occurs 5.
| Move abc to A(1)
| Move 123 to C(3)
| XML Generate Doc from G
| Suppress SensitiveInfo
| every nonnumeric element when space
| every numeric element when zero
| End-XML
| Optionally, you can use the TYPE OF phrase to specify whether individual data
items are expressed as attributes, elements or content.
For example, consider the following data structure and XML GENERATE statement:
| 01 Msg.
02 Msg-Severity pic 9 value 1.
02 Msg-Date pic 9999/99/99 value "2012/04/12".
02 Msg-Text pic X(50) value "Sell everything!".
| 01 Doc pic X(500).
XML Generate Doc from Msg
With attributes
In addition, you can specify either or both of the following phrases to receive
control after generation of the XML document:
v ON EXCEPTION, to receive control if an error occurs during XML generation
v NOT ON EXCEPTION, to receive control if no error occurs
You can end the XML GENERATE statement with the explicit scope terminator
END-XML. Code END-XML to nest an XML GENERATE statement that has the ON
EXCEPTION or NOT ON EXCEPTION phrase in a conditional statement.
XML generation continues until either the COBOL source record has been
transformed to XML or an error occurs. If an error occurs, the results are as
follows:
v The XML-CODE special register contains a nonzero exception code.
v Control is passed to the ON EXCEPTION phrase, if specified, otherwise to the end
of the XML GENERATE statement.
If no error occurs during XML generation, the XML-CODE special register contains
zero, and control is passed to the NOT ON EXCEPTION phrase if specified or to the
end of the XML GENERATE statement otherwise.
RELATED CONCEPTS
Uniform Resource Identifier (URI): Generic Syntax
RELATED TASKS
Controlling the encoding of generated XML output
Handling XML GENERATE exceptions on page 567
Processing UTF-8 data on page 141
RELATED REFERENCES
XML GENERATE statement (Enterprise COBOL Language Reference)
Extensible Markup Language (XML)
Namespaces in XML 1.0
If you specify the WITH ENCODING codepage phrase to designate the coded character
set identifier (CCSID) of the output document, codepage must specify an unsigned
integer data item or unsigned integer literal that identifies one of the code pages
supported for COBOL XML processing as described in the related reference below
about the encoding of XML documents:
566 Enterprise COBOL for z/OS, V5.2 Programming Guide
v If the data item that receives the generated XML is of category national, the WITH
ENCODING phrase must specify 1200, the CCSID for Unicode UTF-16.
v If the receiving identifier is of category alphanumeric, the WITH ENCODING phrase
must specify CCSID 1208 or the CCSID of a supported EBCDIC code page.
If you do not code the WITH ENCODING phrase, the generated XML output is
encoded as shown in the table below.
Table 74. Encoding of generated XML if the ENCODING phrase is omitted
If you define the receiving XML
identifier as: The generated XML output is encoded in:
Alphanumeric The code page specified by the CODEPAGE
compiler option in effect when the source was
compiled
National UTF-16 big-endian (UTF-16BE, CCSID 1200)
For details about how data items are converted to XML and how the XML element
names and attributes names are formed from the COBOL data-names, see the
related reference below about the operation of the XML GENERATE statement.
RELATED REFERENCES
CODEPAGE on page 313
The encoding of XML documents on page 536
XML GENERATE statement (Enterprise COBOL Language Reference)
Operation of XML GENERATE (Enterprise COBOL Language Reference)
To handle errors, use either or both of the following phrases of the XML GENERATE
statement:
v ON EXCEPTION
v COUNT IN
If you code the ON EXCEPTION phrase in the XML GENERATE statement, control is
transferred to the imperative statement that you specify. You might code an
imperative statement, for example, to display the XML-CODE value. If you do not
code an ON EXCEPTION phrase, control is transferred to the end of the XML GENERATE
statement.
When an error occurs, one problem might be that the data item that receives the
XML output is not large enough. In that case, the XML output is not complete, and
the XML-CODE special register contains error code 400.
You can examine the generated XML output by doing these steps:
1. Code the COUNT IN phrase in the XML GENERATE statement.
The count field that you specify holds a count of the XML character encoding
units that are filled during XML generation. If you define the XML output as
Use the contents of XML-CODE to determine what corrective action to take. For a list
of the exceptions that can occur during XML generation, see the related reference
below.
RELATED TASKS
Referring to substrings of data items on page 111
RELATED REFERENCES
XML GENERATE exceptions on page 700
XML-CODE (Enterprise COBOL Language Reference)
Program XGFX uses XML GENERATE to produce XML output in elementary data item
xmlPO from the source record, group data item purchaseOrder. Elementary data
items in the source record are converted to character format as necessary, and the
characters are inserted as the values of XML attributes whose names are derived
from the data-names in the source record.
XGFX calls program Pretty, which uses the XML PARSE statement with processing
procedure p to format the XML output with new lines and indentation so that the
XML content can more easily be verified.
Program XGFX
Identification division.
Program-id. XGFX.
Data division.
Working-storage section.
01 numItems pic 99 global.
01 purchaseOrder global.
05 orderDate pic x(10).
05 shipTo.
10 country pic xx value US.
10 name pic x(30).
10 street pic x(30).
10 city pic x(30).
10 state pic xx.
10 zip pic x(10).
05 billTo.
10 country pic xx value US.
10 name pic x(30).
10 street pic x(30).
10 city pic x(30).
10 state pic xx.
10 zip pic x(10).
05 orderComment pic x(80).
05 items occurs 0 to 20 times depending on numItems.
Move 0 to numItems
Call addFirstItem
Call addSecondItem
Move space to xmlPO
Xml generate xmlPO from purchaseOrder count in numChars
with xml-declaration with attributes
namespace http://www.example.com namespace-prefix po
Call pretty using xmlPO value numChars
Goback
.
Identification division.
Program-id. addFirstItem.
Procedure division.
Add 1 to numItems
Move 872-AA to partNum(numItems)
Move Lawnmower to productName(numItems)
Move 1 to quantity(numItems)
Move 148.95 to USPrice(numItems)
Move Confirm this is electric to itemComment(numItems)
Goback.
End program addFirstItem.
Identification division.
Program-id. addSecondItem.
Procedure division.
Add 1 to numItems
Move 926-AA to partNum(numItems)
Move Baby Monitor to productName(numItems)
Move 1 to quantity(numItems)
Move 39.98 to USPrice(numItems)
Move 1999-05-21 to shipDate(numItems)
Goback.
End program addSecondItem.
RELATED TASKS
Chapter 28, Processing XML input, on page 517
For example:
v In addition to the required data, the item has subordinate data items that
contain values that are irrelevant to the XML output document.
v The names of the required data items are unsuitable for external presentation,
and are possibly meaningful only to programmers.
v The required data items are broken up into too many components, and should
be output as the content of the containing group.
There are various ways that you can deal with such situations. One possible
technique is to define a new data item that has the appropriate characteristics, and
move the required data to the appropriate fields of this new data item. However,
this approach is somewhat laborious and requires careful maintenance to keep the
original and new data items synchronized.
A superior approach that addresses most such problems is to use the new optional
phrases of the XML GENERATE statement in order to:
v Provide more meaningful and appropriate names for the selected elementary
items and for the group items that contain them.
v Exclude irrelevant data items from the generated XML by suppressing them
based on their values.
RELATED REFERENCES
Operation of XML GENERATE (Enterprise COBOL Language Reference)
Consider the following data structure. The XML that is generated from the
structure suffers from several problems that can be corrected.
01 CDR-LIFE-BASE-VALUES-BOX.
15 CDR-LIFE-BASE-VAL-DATE PIC X(08).
15 CDR-LIFE-BASE-VALUE-LINE OCCURS 2 TIMES.
20 CDR-LIFE-BASE-DESC.
25 CDR-LIFE-BASE-DESC1 PIC X(15).
25 FILLER PIC X(01).
25 CDR-LIFE-BASE-LIT PIC X(08).
25 CDR-LIFE-BASE-DTE PIC X(08).
20 CDR-LIFE-BASE-PRICE.
25 CDR-LIFE-BP-SPACE PIC 9(08).
25 CDR-LIFE-BP-DASH PIC X.
25 CDR-LIFE-BP-SPACE1 PIC X(02).
20 CDR-LIFE-BASE-PRICE-ED REDEFINES
When this data structure is populated with some sample values, and XML is
generated directly from it and then formatted using program Pretty (shown in
Example: generating XML on page 568), the result is as follows:
<CDR-LIFE-BASE-VALUES-BOX>
<CDR-LIFE-BASE-VAL-DATE>01/02/03</CDR-LIFE-BASE-VAL-DATE>
<CDR-LIFE-BASE-VALUE-LINE>
<CDR-LIFE-BASE-DESC>
<CDR-LIFE-BASE-DESC1>First</CDR-LIFE-BASE-DESC1>
<CDR-LIFE-BASE-LIT> </CDR-LIFE-BASE-LIT>
<CDR-LIFE-BASE-DTE>01/01/01</CDR-LIFE-BASE-DTE>
</CDR-LIFE-BASE-DESC>
<CDR-LIFE-BASE-PRICE>
<CDR-LIFE-BP-SPACE>23</CDR-LIFE-BP-SPACE>
<CDR-LIFE-BP-DASH>.</CDR-LIFE-BP-DASH>
<CDR-LIFE-BP-SPACE1>000</CDR-LIFE-BP-SPACE1>
</CDR-LIFE-BASE-PRICE>
<CDR-LIFE-BASE-QTY>
<CDR-LIFE-QTY-SPACE>123</CDR-LIFE-QTY-SPACE>
<CDR-LIFE-QTY-DASH>.</CDR-LIFE-QTY-DASH>
<CDR-LIFE-QTY-SPACE1>000</CDR-LIFE-QTY-SPACE1>
</CDR-LIFE-BASE-QTY>
<CDR-LIFE-BASE-VALUE>$765.00</CDR-LIFE-BASE-VALUE>
</CDR-LIFE-BASE-VALUE-LINE>
<CDR-LIFE-BASE-VALUE-LINE>
<CDR-LIFE-BASE-DESC1>Second</CDR-LIFE-BASE-DESC1>
<CDR-LIFE-BASE-LIT> </CDR-LIFE-BASE-LIT>
<CDR-LIFE-BASE-DTE>02/02/02</CDR-LIFE-BASE-DTE>
<CDR-LIFE-BASE-PRICE>
<CDR-LIFE-BP-SPACE>34</CDR-LIFE-BP-SPACE>
<CDR-LIFE-BP-DASH>.</CDR-LIFE-BP-DASH>
<CDR-LIFE-BP-SPACE1>00</CDR-LIFE-BP-SPACE1>
</CDR-LIFE-BASE-PRICE>
<CDR-LIFE-BASE-QTY>
<CDR-LIFE-QTY-SPACE>234</CDR-LIFE-QTY-SPACE>
<CDR-LIFE-QTY-DASH>.</CDR-LIFE-QTY-DASH>
<CDR-LIFE-QTY-SPACE1>000</CDR-LIFE-QTY-SPACE1>
</CDR-LIFE-BASE-QTY>
<CDR-LIFE-BASE-VALUE>$654.00</CDR-LIFE-BASE-VALUE>
</CDR-LIFE-BASE-VALUE-LINE>
<CDR-LIFE-BASE-TOT-VALUE>Very high!</CDR-LIFE-BASE-TOT-VALUE>
</CDR-LIFE-BASE-TOT-VALUE-LINE>
</CDR-LIFE-BASE-VALUES-BOX>
These and other characteristics of the XML output can be remedied by using
additional phrases of the XML GENERATE statement as follows:
v Use the NAME OF phrase to provide appropriate tag or attribute names.
v Use the TYPE OF ... IS ATTRIBUTE phrase to select the fields which should be
XML attributes rather than elements.
v Use the TYPE OF ... IS CONTENT phrase to suppress tags for excessive
subcomponents.
v Use the SUPPRESS ... WHEN phrase to exclude fields that contain uninteresting
values.
The result of generating and formatting XML from the statement shown above is
more usable:
<Base_Values Date="01/02/03">
<BaseValueLine Description="First">
<Date>01/01/01</Date>
<BasePrice>23.00</BasePrice>
<BaseQuantity>123.000</BaseQuantity>
<BaseValue>$765.00</BaseValue>
</BaseValueLine>
<BaseValueLine Description="Second">
<Date>02/02/02</Date>
<BasePrice>34.00</BasePrice>
<BaseQuantity>234.000</BaseQuantity>
Note that the COBOL reserved word DATE can now be used as an XML tag name in
the output. Characters such as accented letters and period . that are illegal in
single-byte data names can also be used.
RELATED REFERENCES
Operation of XML GENERATE (Enterprise COBOL Language Reference)
REPLACE statement (Enterprise COBOL Language Reference)
OO programs are based on objects (entities that encapsulate state and behavior) and
their classes, methods, and data. A class is a template that defines the state and the
capabilities of an object. Usually a program creates and works with multiple object
instances (or simply, instances) of a class, that is, multiple objects that are members
of that class. The state of each instance is stored in data known as instance data,
and the capabilities of each instance are called instance methods. A class can define
data that is shared by all instances of the class, known as factory or static data, and
methods that are supported independently of any object instance, known as factory
or static methods.
In Enterprise COBOL programs, you can call the services provided by the Java
Native Interface (JNI) to obtain Java-oriented capabilities in addition to the basic
OO capabilities available directly in the COBOL language.
In Enterprise COBOL classes, you can code CALL statements to interface with
procedural COBOL programs. Thus COBOL class definition syntax can be
especially useful for writing wrapper classes for procedural COBOL logic, enabling
existing COBOL code to be accessed from Java.
Java code can create instances of COBOL classes, invoke methods of these classes,
and can extend COBOL classes.
It is recommended that you develop and run OO COBOL programs and Java
programs in the z/OS UNIX environment.
Restrictions:
v COBOL class definitions and methods cannot contain EXEC SQL statements and
cannot be compiled using the SQL compiler option.
v COBOL class definitions and methods cannot contain EXEC SQLIMS statements
and cannot be compiled using the SQLIMS compiler option.
v COBOL programs that use object-oriented syntax for Java interoperability cannot
contain EXEC CICS statements, and cannot be run in CICS. They cannot be
compiled using the CICS compiler option.
RELATED TASKS
Defining a class on page 582
Defining a class instance method on page 587
RELATED REFERENCES
The Java Language Specification
Example: accounts
Consider the example of a bank in which customers can open accounts and make
deposits to and withdrawals from their accounts. You could represent an account
by a general-purpose class, called Account. Because there are many customers,
multiple instances of the Account class could exist simultaneously.
After you determine the classes that you need, the next step is to determine the
methods that the classes need to do their work. An Account class must provide the
following services:
v Open the account.
v Get the current balance.
v Deposit to the account.
v Withdraw from the account.
v Report account status.
As you design an Account class and its methods, you discover the need for the
class to keep some instance data. Typically, an Account object needs the following
instance data:
v Account number
v Account balance
v Customer information: name, address, home phone, work phone, social security
number, and so forth
To keep the example simple, however, it is assumed that the account number and
account balance are the only instance data that the Account class needs.
Diagrams are helpful when you design classes and methods. The following
diagram depicts a first attempt at a design of the Account class:
The structure below shows how the classes relate to each other, and is known as
the inheritance hierarchy. The Account class inherits directly from the class
java.lang.Object.
Subclasses
In the account example, Account is a general-purpose class. However, a bank could
have many different types of accounts: checking accounts, savings accounts,
mortgage loans, and so forth, all of which have all the general characteristics of
accounts but could have additional characteristics not shared by all types of
accounts.
As you design the CheckingAccount class, you discover the need for a class that
models checks. An instance of class Check needs, at a minimum, instance data for
payer, payee, and the check amount.
RELATED TASKS
Defining a class
Defining a class instance method on page 587
Defining a subclass on page 607
Defining a class
A COBOL class definition consists of an IDENTIFICATION DIVISION and ENVIRONMENT
DIVISION, followed by an optional factory definition and optional object definition,
followed by an END CLASS marker.
Table 75. Structure of class definitions
Section Purpose Syntax
IDENTIFICATION Name the class. Provide CLASS-ID paragraph for defining a class
DIVISION inheritance information on page 584 (required)
(required) for it. AUTHOR paragraph (optional)
INSTALLATION paragraph (optional)
DATE-WRITTEN paragraph (optional)
DATE-COMPILED paragraph (optional)
As shown above, you define instance data and methods in the DATA DIVISION and
PROCEDURE DIVISION, respectively, within the OBJECT paragraph of the class
definition. In classes that require data and methods that are to be associated with
the class itself rather than with individual object instances, define a separate DATA
DIVISION and PROCEDURE DIVISION within the FACTORY paragraph of the class
definition.
RELATED TASKS
WORKING-STORAGE SECTION for defining class instance data on page 586
Defining a class instance method on page 587
Defining a subclass on page 607
Defining a factory section on page 611
Describing the computing environment on page 5
Chapter 16, Compiling, linking, and running OO applications, on page 291
A class-name must use single-byte characters and must conform to the normal
rules of formation for a COBOL user-defined word.
You must derive all classes directly or indirectly from the java.lang.Object class.
RELATED TASKS
REPOSITORY paragraph for defining a class
RELATED REFERENCES
CLASS-ID paragraph (Enterprise COBOL Language Reference)
User-defined words (Enterprise COBOL Language Reference)
External class-names are case sensitive and must conform to Java rules of
formation. For example, in the Account class definition you might code this:
Environment Division. Required
Configuration Section. Required
Repository. Required
Class Base is "java.lang.Object" Required
Class Account is "Account". Optional
The REPOSITORY paragraph entries indicate that the external class-names of the
classes referred to as Base and Account within the class definition are
java.lang.Object and Account, respectively.
In a REPOSITORY paragraph entry, you must specify the external class-name if the
name contains non-COBOL characters. You must also specify the external
class-name for any referenced class that is part of a Java package. For such a class,
specify the external class-name as the fully qualified name of the package,
followed by period (.), followed by the simple name of the Java class. For
example, the Object class is part of the java.lang package, so specify its external
name as java.lang.Object as shown above.
If you do not include the external class-name in a REPOSITORY paragraph entry, the
external class-name is formed from the class-name in the following manner:
v The class-name is converted to uppercase.
v Each hyphen is changed to zero.
v The first character, if a digit, is changed:
1-9 are changed to A-I.
0 is changed to J.
v Underscores are not changed.
In the example above, class Account is known externally as Account (in mixed
case) because the external name is spelled using mixed case.
You can optionally include in the REPOSITORY paragraph an entry for the class that
you are defining (Account in this example). You must include an entry for the class
that you are defining if the external class-name contains non-COBOL characters, or
to specify a fully package-qualified class-name if the class is to be part of a Java
package.
RELATED TASKS
Declaring arrays and strings for Java on page 629
RELATED REFERENCES
REPOSITORY paragraph (Enterprise COBOL Language Reference)
The Java Language Specification (Identifiers)
The Java Language Specification (Packages)
The local class-names (the class-names as used within the class definition), the Java
packages that contain the classes, and the associated external class-names are as
shown in the table below.
The external class-name (the name after the class-name and optional IS in the
REPOSITORY paragraph entry) is composed of the fully qualified name of the
package (if any) followed by a period, followed by the simple name of the class.
RELATED TASKS
REPOSITORY paragraph for defining a class on page 584
RELATED REFERENCES
REPOSITORY paragraph (Enterprise COBOL Language Reference)
The instance data is allocated when an object instance is created, and exists until
garbage collection of the instance by the Java run time.
You can initialize simple instance data by using VALUE clauses as shown above. You
can initialize more complex instance data by coding customized methods to create
and initialize instances of classes.
| The syntax of the WORKING-STORAGE SECTION for instance data definition is generally
the same as in a program, with these exceptions:
v You cannot use the EXTERNAL attribute.
v You can use the GLOBAL attribute, but it has no effect.
RELATED TASKS
Creating and initializing instances of classes on page 604
Freeing instances of classes on page 606
Defining a factory method on page 612
Coding attribute (get and set) methods on page 593
RELATED TASKS
Chapter 16, Compiling, linking, and running OO applications, on page 291
Defining a client on page 596
Definition: The signature of a method consists of the name of the method and the
number and type of its formal parameters. (You define the formal parameters of a
COBOL method in the USING phrase of the method's PROCEDURE DIVISION header.)
Within a class definition, you do not need to make each method-name unique, but
you do need to give each method a unique signature. (You overload methods by
giving them the same name but a different signature.)
RELATED TASKS
PROCEDURE DIVISION for defining a class instance method on page 590
Overloading an instance method on page 592
Overriding an instance method on page 591
Invoking methods (INVOKE) on page 600
Defining a subclass instance method on page 609
Defining a factory method on page 612
For example, the definition of the credit method in the Account class begins like
this:
Identification Division.
Method-id. "credit".
Other Java or COBOL methods or programs (that is, clients) use the method-name
to invoke a method.
RELATED TASKS
Invoking methods (INVOKE) on page 600
Using national data (Unicode) in COBOL on page 130
RELATED REFERENCES
The Java Language Specification (Meaning of method names)
The Java Language Specification (Identifiers)
METHOD-ID paragraph (Enterprise COBOL Language Reference)
For example, if the Account class defined a method that read information from a
file, the Account class might have an INPUT-OUTPUT SECTION that is coded like this:
Environment Division.
Input-Output Section.
File-Control.
Select account-file Assign AcctFile.
The syntax for the INPUT-OUTPUT SECTION of a method is the same as the syntax for
the INPUT-OUTPUT SECTION of a program.
RELATED TASKS
Describing the computing environment on page 5
RELATED REFERENCES
INPUT-OUTPUT section (Enterprise COBOL Language Reference)
If you define a data item with the same name in both the DATA DIVISION of an
instance method and the DATA DIVISION of the OBJECT paragraph, a reference in the
method to that data-name refers only to the method data item. The method DATA
DIVISION takes precedence.
RELATED TASKS
Describing the data on page 11
Sharing data by using the EXTERNAL clause on page 491
RELATED REFERENCES
DATA DIVISION overview (Enterprise COBOL Language Reference)
You can code most COBOL statements in the PROCEDURE DIVISION of a method that
you can code in the PROCEDURE DIVISION of a program. You cannot, however, code
the following statements in a method:
v ENTRY
v EXIT PROGRAM
| v The following obsolete elements of the 85 COBOL Standard:
ALTER
GOTO without a specified procedure-name
SEGMENT-LIMIT
USE FOR DEBUGGING
Additionally, because you must compile all COBOL class definitions with the
THREAD compiler option, you cannot use SORT or MERGE statements in a COBOL
method.
You can code the EXIT METHOD or GOBACK statement in an instance method to return
control to the invoking client. Both statements have the same effect. If you specify
the RETURNING phrase upon invocation of the method, the EXIT METHOD or GOBACK
statement returns the value of the data item to the invoking client.
You can specify STOP RUN in a method; doing so terminates the entire run unit
including all threads executing within it.
USING phrase for obtaining passed arguments: Specify the formal parameters to
a method, if any, in the USING phrase of the method's PROCEDURE DIVISION header.
You must specify that the arguments are passed BY VALUE. Define each parameter
as a level-01 or level-77 item in the method's LINKAGE SECTION. The data type of
each parameter must be one of the types that are interoperable with Java.
RETURNING phrase for returning a value: Specify the data item to be returned
as the method result, if any, in the RETURNING phrase of the method's PROCEDURE
DIVISION header. Define the data item as a level-01 or level-77 item in the method's
LINKAGE SECTION. The data type of the return value must be one of the types that
are interoperable with Java.
RELATED TASKS
Coding interoperable data types in COBOL and Java on page 628
Overriding an instance method
Overloading an instance method on page 592
Comparing and setting object references on page 599
Invoking methods (INVOKE) on page 600
Chapter 16, Compiling, linking, and running OO applications, on page 291
RELATED REFERENCES
THREAD on page 362
The procedure division header (Enterprise COBOL Language Reference)
For example, the Account class defines a method debit whose LINKAGE SECTION
and PROCEDURE DIVISION header look like this:
Linkage section.
01 inDebit pic S9(9) binary.
Procedure Division using by value inDebit.
If you define a CheckingAccount subclass and want it to have a debit method that
overrides the debit method defined in the Account superclass, define the subclass
method with exactly one input parameter also specified as pic S9(9) binary. If a
client invokes debit using an object reference to a CheckingAccount instance, the
CheckingAccount debit method (rather than the debit method in the Account
superclass) is invoked.
RELATED TASKS
PROCEDURE DIVISION for defining a class instance method on page 590
Coding interoperable data types in COBOL and Java on page 628
Invoking methods (INVOKE) on page 600
Invoking overridden superclass methods on page 604
Defining a subclass on page 607
Hiding a factory or static method on page 613
RELATED REFERENCES
The Java Language Specification (Inheritance, overriding, and hiding)
You overload methods when you want to enable clients to invoke different
versions of a method, for example, to initialize data using different sets of
parameters.
Clients invoke this method to initialize an Account instance with a given account
number (and a default account balance of zero) by passing exactly one argument
that matches the data type of inAccountNumber.
But the Account class could define, for example, a second instance method init
that has an additional formal parameter that allows the opening account balance to
also be specified. The LINKAGE SECTION and PROCEDURE DIVISION header of this init
method could look like this:
Linkage section.
01 inAccountNumber pic S9(9) binary.
01 inBalance pic S9(9) binary.
Procedure Division using by value inAccountNumber
inBalance.
Clients could invoke either init method by passing arguments that match the
signature of the required method.
You can overload factory methods in exactly the same way that you overload
instance methods.
The rules for overloaded method definition and resolution of overloaded method
invocations are based on the corresponding rules for Java.
RELATED TASKS
Invoking methods (INVOKE) on page 600
Defining a factory method on page 612
RELATED REFERENCES
The Java Language Specification (Overloading)
Instance variables in COBOL are private: the class that defines instance variables
fully encapsulates them, and only the instance methods defined in the same OBJECT
paragraph can access them directly. Normally a well-designed object-oriented
application does not need to access instance variables from outside the class.
COBOL does not directly support the concept of a public instance variable as
defined in Java and other object-oriented languages, nor the concept of a class
attribute as defined by CORBA. (A CORBA attribute is an instance variable that has
an automatically generated get method for accessing the value of the variable, and
an automatically generated set method for modifying the value of the variable if
the variable is not read-only.)
RELATED TASKS
WORKING-STORAGE SECTION for defining class instance data on page 586
Processing the data on page 17
Account class
cbl dll,thread,pgmname(longmixed)
Identification Division.
Class-id. Account inherits Base.
Environment Division.
Configuration section.
Repository.
Class Base is "java.lang.Object"
Class Account is "Account".
*
* (FACTORY paragraph not shown)
*
Identification division.
Object.
Data division.
Working-storage section.
01 AccountNumber pic 9(6).
01 AccountBalance pic S9(9) value zero.
*
Procedure Division.
*
* init method to initialize the account:
Identification Division.
Method-id. "init".
Data division.
Linkage section.
01 inAccountNumber pic S9(9) binary.
Procedure Division using by value inAccountNumber.
Move inAccountNumber to AccountNumber.
End method "init".
*
* getBalance method to return the account balance:
Identification Division.
Method-id. "getBalance".
Data division.
Linkage section.
01 outBalance pic S9(9) binary.
Procedure Division returning outBalance.
Move AccountBalance to outBalance.
End method "getBalance".
*
* credit method to deposit to the account:
Check class
/**
* A Java class for check information
*/
public class Check {
private CheckingAccount payer;
private Account payee;
private int amount;
RELATED TASKS
Chapter 16, Compiling, linking, and running OO applications, on page 291
In a COBOL client, you can also call services provided by the Java Native Interface
(JNI).
Because you must compile all COBOL programs that contain object-oriented syntax
or that interoperate with Java with the THREAD compiler option, you cannot use the
following language elements in a COBOL client:
v SORT or MERGE statements
v Nested programs
Any programs that you compile with the THREAD compiler option must be
recursive. You must specify the RECURSIVE clause in the PROGRAM-ID paragraph of
each OO COBOL client program.
RELATED REFERENCES
THREAD on page 362
External class-names are case sensitive, and must conform to Java rules of
formation. For example, in a client program that uses the Account and Check
classes you might code this:
Environment division. Required
Configuration section. Required
Source-Computer. IBM-390.
Object-Computer. IBM-390.
Repository. Required
Class Account is "Account"
Class Check is "Check".
The REPOSITORY paragraph entries indicate that the external class-names of the
classes referred to as Account and Check within the client are Account and Check,
respectively.
In the REPOSITORY paragraph, you must code an entry for each class-name that you
explicitly reference in the client. In a REPOSITORY paragraph entry, you must specify
the external class-name if the name contains non-COBOL characters.
You must specify the external class-name for any referenced class that is part of a
Java package. For such a class, specify the external class-name as the fully qualified
name of the package, followed by period (.), followed by the simple name of the
Java class.
If you do not include the external class-name in a REPOSITORY paragraph entry, the
external class-name is formed from the class-name in the same manner as it is
when an external class-name is not included in a REPOSITORY paragraph entry in a
class definition. In the example above, class Account and class Check are known
externally as Account and Check (in mixed case), respectively, because the external
names are spelled using mixed case.
RELATED REFERENCES
REPOSITORY paragraph (Enterprise COBOL Language Reference)
The Java Language Specification (Identifiers)
The Java Language Specification (Packages)
Because a client references classes, it needs one or more special data items called
object references, that is, references to instances of those classes. All requests to
instance methods require an object reference to an instance of a class in which the
method is supported (that is, either defined or available by inheritance). You code
object references to refer to instances of Java classes using the same syntax as you
use to refer to instances of COBOL classes. In the example above, the phrase usage
object reference indicates an object reference data item.
All four object references in the code above are called typed object references
because a class-name appears after the OBJECT REFERENCE phrase. A typed object
reference can refer only to an instance of the class named in the OBJECT REFERENCE
phrase or to one of its subclasses. Thus anAccount can refer to instances of the
Account class or one of its subclasses, but cannot refer to instances of any other
class. Similarly, aCheck can refer only to instances of the Check class or any
subclasses that it might have.
Another type of object reference, not shown above, does not have a class-name
after the OBJECT REFERENCE phrase. Such a reference is called a universal object
reference, which means that it can refer to instances of any class. Avoid coding
universal object references, because they are interoperable with Java in only very
limited circumstances (when used in the RETURNING phrase of the INVOKE
class-name NEW . . . statement).
RELATED TASKS
Choosing LOCAL-STORAGE or WORKING-STORAGE on page 599
Coding interoperable data types in COBOL and Java on page 628
Invoking methods (INVOKE) on page 600
REPOSITORY paragraph for defining a client on page 597
RELATED REFERENCES
RETURNING phrase (Enterprise COBOL Language Reference)
Each thread has access to a separate copy of LOCAL-STORAGE data but shares access
to a single copy of WORKING-STORAGE data. If you define the data in the
WORKING-STORAGE SECTION, you need to synchronize access to the data or ensure
that no two threads can access it simultaneously.
RELATED TASKS
Chapter 27, Preparing COBOL programs for multithreading, on page 507
For example, code either IF statement below to check whether the object reference
anAccount refers to no object instance:
If anAccount = Null . . .
If anAccount = Nulls . . .
You can code a call to IsSameObject to check whether two object references, object1
and object2, refer to the same object instance or whether each refers to no object
instance. To ensure that the arguments and return value are interoperable with
Java and to establish addressability to the callable service, code the following data
definitions and statements before the call to IsSameObject:
Local-storage Section.
. . .
01 is-same Pic X.
88 is-same-false Value X00.
88 is-same-true Value X01 Through XFF.
Linkage Section.
Copy JNI.
Procedure Division.
Set Address Of JNIEnv To JNIEnvPtr
Set Address Of JNINativeInterface To JNIEnv
Call IsSameObject Using By Value JNIEnvPtr object1 object2
Returning is-same
If is-same-true . . .
Within a method you can check whether an object reference refers to the object
instance on which the method was invoked by coding a call to IsSameObject that
compares the object reference and SELF.
You can instead invoke the Java equals method (inherited from java.lang.Object) to
determine whether two object references refer to the same object instance.
You can make an object reference refer to no object instance by using the SET
statement. For example:
Set anAccount To Null.
You can also make one object reference refer to the same instance as another object
reference does by using the SET statement. For example:
Set anotherAccount To anAccount.
Within a method you can make an object reference refer to the object instance on
which the method was invoked by setting it to SELF. For example:
Set anAccount To Self.
RELATED TASKS
Coding interoperable data types in COBOL and Java on page 628
Accessing JNI services on page 623
RELATED REFERENCES
The Java Native Interface (IsSameObject)
The first example INVOKE statement above uses the class-name Account to invoke a
method called createAccount. This method must be either defined or inherited in
the Account class, and must be one of the following types:
v A Java static method
v A COBOL factory method
The phrase using by value 123456 indicates that 123456 is an input argument to
the method, and is passed by value. The input argument 123456 and the returned
data item anAccount must conform to the definition of the formal parameters and
return type, respectively, of the (possibly overloaded) createAccount method.
The second INVOKE statement uses the returned object reference anAccount to
invoke the instance method credit, which is defined in the Account class. The
input argument 500 must conform to the definition of the formal parameters of the
(possibly overloaded) credit method.
When you code an INVOKE statement using an object reference (as in the second
example statement above), the statement begins with one of the following two
forms:
Invoke objRef "literal-name" . . .
Invoke objRef identifier-name . . .
If an invoked method is not supported in the class to which the object reference
refers, a severity-3 Language Environment condition is raised at run time unless
you code the ON EXCEPTION phrase in the INVOKE statement.
You can use the optional scope terminator END-INVOKE with the INVOKE statement.
The INVOKE statement does not set the RETURN-CODE special register.
RELATED TASKS
USING phrase for passing arguments
RETURNING phrase for obtaining a returned value on page 603
PROCEDURE DIVISION for defining a class instance method on page 590
Coding interoperable data types in COBOL and Java on page 628
Invoking overridden superclass methods on page 604
Invoking factory or static methods on page 614
RELATED REFERENCES
INVOKE statement (Enterprise COBOL Language Reference)
See the example referenced below for a way to make an object-reference argument
conform to the type of a corresponding formal parameter by using the SET
statement or the REDEFINES clause.
If the target method is overloaded, the data types of the arguments are used to
select from among the methods that have the same name.
The data type of each argument must be one of the types that are interoperable
with Java.
RELATED TASKS
PROCEDURE DIVISION for defining a class instance method on page 590
Overloading an instance method on page 592
Coding interoperable data types in COBOL and Java on page 628
Passing data on page 481
RELATED REFERENCES
INVOKE statement (Enterprise COBOL Language Reference)
SET statement (Enterprise COBOL Language Reference)
REDEFINES clause (Enterprise COBOL Language Reference)
After the client assigns a value to data item aString (that is, a valid reference to an
object of class java.lang.String), anObj can be passed as the argument to M. For an
example of the use of the REDEFINES clause to obtain argument conformance, see
the example referenced below.
RELATED TASKS
Coding interoperable data types in COBOL and Java on page 628
PROCEDURE DIVISION for defining a class instance method on page 590
RELATED REFERENCES
INVOKE statement (Enterprise COBOL Language Reference)
SET statement (Enterprise COBOL Language Reference)
REDEFINES clause (Enterprise COBOL Language Reference)
The item that you specify in the RETURNING phrase of the INVOKE statement must
conform to the type returned by the target method, as shown in the table below.
Table 79. Conformance of the returned data item in a COBOL client
Programming
language of the Is the returned item Then code the DATA DIVISION definition of
target method an object reference? the returned item as:
COBOL No The same as the definition of the RETURNING
item in the target method
Java No Interoperable with the returned Java data
item
COBOL or Java Yes An object reference that is typed to the
same class as the object reference that is
returned by the target method
In all cases, the data type of the returned value must be one of the types that are
interoperable with Java.
RELATED TASKS
Coding interoperable data types in COBOL and Java on page 628
For example, suppose that the CheckingAccount class overrides the debit instance
method defined in its immediate superclass, Account. You could invoke the
Account debit method within a method in the CheckingAccount class by coding
this statement:
Invoke Super "debit" Using By Value amount.
You would define amount as PIC S9(9) BINARY to match the signature of the debit
methods.
The CheckingAccount class overrides the print method that is defined in the
Account class. Because the print method has no formal parameters, a method in
the CheckingAccount class could invoke the superclass print method with this
statement:
Invoke Super "print".
The keyword SUPER indicates that you want to invoke a superclass method rather
than a method in the current class. (SUPER is an implicit reference to the object used
in the invocation of the currently executing method.)
RELATED TASKS
Overriding an instance method on page 591
RELATED REFERENCES
INVOKE statement (Enterprise COBOL Language Reference)
When you code the INVOKE . . . NEW statement within a method, and the use of
the returned object reference is not limited to the duration of the method
invocation, you must convert the returned object reference to a global reference by
calling the JNI service NewGlobalRef:
Call NewGlobalRef using by value JNIEnvPtr object-reference
returning object-reference
If you do not call NewGlobalRef, the returned object reference is only a local
reference, which means that it is automatically freed after the method returns.
RELATED REFERENCES
INVOKE statement (Enterprise COBOL Language Reference)
The data type of each argument must be one of the types that are interoperable
with Java. To invoke the default (parameterless) constructor, omit the USING phrase.
For example, to create an instance of the Check class, initialize its instance data,
and obtain reference aCheck to the Check instance created, you could code this
statement in a COBOL client:
Invoke Check New
using by value aCheckingAccount, payee, 125
returning aCheck
RELATED TASKS
Invoking methods (INVOKE) on page 600
Coding interoperable data types in COBOL and Java on page 628
RELATED REFERENCES
VALUE clause (Enterprise COBOL Language Reference)
INVOKE statement (Enterprise COBOL Language Reference)
Thus the INVOKE . . . NEW statement is useful for instantiating COBOL classes that
have only simple instance data. For example, the following statement creates an
instance of the Account class, initializes the instance data as specified in VALUE
clauses in the WORKING-STORAGE SECTION of the OBJECT paragraph of the Account
class definition, and provides reference outAccount to the new instance:
Invoke Account New returning outAccount
To create an instance of the COBOL class and properly initialize it, the client
invokes the parameterized factory method, passing BY VALUE the required
arguments. The object reference returned to the client is a local reference. If the
client code is within a method, and the use of the returned object reference is not
limited to the duration of that method, the client code must convert the returned
object reference to a global reference by calling the JNI service NewGlobalRef.
RELATED TASKS
Accessing JNI services on page 623
Managing local and global references on page 626
Invoking methods (INVOKE) on page 600
Defining a factory section on page 611
RELATED REFERENCES
VALUE clause (Enterprise COBOL Language Reference)
INVOKE statement (Enterprise COBOL Language Reference)
There could be times, however, when you need to explicitly free local or global
references to objects within a native COBOL client in order to permit garbage
collection of the referenced objects to occur.
RELATED TASKS
Managing local and global references on page 626
(The Account class was shown in Example: defining a method on page 594.)
cbl dll,thread,pgmname(longmixed)
Identification division.
Program-id. "TestAccounts" recursive.
Environment division.
RELATED TASKS
Defining a factory method on page 612
Invoking factory or static methods on page 614
Chapter 16, Compiling, linking, and running OO applications, on page 291
Defining a subclass
You can make a class (called a subclass, derived class, or child class) a
specialization of another class (called a superclass, base class, or parent class).
A subclass inherits the methods and instance data of its superclasses, and is related
to its superclasses by an is-a relationship. For example, if subclass P inherits from
superclass Q, and subclass Q inherits from superclass S, then an instance of P is an
instance of Q and also (by transitivity) an instance of S. An instance of P inherits
the methods and data of Q and S.
Restriction: You cannot use multiple inheritance in your COBOL programs. Each
COBOL class that you define must have exactly one immediate superclass that is
implemented in Java or COBOL, and each class must be derived directly or
indirectly from java.lang.Object. The semantics of inheritance are as defined by
Java.
COBOL instance data is private. A subclass can access the instance data of a
COBOL superclass only if the superclass defines attribute (get or set) instance
methods for doing so.
RELATED TASKS
Defining a class on page 582
Overriding an instance method on page 591
Coding attribute (get and set) methods on page 593
Defining a subclass instance method on page 609
Defining a factory section on page 611
RELATED REFERENCES
The Java Language Specification (Inheritance, overriding, and hiding)
COBOL class definition structure (Enterprise COBOL Language Reference)
You must specify the name of the immediate superclass in the REPOSITORY
paragraph in the CONFIGURATION SECTION of the ENVIRONMENT DIVISION. You can
optionally associate the superclass name with the name of the class as it is known
externally. You can also specify the name of the subclass that you are defining
(here, CheckingAccount) in the REPOSITORY paragraph and associate it with its
corresponding external class-name.
RELATED TASKS
CLASS-ID paragraph for defining a class on page 584
Coding attribute (get and set) methods on page 593
REPOSITORY paragraph for defining a subclass
In the REPOSITORY paragraph, you must code an entry for each class-name that you
explicitly reference in the subclass definition. For example:
v A user-defined superclass from which the subclass that you are defining inherits
v The classes that you reference in methods within the subclass definition
The rules for coding REPOSITORY paragraph entries in a subclass are identical to
those for coding REPOSITORY paragraph entries in a class.
RELATED TASKS
REPOSITORY paragraph for defining a class on page 584
RELATED REFERENCES
REPOSITORY paragraph (Enterprise COBOL Language Reference)
For example, the definition of the instance data for the CheckingAccount subclass
of the Account class might look like this:
IDENTIFICATION DIVISION.
Object.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CheckFee pic S9(9) value 1.
. . .
End Object.
RELATED TASKS
WORKING-STORAGE SECTION for defining class instance data on page 586
The structure and syntax of a subclass instance method are identical to those of a
class instance method. Define subclass instance methods in the PROCEDURE DIVISION
of the OBJECT paragraph of the subclass definition.
The processCheck method invokes the Java instance methods getAmount and
getPayee of the Check class to get the check data. It invokes the credit and debit
instance methods inherited from the Account class to credit the payee and debit
the payer of the check.
The print method overrides the print instance method defined in the Account
class. It invokes the overridden print method to display account status, and also
displays the check fee. CheckFee is an instance data item defined in the subclass.
(The Account class was shown in Example: defining a method on page 594.)
RELATED TASKS
Chapter 16, Compiling, linking, and running OO applications, on page 291
Invoking methods (INVOKE) on page 600
Overriding an instance method on page 591
Invoking overridden superclass methods on page 604
COBOL factory data is equivalent to Java private static data. A single copy of the
data is instantiated for the class and is shared by all object instances of the class.
You most commonly use factory data when you want to gather data from all the
instances of a class. For example, you could define a factory data item to keep a
running total of the number of instances of the class that are created.
COBOL factory methods are equivalent to Java public static methods. The methods
are supported by the class independently of any object instance. You most
commonly use factory methods to customize object creation when you cannot use
VALUE clauses alone to initialize instance data.
By contrast, you use the OBJECT paragraph in a class definition to define data that
is created for each object instance of the class, and methods that are supported for
each object instance of the class.
RELATED TASKS
Defining a class on page 582
Instantiating COBOL classes on page 605
Wrapping procedure-oriented COBOL programs on page 620
Structuring OO applications on page 620
You can initialize simple factory data by using VALUE clauses as shown above.
COBOL factory data is equivalent to Java private static data. No other class or
subclass (nor instance method in the same class, if any) can reference COBOL
factory data directly. Factory data is global to all factory methods that the FACTORY
paragraph defines. If you want to make factory data accessible from outside the
FACTORY paragraph, define factory attribute (get or set) methods for doing so.
RELATED TASKS
Coding attribute (get and set) methods on page 593
Instantiating COBOL classes on page 605
You typically define factory methods for classes whose instances require complex
initialization, that is, to values that you cannot assign by using VALUE clauses alone.
Within a factory method you can invoke instance methods to initialize the instance
data. A factory method cannot directly access instance data.
You can code factory attribute (get and set) methods to make factory data
accessible from outside the FACTORY paragraph, for example, to make the data
accessible from instance methods in the same class or from a client program. For
example, the Account class could define a factory method getNumberOfAccounts
to return the current tally of the number of accounts.
You can use factory methods to wrap procedure-oriented COBOL programs so that
they are accessible from Java programs. You can code a factory method called main
In defining factory methods, you use the same syntax that you use to define
instance methods. A COBOL factory method definition consists of four divisions
(like a COBOL program), followed by an END METHOD marker:
Table 81. Structure of factory method definitions
Division Purpose Syntax
IDENTIFICATION Same as for a class Same as for a class instance method
(required) instance method (required)
ENVIRONMENT Same as for a class Same as for a class instance method
(optional) instance method
DATA (optional) Same as for a class Same as for a class instance method
instance method
PROCEDURE Same as for a class Same as for a class instance method
(optional) instance method
Within a class definition, you do not need to make each factory method-name
unique, but you do need to give each factory method a unique signature. You can
overload factory methods in exactly the same way that you overload instance
methods. For example, the CheckingAccount subclass provides two versions of the
factory method createCheckingAccount: one that initializes the account to have a
default balance of zero, and one that allows the opening balance to be passed in.
Clients can invoke either createCheckingAccount method by passing arguments
that match the signature of the intended method.
If you define a data item with the same name in both the DATA DIVISION of a
factory method and the DATA DIVISION of the FACTORY paragraph, a reference in the
method to that data-name refers only to the method data item. The method DATA
DIVISION takes precedence.
RELATED TASKS
Structuring OO applications on page 620
Wrapping procedure-oriented COBOL programs on page 620
Instantiating COBOL classes on page 605
Defining a class instance method on page 587
Coding attribute (get and set) methods on page 593
Overloading an instance method on page 592
Hiding a factory or static method
Invoking factory or static methods on page 614
Using object-oriented COBOL and Java under IMS on page 448
The presence or absence of a method return value and the data type of the return
value used in the PROCEDURE DIVISION RETURNING phrase (if any) must be identical
in the subclass factory method and the hidden superclass method.
RELATED TASKS
Coding interoperable data types in COBOL and Java on page 628
Overriding an instance method on page 591
Invoking methods (INVOKE) on page 600
RELATED REFERENCES
The Java Language Specification (Inheritance, overriding, and hiding)
The procedure division header (Enterprise COBOL Language Reference)
To invoke a factory method from within the same class in which you define the
factory method, you also use the class-name as the first operand in the INVOKE
statement.
If an invoked method is not supported in the class that you name in the INVOKE
statement, a severity-3 Language Environment condition is raised at run time
unless you code the ON EXCEPTION phrase in the INVOKE statement.
RELATED TASKS
Invoking methods (INVOKE) on page 600
RELATED REFERENCES
INVOKE statement (Enterprise COBOL Language Reference)
You can also find the complete source code for this example in the
cobol/demo/oosample subdirectory in the z/OS UNIX file system. Typically the
complete path for the source is /usr/lpp/cobol/demo/oosample. You can use the
makefile there to compile and link the code.
Account class
cbl dll,thread,pgmname(longmixed)
Identification Division.
Class-id. Account inherits Base.
Environment Division.
Configuration section.
Repository.
Class Base is "java.lang.Object"
Class Account is "Account".
*
Identification division.
Factory.
Data division.
Working-storage section.
01 NumberOfAccounts pic 9(6) value zero.
*
Procedure Division.
*
* createAccount method to create a new Account
* instance, then invoke the OBJECT paragraphs init
* method on the instance to initialize its instance data:
Identification Division.
Method-id. "createAccount".
Data division.
Linkage section.
01 inAccountNumber pic S9(6) binary.
01 outAccount object reference Account.
Check class
/**
* A Java class for check information
*/
public class Check {
private CheckingAccount payer;
private Account payee;
private int amount;
RELATED TASKS
Creating and initializing instances of classes on page 604
Defining a factory method on page 612
Invoking factory or static methods on page 614
Chapter 16, Compiling, linking, and running OO applications, on page 291
A Java program can invoke the factory method by using a static method invocation
expression, thus invoking the COBOL procedural program.
RELATED TASKS
Defining a class on page 582
Defining a factory section on page 611
Defining a factory method on page 612
Structuring OO applications
You can structure applications that use object-oriented COBOL syntax in one of
three ways.
RELATED TASKS
Chapter 16, Compiling, linking, and running OO applications, on page 291
Defining a factory method on page 612
Declaring arrays and strings for Java on page 629
Chapter 22, Developing COBOL programs for IMS, on page 443
In each case, main has no RETURNING phrase and has a single USING parameter, an
object reference to a class that is an array with elements of type java.lang.String.
You can run these applications by using the java command.
Displaying a message
cbl dll,thread
Identification Division.
Class-id. CBLmain inherits Base.
Environment Division.
Configuration section.
Repository.
Class Base is "java.lang.Object"
Class stringArray is "jobjectArray:java.lang.String"
Class CBLmain is "CBLmain".
*
Identification Division.
Factory.
Procedure division.
*
Identification Division.
Method-id. "main".
Data division.
Linkage section.
01 SA usage object reference stringArray.
Procedure division using by value SA.
Display " >> COBOL main method entered"
.
End method "main".
End factory.
End class CBLmain.
RELATED TASKS
Chapter 16, Compiling, linking, and running OO applications, on page 291
Defining a factory method on page 612
Chapter 31, Communicating with Java methods, on page 623
You can invoke methods that are written in Java from COBOL programs, and you
can invoke methods that are written in COBOL from Java programs. You need to
code COBOL object-oriented language for basic Java object capabilities. For
additional Java capabilities, you can call JNI services.
RELATED TASKS
Chapter 16, Compiling, linking, and running OO applications, on page 291
Accessing JNI services
Sharing data with Java on page 627
Chapter 30, Writing object-oriented programs, on page 579
Chapter 27, Preparing COBOL programs for multithreading, on page 507
RELATED REFERENCES
JDK 5.0 Documentation
You obtain the JNI environment structure by two levels of indirection from the JNI
environment pointer, as the following illustration shows:
JNIEnvPtr
pointer pointer JNI function
...
JNI function
Use the special register JNIEnvPtr to reference the JNI environment pointer to
obtain the address for the JNI environment structure. JNIEnvPtr is implicitly
After you code the statements above, you can access the JNI callable services with
CALL statements that reference the function pointers. You can pass the JNIEnvPtr
special register as the first argument to the services that require the environment
pointer, as shown in the following example:
01 InputArrayObj usage object reference jlongArray.
01 ArrayLen pic S9(9) comp-5.
. . .
Call GetArrayLength using by value JNIEnvPtr InputArrayObj
returning ArrayLen
Restriction: The JNI environment pointer is thread specific. Do not pass it from
one thread to another.
RELATED TASKS
Managing local and global references on page 626
Handling Java exceptions
Coding interoperable data types in COBOL and Java on page 628
Defining a client on page 596
RELATED REFERENCES
Appendix E, JNI.cpy copybook, on page 721
The Java Native Interface
The Java virtual machine (JVM) does not recognize and process the thrown
exception until the method that contains the call has completed and returned to
the JVM.
Catching an exception: After you invoke a method that might have thrown a Java
exception, you can do these steps:
1. Test whether an exception occurred.
2. If an exception occurred, process the exception.
3. Clear the exception, if clearing is appropriate.
To do error analysis, use the methods supported by the exception object that is
returned. This object is an instance of the java.lang.Throwable class.
You can pass either a local reference or a global reference as an object reference
argument to a JNI service.
You can code methods to return either local or global references as RETURNING
values. However, in either case, the reference that is received by the invoking
program is a local reference.
You can pass either local or global references as USING arguments in a method
invocation. However, in either case, the reference that is received by the invoked
method is a local reference.
Local references are valid only in the thread in which you create them. Do not pass
them from one thread to another.
RELATED TASKS
Accessing JNI services on page 623
Deleting, saving, and freeing local references
Use a SET statement to convert a local reference to a global reference if you want to
save a reference in any of these data items:
v An object instance variable
v A factory variable
v A data item in the WORKING-STORAGE SECTION of a method
Otherwise, an error occurs. These storage areas persist when a method returns;
therefore a local reference is no longer valid.
Use the following callable services to manage local references and global
references.
Table 82. JNI services for local and global references
Service Input arguments Return value Purpose
NewGlobalRef v The JNI environment The global reference, or To create a new global
pointer NULL if the system is out of reference to the object that
memory the input object reference
v A local or global object
refers to
reference
DeleteGlobalRef v The JNI environment None To delete a global reference
pointer to the object that the input
object reference refers to
v A global object reference
DeleteLocalRef v The JNI environment None To delete a local reference
pointer to the object that the input
object reference refers to
v A local object reference
RELATED TASKS
Accessing JNI services on page 623
RELATED TASKS
Coding interoperable data types in COBOL and Java
Declaring arrays and strings for Java on page 629
Manipulating Java arrays on page 630
Manipulating Java strings on page 632
Invoking methods (INVOKE) on page 600
Chapter 25, Sharing data, on page 481
1. You must distinguish boolean from byte, because they each correspond to PIC X. PIC X
is interpreted as boolean only if you define an argument or a parameter with the two
condition-names as shown. Otherwise, a PIC X data item is interpreted as the Java byte
type.
2. Java floating-point data is formatted according to the IEEE Standard for Binary Floating
Point Arithmetic. Enterprise COBOL, however, uses hexadecimal floating-point
representation. When you pass floating-point arguments by using an INVOKE statement,
or you receive floating-point data from a Java method, the arguments and data are
automatically converted as needed.
To use one of these classes for interoperability with Java, you must code an entry
in the REPOSITORY paragraph. For example:
Configuration section.
Repository.
Class jbooleanArray is "jbooleanArray".
The REPOSITORY paragraph entry for an object array type must specify an external
class-name in one of these forms:
"jobjectArray"
"jobjectArray:external-classname-2"
In the first case, the REPOSITORY entry specifies an array class in which the elements
of the array are objects of type java.lang.Object. In the second case, the REPOSITORY
entry specifies an array class in which the elements of the array are objects of type
external-classname-2. Code a colon as the separator between the specification of the
jobjectArray type and the external class-name of the array elements.
The following example shows both cases. In the example, oa defines an array of
elements that are objects of type java.lang.Object. aDepartment defines an array of
elements that are objects of type com.acme.Employee.
Environment Division.
Configuration Section.
Repository.
Class jobjectArray is "jobjectArray"
Class Employee is "com.acme.Employee"
Class Department is "jobjectArray:com.acme.Employee".
. . .
Linkage section.
01 oa usage object reference jobjectArray.
01 aDepartment usage object reference Department.
. . .
Procedure division using by value aDepartment.
. . .
Examples: COBOL applications that run using the java command on page 621
RELATED TASKS
REPOSITORY paragraph for defining a class on page 584
For example, the following code specifies a structure to receive 500 or fewer
integer values from a jlongArray object:
01 longArray.
02 X pic S9(10) comp-5 occurs 1 to 500 times depending on N.
To operate on objects of the special Java-array classes, call the services that the JNI
provides. You can use services to access and set individual elements of an array
and for the following purposes, using the services cited:
Table 86. JNI array services
Service Input arguments Return value Purpose
GetArrayLength v The JNI environment pointer The array length as To get the number of
a binary fullword elements in a Java
v The array object reference
integer array object
NewBooleanArray, v The JNI environment pointer The array object To create a new Java
NewByteArray, NewCharArray, reference, or NULL if array object
v The number of elements in the
NewShortArray, NewIntArray, the array cannot be
array, as a binary fullword
NewLongArray constructed
integer
GetBooleanArrayElements, v The JNI environment pointer A pointer to the To extract the array
GetByteArrayElements, storage buffer elements from a Java
v The array object reference
GetCharArrayElements, array into a storage
GetShortArrayElements, v A pointer to a boolean item. If buffer. The services
GetIntArrayElements, the pointer is not null, the return a pointer to the
GetLongArrayElements boolean item is set to true if a storage buffer, which
copy of the array elements was you can use as the
made. If a copy was made, the address of a COBOL
corresponding group data item
ReleasexxxArrayElements service defined in the LINKAGE
must be called if changes are to SECTION.
be written back to the array
object.
Examples: COBOL applications that run using the java command on page 621
Example: processing a Java integer array
RELATED TASKS
Coding interoperable data types in COBOL and Java on page 628
Declaring arrays and strings for Java on page 629
Accessing JNI services on page 623
Call GetArrayLength
using by value JNIEnvPtr inIntArrayObj
returning intArrayLen
Call GetIntArrayElements
using by value JNIEnvPtr inIntArrayObj 0
returning IntArrayPtr
Set address of intArrayGroup to intArrayPtr
Call ReleaseIntArrayElements
using by value JNIEnvPtr inIntArrayObj intArrayPtr 0.
End method "ProcessArray".
End Object.
End class OOARRAY.
Services for Unicode: Use the following standard services to convert between
jstring object references and COBOL USAGE NATIONAL data items. Use these services
for applications that you intend to be portable between the workstation and the
mainframe. Access these services by using function pointers in the
JNINativeInterface environment structure.
Table 87. Services that convert between jstring references and national data
Service Input arguments Return value
1
NewString v The JNI environment pointer jstring object reference
v A pointer to a Unicode string, such
as a COBOL national data item
v The number of characters in the
string; binary fullword
Services for EBCDIC: Use the following z/OS services, an extension of the JNI, to
convert between jstring object references and COBOL alphanumeric data (PIC
X(n)).
Table 88. Services that convert between jstring references and alphanumeric data
Service Input arguments Return value
NewStringPlatform v The JNI environment pointer Return code as a binary fullword
integer:
v Pointer to the null-terminated EBCDIC
character string that you want to convert 0 Success.
to a jstring object
-1 Malformed input or illegal
v Pointer to the jstring object reference in input character.
which you want the result
-2 Unsupported encoding; the
v Pointer to the Java encoding name for the
jstring object reference pointer
string, represented as a null-terminated
is set to NULL.
EBCDIC character string1
GetStringPlatformLength v The JNI environment pointer Return code as a binary fullword
integer:
v jstring object reference for which you want
the length 0 Success.
v Pointer to a binary fullword integer for the -1 Malformed input or illegal
result input character.
v Pointer to the Java encoding name for the
-2 Unsupported encoding; the
string, represented as a null-terminated
jstring object reference pointer
EBCDIC character string1
is set to NULL.
1. If the pointer is NULL, the encoding from the Java file.encoding property is used.
These EBCDIC services are packaged as a DLL that is part of your IBM Java
Software Development Kit. For details about the services, see jni_convert.h in the
IBM Java Software Development Kit.
Use CALL literal statements to call the services. The calls are resolved through the
libjvm.x DLL side file, which you must include in the link step of any COBOL
program that uses object-oriented language.
For example, the following code creates a Java String object from the EBCDIC
string 'MyConverter'. (This code fragment is from the J2EE client program, which
is shown in full in Example: J2EE client written in COBOL.)
Move z"MyConverter" to stringBuf
Call "NewStringPlatform"
using by value JNIEnvPtr
address of stringBuf
address of jstring1
0
returning rc
If the EBCDIC services are the only JNI services that you call from a COBOL
program, you do not need to copy the JNI.cpy copybook. You also do not need to
establish addressability with the JNI environment pointer.
Services for UTF-8: The Java Native Interface also provides services for conversion
between jstring object references and UTF-8 strings. These services are not
recommended for use in COBOL programs due to the difficulty in handling UTF-8
character strings on the z/OS platform.
RELATED TASKS
Accessing JNI services on page 623
Coding interoperable data types in COBOL and Java on page 628
Declaring arrays and strings for Java on page 629
Using national data (Unicode) in COBOL on page 130
Chapter 16, Compiling, linking, and running OO applications, on page 291
You can find an alternate version of the Java enterprise bean and client code in The
Java EE 5 Tutorial, referenced below.
*****************************************************************
* Create JNDI naming context. *
*****************************************************************
Invoke InitialContext New returning initialCtx
Perform JavaExceptionCheck
*****************************************************************
* Use the lookup method to obtain a reference to the home *
* object bound to the name "MyConverter". (This is the JNDI *
* name specified when deploying the J2EE application.) *
*****************************************************************
Invoke initialCtx "lookup" using by value jstring1
returning obj
Perform JavaExceptionCheck
*****************************************************************
* Narrow the home object to be of type ConverterHome. *
* First obtain class object for the ConverterHome class, by *
* passing the null-terminated ASCII string "ConverterHome" to *
* the FindClass API. Then use this class object as the *
* argument to the static method "narrow". *
*****************************************************************
Move z"ConverterHome" to stringBuf
Call "__etoa"
using by value address of stringBuf
returning len
If len = -1 then
Display "Error occurred on ASCII conversion"
Stop run
End-if
Call FindClass
using by value JNIEnvPtr
address of stringBuf
returning classObj
If classObj = null
Display "Error occurred locating ConverterHome class"
Stop run
End-if
Invoke PortableRemoteObject "narrow"
using by value obj
classObj
returning homeObject
Perform JavaExceptionCheck
*****************************************************************
* Create the ConverterEJB instance and obtain local object *
* reference for its remote interface *
*****************************************************************
Invoke home "create" returning currencyConverter
Perform JavaExceptionCheck
*****************************************************************
* Invoke business methods *
*****************************************************************
Invoke currencyConverter "dollarToYen"
using by value +100.00E+0
returning amount
Display amount
Display amount
*****************************************************************
* Remove the object and return. *
*****************************************************************
Invoke currencyConverter "remove"
Perform JavaExceptionCheck
Goback
.
*****************************************************************
* Check for thrown Java exceptions *
*****************************************************************
JavaExceptionCheck.
Call ExceptionOccurred using by value JNIEnvPtr
returning ex
If ex not = null then
Call ExceptionClear using by value JNIEnvPtr
Display "Caught an unexpected exception"
Invoke ex "printStackTrace"
Stop run
End-if
.
End program "ConverterClient".
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import Converter;
import ConverterHome;
ConverterHome home =
(ConverterHome)PortableRemoteObject.narrow(objref,
ConverterHome.class);
currencyConverter.remove();
RELATED TASKS
Chapter 16, Compiling, linking, and running OO applications, on page 291
WebSphere for z/OS: Applications
Java 2 Enterprise Edition Developer's Guide (Getting Started)
The Java EE 5 Tutorial (Getting Started with Enterprise Beans)
Because the checkpoint/restart functions cause a lot of extra processing, use them
only when you anticipate interruptions caused by machine malfunctions, input or
output errors, or intentional operator intervention.
| The checkpoint routine starts from the COBOL program object that contains your
program. While your program is running, the checkpoint routine creates records at
points that you have designated using the COBOL RERUN clause. A checkpoint
record contains a snapshot of the information in the registers and main storage
when the program reached the checkpoint.
The restart routine restarts an interrupted program. You can perform a restart at
any time after the program was interrupted: either immediately (automatic restart),
or later (deferred restart).
RELATED TASKS
Setting checkpoints
Restarting programs on page 644
Resubmitting jobs for restart on page 647
z/OS DFSMS: Checkpoint/Restart
RELATED REFERENCES
DD statements for defining checkpoint data sets on page 643
Messages generated during checkpoint on page 644
Formats for requesting deferred restart on page 646
Setting checkpoints
To set checkpoints, use job control statements and use the RERUN clause in the
ENVIRONMENT DIVISION. Associate each RERUN clause with a particular COBOL file.
You can write checkpoint records from several COBOL files to one checkpoint data
set, but you must use a separate data set exclusively for checkpoint records. You
cannot embed checkpoint records in one of your program data sets.
Restrictions: A checkpoint data set must have sequential organization. You cannot
write checkpoints in VSAM data sets or in data sets that are allocated to
extended-format QSAM data sets. Also, a checkpoint cannot be taken if any
program in the run unit has an extended-format QSAM data set that is open.
| You must use the multiple checkpoint method for complete compliance with the 85
| COBOL Standard.
RELATED TASKS
Using checkpoint/restart with DFSORT on page 236
Designing checkpoints
Testing for a successful checkpoint
RELATED REFERENCES
DD statements for defining checkpoint data sets on page 643
Designing checkpoints
Design your checkpoints at critical points in your program so that data can be
easily reconstructed. Do not change the contents of files between the time of a
checkpoint and the time of the restart.
In a program that uses disk files, design the program so that you can identify
previously processed records. For example, consider a disk file that contains loan
records that are periodically updated for interest due. If a checkpoint is taken,
records are updated, and then the program is interrupted, you would want to test
that the records that are updated after the last checkpoint are not updated again
when the program is restarted. To do this, set up a date field in each record, and
update the field each time the record is processed. Then, after the restart, test the
field to determine whether the record was already processed.
For efficient repositioning of a print file, take checkpoints on the file only after
printing the last line of a page.
RELATED REFERENCES
z/OS DFSMS: Checkpoint/Restart (Return codes)
For tape:
//ddname DD DSNAME=data-set-name,
// [VOLUME=SER=volser,]UNIT=device-type,
// DISP=({NEW|MOD},PASS)
The control program assigns checkid as an eight-character string. The first character
is the letter C, followed by a decimal number that indicates the checkpoint. For
example, the following message indicates the fourth checkpoint taken in the job
step:
checkid C0000004
Restarting programs
The system restart routine retrieves the information recorded in a checkpoint
record, restores the contents of main storage and all registers, and restarts the
program.
The RD parameter of the job control language determines the type of restart. You
can use the RD parameter on either the JOB or the EXEC statement. If coded on the
JOB statement, the parameter overrides any RD parameters on the EXEC statement.
Data sets that have the SYSOUT parameter coded in their DD statements are handled
in various ways depending on the type of restart.
RELATED TASKS
Using checkpoint/restart with DFSORT on page 236
Requesting automatic restart
Requesting deferred restart
Whenever automatic restart is to occur, the system repositions all devices except
unit-record devices.
If you omit the RD parameter, the CHKPT macro instruction remains active, and
checkpoints can be taken during processing. If an interrupt occurs after the first
checkpoint, automatic restart will occur.
When a deferred restart has been successfully completed, the system displays a
message on the console stating that the job has been restarted. Control is then
given to your program.
If you want deferred restart, code the RD parameter as RD=NR. This form of the
parameter suppresses automatic restart but allows a checkpoint record to be
written provided that a RERUN clause was coded.
Request a deferred restart by using the RESTART parameter on the JOB card and a
SYSCHK DD statement to identify the checkpoint data set. If a SYSCHK DD statement is
present in a job and the JOB statement does not contain the RESTART parameter, the
RELATED REFERENCES
Formats for requesting deferred restart
If you want a data set to be deleted at the end of a job step, give it a conditional
disposition of PASS or KEEP (rather than DELETE). This disposition allows the data
set to be available if an interruption forces a restart. If you want to restart a job at
the beginning of a step, you must first discard any data set created (defined as NEW
in a DD statement) in the previous run, or change the DD statement to mark the data
set as OLD.
The system automatically repositions input data sets that are on tape or disk.
The DDCKPNT DD statement defines a checkpoint data set. For this step, after a RERUN
clause is performed, only automatic checkpoint restart can occur unless a CHKPT
cancel is issued.
If a checkpoint is taken in a job that is running when V=R is specified, the job
cannot be restarted until adequate nonpageable dynamic storage becomes
available.
You can write programs that result in better generated code sequences and use
system services more efficiently. These additional aspects can affect performance:
v Coding techniques: Use a programming style that enables the optimizer to
choose efficient data types and handle tables efficiently.
v Optimization: You can optimize code by using the OPTIMIZE compiler option.
v Compiler options and USE FOR DEBUGGING ON ALL PROCEDURES: Some compiler
options and language affect program efficiency.
v Runtime environment: Consider your choice of runtime options.
v Running under CICS, IMS, or VSAM: Heeding various tips can help make these
programs run more efficiently.
RELATED CONCEPTS
Optimization on page 657
Enterprise COBOL Version 4 Performance Tuning
RELATED TASKS
Using an optimal programming style
Choosing efficient data types on page 652
Handling tables efficiently on page 654
Optimizing your code on page 657
Choosing compiler features to enhance performance on page 658
Running efficiently with CICS, IMS, or VSAM on page 662
Language Environment Programming Guide (Specifying runtime options)
RELATED REFERENCES
Performance-related compiler options on page 659
Language Environment Programming Guide (Storage performance considerations)
Factoring expressions
By factoring expressions in your programs, you can potentially eliminate a lot of
unnecessary computation.
For example, the first block of code below is more efficient than the second block
of code:
MOVE ZERO TO TOTAL
PERFORM VARYING I FROM 1 BY 1 UNTIL I = 10
COMPUTE TOTAL = TOTAL + ITEM(I)
END-PERFORM
COMPUTE TOTAL = TOTAL * DISCOUNT
MOVE ZERO TO TOTAL
PERFORM VARYING I FROM 1 BY 1 UNTIL I = 10
COMPUTE TOTAL = TOTAL + ITEM(I) * DISCOUNT
END-PERFORM
RELATED CONCEPTS
Formats for numeric data on page 47
RELATED TASKS
Choosing efficient computational data items
Using consistent data types
Making arithmetic expressions efficient on page 654
Making exponentiations efficient on page 654
To produce the most efficient code for a BINARY data item, ensure that it has:
v A sign (an S in its PICTURE clause)
v Eight or fewer digits
For a data item that is larger than eight digits or is used with DISPLAY or NATIONAL
data items, use PACKED-DECIMAL. The code generated for PACKED-DECIMAL data items
can be as fast as that for BINARY data items in some cases, especially if the
statement is complicated or specifies rounding.
To produce the most efficient code for a PACKED-DECIMAL data item, ensure that it
has:
v A sign (an S in its PICTURE clause)
v An odd number of digits (9s in the PICTURE clause), so that it occupies an exact
number of bytes without a half byte left over
v 15 or fewer digits in the PICTURE specification on ARCH(7) machines. If a
PACKED-DECIMAL data item has more than 31 digits, library routines are used. For
a PACKED-DECIMAL data item with 16-31 digits on ARCH (8) or higher level
machines, the compiler uses instructions that are more efficient than library calls,
but not as fast as if the data item has 15 or fewer digits.
You can largely avoid conversions by using consistent data types and by giving
both operands the same usage and also appropriate PICTURE specifications. That is,
For example, the first statement below is computed more quickly and accurately
than the second statement:
COMPUTE fixed-point1 = fixed-point2 ** 100000.E+00
| At present, the primary reason to use the VOLATILE clause is for data items that are
| set or referenced inside an LE condition handler but are defined outside the LE
| condition handler program. The VOLATILE clause guarantees that such items are
| handled correctly by the optimizer. For more information on when to use VOLATILE,
| see VOLATILE clause in the Enterprise COBOL Language Reference.
The following two guidelines affect your choice of how to refer to table elements:
v Use indexing rather than subscripting.
Whether you use indexes or subscripts, the following coding guidelines can help
you get better performance:
v Specify the element length so that it matches that of related tables.
When you index or subscript tables, it is most efficient if all the tables have the
same element length. That way, the stride for the last dimension of the tables is
the same, and the optimizer can reuse the rightmost index or subscript
computed for one table. If both the element lengths and the number of
occurrences in each dimension are equal, then the strides for dimensions other
than the last are also equal, resulting in greater commonality between their
subscript computations. The optimizer can then reuse indexes or subscripts other
than the rightmost.
v Avoid errors in references by coding index and subscript checks into your
program.
If you need to validate indexes and subscripts, it might be faster to code your
own checks than to use the SSRANGE compiler option.
You can also improve the efficiency of tables by using these guidelines:
v Use binary data items for all subscripts.
When you use subscripts to address a table, use a BINARY signed data item with
eight or fewer digits. In some cases, using four or fewer digits for the data item
might also improve processing time.
v Use binary data items for variable-length table items.
For tables with variable-length items, you can improve the code for OCCURS
DEPENDING ON (ODO). To avoid unnecessary conversions each time the
variable-length items are referenced, specify BINARY for OCCURS . . . DEPENDING
ON objects.
v Use fixed-length data items whenever possible.
Copying variable-length data items into a fixed-length data item before a period
of high-frequency use can reduce some of the overhead associated with using
variable-length data items.
v Organize tables according to the type of search method used.
If the table is searched sequentially, put the data values most likely to satisfy the
search criteria at the beginning of the table. If the table is searched using a
binary search algorithm, put the data values in the table sorted alphabetically on
the search key field.
RELATED CONCEPTS
Optimization of table references on page 656
RELATED REFERENCES
SSRANGE on page 357
For the table element reference ELEMENT(S1 S2 S3), where S1, S2, and S3 are
subscripts, the compiler evaluates the following expression:
comp_s1 * d1 + comp_s2 * d2 + comp_s3 * d3 + base_address
Here comp_s1 is the value of S1 after conversion to binary, comp-s2 is the value of
S2 after conversion to binary, and so on. The strides for each dimension are d1, d2,
and d3. The stride of a given dimension is the distance in bytes between table
elements whose occurrence numbers in that dimension differ by 1 and whose other
occurrence numbers are equal. For example, the stride d2 of the second dimension
in the above example is the distance in bytes between ELEMENT(S1 1 S3) and
ELEMENT(S1 2 S3).
The direct indexing in ELEMENT (I5, J3, K2) requires this preprocessing:
SET I5 TO I
SET I5 UP BY 5
SET J3 TO J
SET J3 DOWN BY 3
SET K2 TO K
SET K2 UP BY 2
This processing makes the direct indexing less efficient than the relative indexing
in ELEMENT (I + 5, J - 3, K + 2).
RELATED CONCEPTS
Optimization on page 657
For unit-testing a program, you will probably find it easier to debug code that has
not been optimized.
To see how the optimizer works on a program, compile it with different levels of
optimization and compare the generated code. (Use the LIST compiler option to
request the assembler listing of the generated code.)
RELATED CONCEPTS
Optimization
RELATED REFERENCES
LIST on page 333
OPTIMIZE on page 343
Optimization
To improve the efficiency of the generated code, you can use the OPTIMIZE(1) or
OPTIMIZE(2) compiler option.
Program size: If several CALL statements call contained programs and these
programs replace each such statement, the containing program can become large.
The optimizer then chooses the next best optimization for the CALL statement.
RELATED CONCEPTS
Optimization of table references on page 656
PERFORM procedure integration
RELATED REFERENCES
OPTIMIZE on page 343
You might have a customized system that requires certain options for optimum
performance. Do these steps:
1. To see what your system defaults are, get a short listing for any program and
review the listed option settings.
2. Determine which options are fixed as nonoverridable at your installation by
checking with your system programmer.
3. For the options not fixed at installation, select performance-related options for
compiling your programs.
Important: Confer with your system programmer about how to tune COBOL
programs. Doing so will ensure that the options you choose are appropriate for
programs at your site.
Another compiler feature to consider is the USE FOR DEBUGGING ON ALL PROCEDURES
statement. It can greatly affect the compiler optimizer. The ON ALL PROCEDURES
option generates extra code at each transfer to a procedure name. Although very
useful for debugging, it can make the program significantly larger and inhibit
optimization substantially.
Although COBOL allows segmentation language, you will not improve storage
allocation by using it, because COBOL does not perform overlay.
RELATED TASKS
Optimizing your code on page 657
Getting listings on page 387
RELATED REFERENCES
Performance-related compiler options
RELATED CONCEPTS
Optimization on page 657
Storage and its addressability on page 39
RELATED TASKS
Generating a list of compiler messages on page 280
Evaluating performance on page 662
Optimizing buffer and device space on page 10
Choosing compiler features to enhance performance on page 658
Improving sort performance with FASTSRT on page 231
Using striped extended-format QSAM data sets on page 180
Handling tables efficiently on page 654
RELATED REFERENCES
Sign representation of zoned and packed-decimal data on page 53
Allocation of buffers for QSAM files on page 181
Chapter 17, Compiler options, on page 301
Conflicting compiler options on page 304
In thinking about the performance tradeoff, be sure you understand the function of
each option as well as the performance advantages and disadvantages. You might
prefer function over increased performance in many instances.
Table 90. Performance-tuning worksheet
Compiler option Consideration Yes?
ARCH Do you use the highest architecture level possible for all
environments in which your programs will run? For
example, if the lowest level architecture you have
including your disaster recovery machines is z10, are
you using ARCH(8)?
AWO Do you use the AWO option when possible?
BLOCK0 Do you use BLOCK0 for QSAM files?
DATA When you use QSAM striped data sets, do you use the
| RENT and DATA(31) options? Is the program object AMODE
31? Are you running with ALL31(ON)?
DYNAM Can you use NODYNAM? Consider the performance
tradeoffs.
FASTSRT When you use direct work files for the sort work files,
did you use the FASTSRT option?
NUMPROC Do you use NUMPROC(PFD) when possible?
OPTIMIZE Do you use a non-zero OPTIMIZE level for production
runs?
SSRANGE Do you use NOSSRANGE for production runs?
TEST Do you use NOTEST or TEST(NOEJPD) for production runs?
TRUNC Do you use TRUNC(OPT) when possible?
| ZONEDATA Do you use ZONEDATA(PFD) when possible?
RELATED CONCEPTS
Storage and its addressability on page 39
RELATED TASKS
Choosing compiler features to enhance performance on page 658
RELATED REFERENCES
Performance-related compiler options on page 659
CICS: If your application runs under CICS, convert EXEC CICS LINK commands to
COBOL CALL statements to improve transaction response time.
For better system performance, use the RENT compiler option and preload the
applications and library routines when possible. You can also use the Language
Environment library routine retention (LRR) function to improve performance in
IMS/TM regions.
VSAM: When you use VSAM files, increase the number of data buffers for
sequential access or index buffers for random access. Also, select a control interval
size (CISZ) that is appropriate for the application. A smaller CISZ results in faster
retrieval for random processing at the expense of inserts. A larger CISZ is more
efficient for sequential processing.
For better performance, access the records sequentially and avoid using multiple
alternate indexes when possible. If you use alternate indexes, access method
services builds them more efficiently than the AIXBLD runtime option.
RELATED TASKS
Coding COBOL programs to run under CICS on page 419
Chapter 22, Developing COBOL programs for IMS, on page 443
Improving VSAM performance on page 209
Language Environment Customization
RELATED REFERENCES
Language Environment Programming Guide (Specifying runtime options)
For more information, see Performance considerations of static and dynamic calls
on page 471.
RELATED CONCEPTS
Performance considerations of static and dynamic calls on page 471
| To sort a table, you can use the format 2 SORT statement to simplify coding. It
| provides a much simpler way compared to the format 1 SORT statement.
COBOL provides various capabilities for manipulating strings and numbers. These
capabilities can help you simplify your coding.
The Language Environment date and time callable services store dates as fullword
binary integers and store time stamps as long (64-bit) floating-point values. These
formats let you do arithmetic calculations on date and time values simply and
efficiently. You do not need to write special subroutines that use services outside
the language library to perform such calculations.
RELATED TASKS
Using numeric intrinsic functions on page 57
Using math-oriented callable services on page 58
Using date callable services on page 60
Eliminating repetitive coding
Converting data items (intrinsic functions) on page 116
Evaluating data items (intrinsic functions) on page 119
Using Language Environment callable services on page 667
| RELATED REFERENCES
| Using the format 2 SORT statement to sort a table on page 671
|
Eliminating repetitive coding
To include stored source statements in a program, use the COPY statement in any
program division and at any code sequence level. You can nest COPY statements to
any depth.
To specify more than one copy library, use either multiple system definitions or a
combination of multiple definitions and the IN/OF phrase (IN/OF library-name):
MVS batch
Use JCL to concatenate data sets in your SYSLIB DD statement.
Alternatively, define multiple DD statements and use the IN/OF phrase of
the COPY statement.
For example:
COPY MEMBER1 OF COPYLIB
COPY and debugging line: In order for the text copied to be treated as debug lines,
for example, as if there were a D inserted in column 7, put the D on the first line of
the COPY statement. A COPY statement cannot itself be a debugging line; if it
contains a D, and WITH DEBUGGING mode is not specified, the COPY statement is
nevertheless processed.
RELATED REFERENCES
Chapter 18, Compiler-directing statements, on page 373
You can retrieve the text-name CFILEA by using the COPY statement in a source
program as follows:
FD FILEA
COPY CFILEA.
The library entry is copied into your program, and the resulting program listing
looks like this:
FD FILEA
COPY CFILEA.
C BLOCK CONTAINS 20 RECORDS
C RECORD CONTAINS 120 CHARACTERS
C LABEL RECORDS ARE STANDARD
C DATA RECORD IS FILE-OUT.
C 01 FILE-OUT PIC X(120).
In the compiler source listing, the COPY statement prints on a separate line. C
precedes copied lines.
Assume that a copybook with the text-name DOWORK is stored by using the
following statements:
The statements that are in the DOWORK procedure will follow paragraph-name.
If you use the EXIT compiler option to provide a LIBEXIT module, your results
might differ from those shown here.
Note: To save compile time, you might group related items in a copybook, but not
necessarily have a single large copybook with unrelated items in it.
RELATED TASKS
Eliminating repetitive coding on page 665
RELATED REFERENCES
Chapter 18, Compiler-directing statements, on page 373
RELATED CONCEPTS
Sample list of Language Environment callable services
RELATED TASKS
Using numeric intrinsic functions on page 57
Using math-oriented callable services on page 58
Using date callable services on page 60
Calling Language Environment services on page 669
Using procedure and function pointers on page 477
RELATED REFERENCES
Language Environment Programming Reference
You can choose whether to specify the feedback code parameter. If you specify it,
the value returned in feedback-code indicates whether the service completed
successfully. If you specify OMITTED instead of the feedback code, and the service is
not successful, a Language Environment condition is automatically signaled to the
Language Environment condition manager. You can handle such a condition by
recovery logic implemented in a user-written condition handler, or let the default
Language Environment processing for unhandled conditions occur. In either case,
you avoid having to write logic to check the feedback code explicitly after each
call.
RELATED CONCEPTS
Language Environment Programming Guide (General callable services)
RELATED REFERENCES
Language Environment Programming Reference (General callable services)
CALL statement (Enterprise COBOL Language Reference)
Using CEEDAYS and CEEDATE reduces the coding that would be required
without Language Environment.
ID DIVISION.
PROGRAM-ID. HOHOHO.
************************************************************
* FUNCTION: DISPLAY TODAYS DATE IN THE FOLLOWING FORMAT: *
* WWWWWWWWW, MMMMMMMM DD, YYYY *
* *
* For example: TUESDAY, SEPTEMBER 15, 2009 *
* *
************************************************************
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CHRDATE.
05 CHRDATE-LENGTH PIC S9(4) COMP VALUE 10.
05 CHRDATE-STRING PIC X(10).
01 PICSTR.
05 PICSTR-LENGTH PIC S9(4) COMP.
05 PICSTR-STRING PIC X(80).
*
77 LILIAN PIC S9(9) COMP.
77 FORMATTED-DATE PIC X(80).
*
PROCEDURE DIVISION.
***************************************************************
* USE LANGUAGE ENVIRONMENT CALLABLE SERVICES TO PRINT OUT *
* TODAYS DATE FROM COBOL ACCEPT STATEMENT. *
***************************************************************
ACCEPT CHRDATE-STRING FROM DATE.
*
MOVE "YYMMDD" TO PICSTR-STRING.
MOVE 6 TO PICSTR-LENGTH.
CALL "CEEDAYS" USING CHRDATE , PICSTR , LILIAN , OMITTED.
*
MOVE " WWWWWWWWWZ, MMMMMMMMMZ DD, YYYY " TO PICSTR-STRING.
MOVE 50 TO PICSTR-LENGTH.
CALL "CEEDATE" USING LILIAN , PICSTR , FORMATTED-DATE ,
OMITTED.
*
DISPLAY "******************************".
The precision of intermediate results depends on whether you compile using the
default option ARITH(COMPAT) (referred to as compatibility mode) or using
ARITH(EXTEND) (referred to as extended mode).
RELATED REFERENCES
Fixed-point data and intermediate results on page 677
Floating-point data and intermediate results on page 682
Arithmetic expressions in nonarithmetic statements on page 683
ARITH on page 309
RELATED TASKS
Using arithmetic expressions on page 57
RELATED REFERENCES
Terminology used for intermediate results on page 676
You must define the operands of any arithmetic statements with enough decimal
places to obtain the accuracy you want in the final result.
The following table shows the number of places the compiler carries for
fixed-point intermediate results of arithmetic operations that involve addition,
subtraction, multiplication, or division in compatibility mode (that is, when the
default compiler option ARITH(COMPAT) is in effect):
Value of i +
Value of i + d Value of d dmax Number of places carried for ir
<30 or =30 Any value Any value i integer and d decimal places
The following table shows the number of places the compiler carries for
fixed-point intermediate results of arithmetic operations that involve addition,
subtraction, multiplication, or division in extended mode (that is, when the compiler
option ARITH(EXTEND) is in effect):
Value of i +
Value of i + d Value of d dmax Number of places carried for ir
<31 or =31 Any value Any value i integer and d decimal places
>31 <dmax or =dmax Any value 31-d integer and d decimal places
>dmax <31 or =31 i integer and 31-i decimal places
>31 31-dmax integer and dmax decimal
places
Exponentiation
Exponentiation is represented by the expression op1 ** op2. Based on the
characteristics of op2, the compiler handles exponentiation of fixed-point numbers
in one of three ways:
v When op2 is expressed with decimals, floating-point instructions are used.
v When op2 is an integral literal or constant, the value d is computed as
d = d1 * |op2|
and the value i is computed based on the characteristics of op1:
When op1 is a data-name or variable,
i = i1 * |op2|
When op1 is a literal or constant, i is set equal to the number of integers in
the value of op1 ** |op2|.
In compatibility mode (compilation using ARITH(COMPAT)), the compiler having
calculated i and d takes the action indicated in the table below to handle the
intermediate results ir of the exponentiation.
If op2 is negative, the value of 1 is then divided by the result produced by the
preliminary computation. The values of i and d that are used are calculated
following the division rules for fixed-point data already shown above.
v When op2 is an integral data-name or variable, dmax decimal places and 30-dmax
(compatibility mode) or 31-dmax (extended mode) integer places are used. op1 is
multiplied by itself (|op2| - 1) times for nonzero op2.
If op2 is equal to 0, the result is 1. Division-by-0 and exponentiation SIZE ERROR
conditions apply.
Fixed-point exponents with more than nine significant digits are always truncated
to nine digits. If the exponent is a literal or constant, an E-level compiler diagnostic
message is issued; otherwise, an informational message is issued at run time.
RELATED REFERENCES
Terminology used for intermediate results on page 676
Truncated intermediate results on page 680
Binary data and intermediate results on page 680
Floating-point data and intermediate results on page 682
Intrinsic functions evaluated in fixed-point arithmetic on page 680
ARITH on page 309
SIZE ERROR phrases (Enterprise COBOL Language Reference)
If B is equal to 4, the result is computed as shown below. The values of i and d that
are used are calculated according to the multiplication rules for fixed-point data
and intermediate results (referred to below).
1. Multiply A by A yielding ir1.
2. Multiply ir1 by A yielding ir2.
3. Multiply ir2 by A yielding ir3.
4. Move ir3 to ir4.
ir4 has dmax decimal places. Because B is positive, ir4 is moved to Y. If B were
equal to -4, however, an additional fifth step would be performed:
5. Divide ir4 into 1 yielding ir5.
If you want to avoid the truncation of intermediate results that can occur in
fixed-point calculations, use floating-point operands (COMP-1 or COMP-2) instead.
RELATED CONCEPTS
Formats for numeric data on page 47
RELATED REFERENCES
Fixed-point data and intermediate results on page 677
ARITH on page 309
Binary operands are most efficient when intermediate results will not exceed nine
digits.
RELATED REFERENCES
Fixed-point data and intermediate results on page 677
ARITH on page 309
Integer functions
Integer intrinsic functions return an integer; thus their outer-dmax is always zero.
For those integer functions whose arguments must all be integers, the inner-dmax is
thus also always zero.
The following table summarizes the inner-dmax and the precision of the function
result.
Mixed functions
A mixed intrinsic function is a function whose result type depends on the type of
its arguments. A mixed function is fixed point if all of its arguments are numeric
and none of its arguments is floating point. (If any argument of a mixed function is
floating point, the function is evaluated with floating-point instructions and returns
a floating-point result.) When a mixed function is evaluated with fixed-point
arithmetic, the result is integer if all of the arguments are integer; otherwise, the
result is fixed point.
For the mixed functions MAX, MIN, RANGE, REM, and SUM, the outer-dmax is always
equal to the inner-dmax (and both are thus zero if all the arguments are integer). To
determine the precision of the result returned for these functions, apply the rules
for fixed-point arithmetic and intermediate results (as referred to below) to each
step in the algorithm.
MAX
1. Assign the first argument to the function result.
2. For each remaining argument, do the following steps:
a. Compare the algebraic value of the function result with the
argument.
b. Assign the greater of the two to the function result.
MIN
1. Assign the first argument to the function result.
2. For each remaining argument, do the following steps:
a. Compare the algebraic value of the function result with the
argument.
b. Assign the lesser of the two to the function result.
RANGE
1. Use the steps for MAX to select the maximum argument.
2. Use the steps for MIN to select the minimum argument.
3. Subtract the minimum argument from the maximum.
4. Assign the difference to the function result.
RELATED REFERENCES
Terminology used for intermediate results on page 676
Fixed-point data and intermediate results on page 677
Floating-point data and intermediate results
ARITH on page 309
Mixed functions that have at least one floating-point argument are evaluated using
floating-point arithmetic.
RELATED REFERENCES
Terminology used for intermediate results on page 676
ARITH on page 309
In such statements, the rules for intermediate results with fixed-point data and for
intermediate results with floating-point data apply, with the following changes:
v Abbreviated IF statements are handled as though the statements were not
abbreviated.
v In an explicit relation condition where at least one of the comparands is an
arithmetic expression, dmax is the maximum number of decimal places for any
operand of either comparand, excluding divisors and exponents. The rules for
floating-point arithmetic apply if any of the following conditions is true:
Any operand in either comparand is COMP-1, COMP-2, external floating point,
or a floating-point literal.
An exponent contains decimal places.
An exponent is an expression that contains an exponentiation or division
operator, and dmax is greater than zero.
For example:
IF operand-1 = expression-1 THEN . . .
If operand-1 is a data-name defined to be COMP-2, the rules for floating-point
arithmetic apply to expression-1 even if it contains only fixed-point operands,
because it is being compared to a floating-point operand.
RELATED CONCEPTS
Fixed-point contrasted with floating-point arithmetic on page 62
RELATED REFERENCES
Terminology used for intermediate results on page 676
Fixed-point data and intermediate results on page 677
Floating-point data and intermediate results on page 682
IF statement (Enterprise COBOL Language Reference)
EVALUATE statement (Enterprise COBOL Language Reference)
Conditional expressions (Enterprise COBOL Language Reference)
The service routines do not support a code-page argument and are not sensitive to
the code page specified by the CODEPAGE compiler option. The DBCS compiler option
does not affect their operation.
RELATED TASKS
Converting to or from national (Unicode) representation on page 137
Processing alphanumeric data items that contain DBCS data on page 152
RELATED REFERENCES
DBCS notation
Alphanumeric to DBCS data conversion (IGZCA2D)
DBCS to alphanumeric data conversion (IGZCD2A) on page 688
CODEPAGE on page 313
DBCS notation
The symbols shown below are used in the DBCS data conversion examples to
describe DBCS items.
Symbols Meaning
< and > Shift-out (SO) and shift-in (SI), respectively
D0, D1, D2, . . ., Dn Any DBCS character except for double-byte EBCDIC
characters that correspond to single-byte EBCDIC
characters
.A, .B, .C, . . . Any double-byte EBCDIC character that corresponds
to a single-byte EBCDIC character. The period (.)
represents the value X'42'.
A single letter, such as A, B, or s Any single-byte EBCDIC character
IGZCA2D syntax
To use the IGZCA2D service routine, pass the following four parameters to the
routine by using the CALL statement:
Usage notes
v You can pass parameter-1, parameter-3, and parameter-4 to the routine BY
REFERENCE or BY CONTENT, but you must pass parameter-2 BY REFERENCE.
v The compiler does not perform syntax checking on these parameters. Ensure that
the parameters are correctly set and passed in the CALL statement to the
conversion routine. Otherwise, results are unpredictable.
v When creating parameter-2 from parameter-1, IGZCA2D makes these changes:
Removes the shift codes, leaving the DBCS data unchanged
Converts the single-byte (nonspace) EBCDIC character X'nn' to a character
represented by X'42nn'
Converts the single-byte space (X'40') to DBCS space (X'4040'), instead of
X'4240'
v IGZCA2D does not change the contents of parameter-1, parameter-3, or
parameter-4.
v The valid range for the contents of parameter-3 and for the contents of
parameter-4 is 1 to 134,217,727.
RELATED REFERENCES
IGZCA2D return codes
Example: IGZCA2D
This example CALL statement converts the alphanumeric data in alpha-item to
DBCS data. The results of the conversion are placed in dbcs-item.
CALL "IGZCA2D" USING BY REFERENCE alpha-item dbcs-item
BY CONTENT LENGTH OF alpha-item LENGTH OF dbcs-item
Suppose the contents of alpha-item and dbcs-item and the lengths before the
conversion are:
alpha-item = AB<D1D2D3>CD
dbcs-item = D4D5D6D7D8D9D0
LENGTH OF alpha-item = 12
LENGTH OF dbcs-item = 14
RELATED REFERENCES
DBCS notation on page 685
IGZCD2A syntax
To use the IGZCD2A service routine, pass the following four parameters to the
routine using the CALL statement:
parameter-1
The sending field for the conversion, handled as a DBCS data item.
parameter-2
The receiving field for the conversion, handled as an alphanumeric data
item.
parameter-3
The number of bytes in parameter-1 to be converted.
It can be the LENGTH OF special register of parameter-1, or a 4-byte USAGE IS
BINARY data item containing the number of bytes of parameter-1 to be
converted.
parameter-4
The number of bytes in parameter-2 that will receive the converted data.
It can be the LENGTH OF special register of parameter-2, or a 4-byte USAGE IS
BINARY data item containing the number of bytes of parameter-2 to receive
the converted data. Shift codes count as 1 byte each.
Usage notes
v You can pass parameter-1, parameter-3, and parameter-4 to the routine BY
REFERENCE or BY CONTENT, but you must pass parameter-2 BY REFERENCE.
v The compiler does not perform syntax checking on these parameters. Ensure that
the parameters are correctly set and passed to the conversion routine. Otherwise,
results are unpredictable.
v When creating parameter-2 from parameter-1, IGZCD2A makes these changes:
Inserts shift codes around DBCS characters that do not correspond to
single-byte EBCDIC characters
Converts DBCS characters to single-byte characters when the DBCS characters
correspond to single-byte EBCDIC characters
Converts the DBCS space (X'4040') to a single-byte space (X'40')
v IGZCD2A does not change the contents of parameter-1, parameter-3, or
parameter-4.
v If the converted data contains double-byte characters, shift codes are counted in
the length of parameter-2.
v The valid range for the contents of parameter-3 and for the contents of
parameter-4 is 1 to 134,217,727.
RELATED REFERENCES
IGZCD2A return codes on page 689
Example: IGZCD2A
This example CALL statement converts the DBCS data in dbcs-item to alphanumeric
data with double-byte characters. The results of the conversion are placed in
alpha-item.
CALL "IGZCD2A" USING BY REFERENCE dbcs-item alpha-item
BY CONTENT LENGTH OF dbcs-item LENGTH OF alpha-item
Suppose the contents of dbcs-item and alpha-item and the lengths before the
conversion are:
dbcs-item = .A.BD1D2D3.C.D
alpha-item = ssssssssssss
LENGTH OF dbcs-item = 14
LENGTH OF alpha-item = 12
RELATED REFERENCES
DBCS notation on page 685
RELATED REFERENCES
| XML PARSE exceptions with XMLPARSE(XMLSS) in effect
| XML PARSE exceptions with XMLPARSE(COMPAT) in effect on page 693
XML GENERATE exceptions on page 700
XML specification
The return code and reason code are each a halfword binary value. The exception
code is the concatenation of those two values: the return code in the high-order
halfword, and the reason code in the low-order halfword.
The return codes and reason codes are documented as hexadecimal values in the
z/OS XML System Services User's Guide and Reference, referenced below, and in
Table 95 on page 692 below.
After most exception events, the parser does not continue processing; the value in
XML-CODE at the end of the XML PARSE statement is the original exception code set
by the parser.
When the processing procedure returns to the parser after the exception event,
control transfers to the statement specified in the ON EXCEPTION phrase, or to the
end of the XML PARSE statement if you did not code an ON EXCEPTION phrase.
Validation exceptions:
If you code an XML PARSE statement that contains the VALIDATING phrase, and the
z/OS XML System Services parser determines that the document is not valid, the
parser generates return code 24 (hexadecimal 18, XRC_NOT_VALID).
Some exceptions are unique to Enterprise COBOL and thus are not documented in
the z/OS XML System Services User's Guide and Reference, for example, errors that
occur during XML schema retrieval. The return code for exceptions with reason
codes in the hexadecimal range 800 to 899 is 4 (hexadecimal 0004, XRC_WARNING).
For other exceptions, the return code is 16 (hexadecimal 0010, XRC_FATAL). The
exception code (the value in special register XML-CODE), is formed from this return
code concatenated with one of the reason codes shown in the following table.
For any of the reason codes except 900, correct the error and then retry your
program.
RELATED CONCEPTS
XML-CODE on page 525
XML events on page 524
RELATED TASKS
Handling XML PARSE exceptions on page 542
| RELATED REFERENCES
| XML PARSE exceptions that allow continuation
| XML PARSE exceptions that do not allow continuation on page 697
| The parser can continue processing if the exception code, which is in special
| register XML-CODE, is within one of the following ranges:
| v 1 - 99
| v 100,001 - 165,535
| The following table describes each exception, and identifies the actions that the
| parser takes if you request that it continue after the exception. Some of the
| descriptions use the following terms:
| v Actual document encoding
| v Document encoding declaration
| For definitions of the terms, see the related concept about XML input document
| encoding.
| Table 96. XML PARSE exceptions that allow continuation
| Exception
| code
| (decimal) Description Parser action on continuation
| 1 The parser found an invalid The parser continues detecting errors until
| character while scanning white it reaches the end of the document or
| space outside element content. encounters an error that does not allow
| continuation. The parser does not signal
| For further information about any further normal events, except for the
| white space, see the related END-OF-DOCUMENT event.
| concept about XML input
| document encoding.
| 2 The parser found an invalid The parser continues detecting errors until
| start of a processing it reaches the end of the document or
| instruction, element, comment, encounters an error that does not allow
| or document type declaration continuation. The parser does not signal
| outside element content. any further normal events, except for the
| END-OF-DOCUMENT event.
| RELATED TASKS
| Handling XML PARSE exceptions on page 542
| RELATED REFERENCES
| XMLPARSE on page 368 (compiler option)
| No further events are returned from the parser for any of these exceptions even if
| the processing procedure sets XML-CODE to zero before passing control back to the
| parser. The parser transfers control to the statement in the ON EXCEPTION phrase, if
| specified, otherwise to the end of the XML PARSE statement.
| Table 97. XML PARSE exceptions that do not allow continuation (for XMLPARSE(COMPAT))
| Exception
| code (decimal) Description
| 100 The parser reached the end of the document while scanning the start of
| the XML declaration.
| 101 The parser reached the end of the document while looking for the end of
| the XML declaration.
| 102 The parser reached the end of the document while looking for the root
| element.
| 103 The parser reached the end of the document while looking for the version
| information in the XML declaration.
| 104 The parser reached the end of the document while looking for the version
| information value in the XML declaration.
| 106 The parser reached the end of the document while looking for the
| encoding declaration value in the XML declaration.
| 108 The parser reached the end of the document while looking for the
| standalone declaration value in the XML declaration.
| 109 The parser reached the end of the document while scanning an attribute
| name.
| 110 The parser reached the end of the document while scanning an attribute
| value.
| 111 The parser reached the end of the document while scanning a character
| reference or entity reference in an attribute value.
| 112 The parser reached the end of the document while scanning an empty
| element tag.
| 113 The parser reached the end of the document while scanning the root
| element name.
| 114 The parser reached the end of the document while scanning an element
| name.
| 115 The parser reached the end of the document while scanning character data
| in element content.
| RELATED CONCEPTS
| XML-CODE on page 525
RELATED TASKS
Handling XML GENERATE exceptions on page 567
RELATED TASKS
Using the user-exit work area
Calling from exit modules on page 702
Using the EXIT compiler option with CICS, SQL and
SQLIMS statements
RELATED REFERENCES
EXIT on page 324
Processing of INEXIT on page 702
Processing of LIBEXIT on page 703
Processing of PRTEXIT on page 706
Processing of ADEXIT on page 707
Processing of MSGEXIT on page 709
Error handling for exit modules on page 717
The user-exit work area consists of 6 fullwords that reside on a fullword boundary.
These fullwords are initialized to binary zeros before the first exit routine is
invoked. The address of the work area is passed to the exit module in a parameter
list. After initialization, the compiler makes no further reference to the work area.
The words in the user-exit work area are used by the individual exit modules as
shown in the following table.
Table 99. Layout of the user-exit work area
Word number Used by module:
1 INEXIT
2 LIBEXIT
3 PRTEXIT
4 ADEXIT
5 (Reserved)
6 MSGEXIT
RELATED REFERENCES
Processing of INEXIT on page 702
Processing of LIBEXIT on page 703
Exit modules must have RMODE attribute 24 and AMODE attribute ANY.
RELATED CONCEPTS
Storage and its addressability on page 39
Processing of INEXIT
| The INEXIT exit module is used to read source code from a user-supplied program
| object in place of SYSIN.
Table 100. INEXIT processing
Action by compiler Action by exit module
Loads the exit module (mod1) during
initialization
Calls the exit module with an OPEN Prepares its source for processing. Passes the
operation code (op code) status of the OPEN request back to the
compiler.
Calls the exit module with a GET op code Returns either the address and length of the
when a source statement is needed next statement or the end-of-data indication
(if no more source statements exist)
Calls the exit module with a CLOSE op code Releases any resources that are related to its
when the end-of-data is presented output
INEXIT parameters
The compiler uses 10 parameters, passed by reference, to communicate with the
exit module. The return code, data length, and data parameters are set by the exit
module for return to the compiler; the other items are passed from the compiler to
the exit module.
1=INEXIT
2 Operation code Halfword that indicates the type of operation:
v 0=OPEN
v 1=CLOSE
v 2=GET
3 Return code Fullword, set by the exit module, that indicates the
success of the requested operation:
v 0=Operation was successful
v 4=End-of-data
v 12=Operation failed
4 User-exit work area Six-fullword work area provided by the compiler for
use by the user-exit module.
RELATED TASKS
Using the user-exit work area on page 701
Calling from exit modules on page 702
Using the EXIT compiler option with CICS, SQL and
SQLIMS statements
Processing of LIBEXIT
The LIBEXIT exit module is used in place of the SYSLIB, or library-name, data set.
Calls are made to the module by the compiler to obtain copybooks whenever COPY
or BASIS statements are encountered.
Table 102. LIBEXIT processing
Action by compiler Action by exit module
Loads the exit module (mod2)
during initialization
You cannot make recursive calls to text-name. That is, a copybook can be named
only once in a set of nested COPY statements until the end-of-data for that
copybook is reached.
The following table shows how the processing of LIBEXIT changes when there are
one or more valid COPY statements that are not nested.
Table 103. LIBEXIT processing with nonnested COPY statements
Action by compiler Action by exit module
Loads the exit module (mod2)
during initialization
Calls the exit module with an Prepares the specified library-name for processing. Passes
OPEN operation code (op the status of the OPEN request to the compiler.
code)
Calls the exit module with a Establishes positioning at the requested text-name (or
FIND op code if the basis-name) in the specified library-name; this place
library-name was successfully becomes the active copybook. Passes an appropriate
opened return code to the compiler when positioning is complete.
Calls the exit module with a Reestablishes positioning at the previous active copybook.
FIND op code if the Passes an appropriate return code to the compiler when
library-name was successfully positioning is complete.
opened
Calls the exit module with a Passes the compiler the same record as was passed
GET op code. Verifies that the previously from this copybook. After verification, passes
same record was passed. either the length and address of the record to be copied
from the active copybook or the end-of-data indicator.
Calls the exit module with a Releases any resources that are related to its input
CLOSE op code when the
end-of-data is presented
LIBEXIT parameters
The compiler uses 10 parameters, passed by reference, to communicate with the
exit module. The return code, data length, and data parameters are set by the exit
module for return to the compiler; the other items are passed from the compiler to
the exit module.
Table 105. LIBEXIT parameters
Parameter
number Parameter item Description of item
1 User-exit type Halfword that identifies which user exit is to perform
the operation.
2=LIBEXIT
2 Operation code Halfword that indicates the type of operation:
v 0=OPEN
v 1=CLOSE
v 2=GET
v 4=FIND
3 Return code Fullword, set by the exit module, that indicates the
success of the requested operation:
v 0=Operation was successful
v 4=End-of-data
v 12=Operation failed
4 User-exit work area Six-fullword work area provided by the compiler for
use by the user-exit module.
RELATED TASKS
Using the user-exit work area on page 701
Calling from exit modules on page 702
Using the EXIT compiler option with CICS, SQL and
SQLIMS statements
Processing of PRTEXIT
The PRTEXIT exit module is used in place of the SYSPRINT data set.
Table 106. PRTEXIT processing
Action by compiler Action by exit module
Loads the exit module (mod3) during
initialization
Calls the exit module with an OPEN Prepares its output destination for
operation code (op code) processing. Passes the status of the OPEN
request to the compiler.
Calls the exit modules with a PUT op code Passes the status of the PUT request to the
when a line is to be printed, supplying the compiler by a return code. The first byte of
address and length of the record that is to be the record to be printed contains an ANSI
printed printer control character.
Calls the exit module with a CLOSE op code Releases any resources that are related to its
when the end-of-data is presented output destination
3=PRTEXIT
2 Operation code Halfword that indicates the type of operation:
v 0=OPEN
v 1=CLOSE
v 3=PUT
3 Return code Fullword, set by the exit module, that indicates the
success of the requested operation:
v 0=Operation was successful
v 12=Operation failed
4 User-exit work area Six-fullword work area provided by the compiler for
use by the user-exit module.
RELATED TASKS
Using the user-exit work area on page 701
Calling from exit modules on page 702
Using the EXIT compiler option with CICS, SQL and
SQLIMS statements
Processing of ADEXIT
The ADEXIT module is called for each SYSADATA record immediately after the
record has been written out to the file.
To use an ADEXIT module, you must compile using the ADATA option to produce
SYSADATA output, and code the SYSADATA DD statement.
ADEXIT parameters
The compiler uses 10 parameters, passed by reference, to communicate with the
exit module. The return code, data length, and data buffer parameters are set by
the exit module for return to the compiler; the other items are passed from the
compiler to the exit module.
Table 109. ADEXIT parameters
Parameter
number Parameter item Description of item
1 User-exit type Halfword that identifies which user exit is to perform
the operation.
4=ADEXIT
2 Operation code Halfword that indicates the type of operation:
v 0=OPEN
v 1=CLOSE
v 3=PUT
3 Return code Fullword, set by the exit module, that indicates the
success of the requested operation:
v 0=Operation was successful
v 12=Operation failed
4 User-exit work area Six-fullword work area provided by the compiler for
use by the user-exit module.
RELATED TASKS
Using the user-exit work area on page 701
Calling from exit modules on page 702
Using the EXIT compiler option with CICS, SQL and
SQLIMS statements
RELATED REFERENCES
ADATA on page 305
Processing of MSGEXIT
The MSGEXIT module is used to customize compiler diagnostic messages and FIPS
messages. The module can customize a message either by changing its severity or
suppressing it.
A MSGEXIT summary at the end of the compiler listing shows how many
messages were changed in severity and how many messages were suppressed.
Table 110. MSGEXIT processing
Action by compiler Action by exit module
Loads the exit module (mod5)
during initialization
Calls the exit module with an Optionally processes str5 and passes the status of the
OPEN operation code (op code) OPEN request to the compiler
Calls the exit module with a One of the following actions:
MSGSEV operation code (op code) v Indicates no customization of the message (by
when the compiler is about to issue setting return code to 0)
a diagnostic message or FIPS
v Specifies a new severity for (or suppression of) the
message
message, and sets return code to 4
v Indicates that the operation failed (by setting
return code to 12)
Calls the exit module with a Optionally frees storage and passes the status of the
CLOSE op code CLOSE request to the compiler
Deletes the exit module (mod5)
during compiler termination
MSGEXIT parameters
The compiler uses 10 parameters, passed by reference, to communicate with the
exit module. The return code and user-requested severity parameters are set by the
exit module for return to the compiler; the other items are passed from the
compiler to the exit module.
6=MSGEXIT
2 Operation code Halfword that indicates the type of operation:
v 0=OPEN
v 1=CLOSE
v 5=MSGSEV: customize message severity
3 Return code Fullword, set by the exit module, that indicates the
success of the requested operation.
RELATED TASKS
Using the user-exit work area on page 701
Calling from exit modules on page 702
Customizing compiler-message severities
Using the EXIT compiler option with CICS, SQL and
SQLIMS statements
RELATED TASKS
Generating a list of compiler messages on page 280
RELATED REFERENCES
Severity codes for compiler diagnostic messages on page 282
Customizable compiler-message severities
Effect of message customization on compilation return code on page 712
Error handling for exit modules on page 717
The possible severity codes for compiler diagnostic messages are described in the
related reference about severity codes.
You can change the severity of a compiler message in the following ways:
v Severity-I and severity-W compiler diagnostic messages, and FIPS messages, can
be changed to have any severity from I through S.
Assigning a severity to a FIPS message converts the FIPS message to a
diagnostic message of the assigned severity.
As examples, you can:
Lower an optimizer warning to severity I.
Disallow REDEFINING a smaller item with a larger item by raising the severity
of message 1154.
Disallow complex OCCURS DEPENDING ON by changing FIPS message 8235 from
a category-E FIPS message to a severity-S compiler diagnostic message.
v Severity-E messages can be raised to severity S, but not lowered to severity I or
W, because an error condition has occurred in the program.
v Severity-S and severity-U messages cannot be changed to have a different
severity.
RELATED REFERENCES
Severity codes for compiler diagnostic messages on page 282
FLAGSTD on page 328
Effect of message customization on compilation return code
If you change the severity of a message, the return code from the compilation
might also be changed. For example, if a compilation produces one diagnostic
If you suppress a message, the return code from the compilation is no longer
affected by the severity of that message. For example, if a compilation produces
one diagnostic message, and it is a severity-W message, the compilation return
code would normally be 4. But if the MSGEXIT module suppresses that message,
then the return code from compilation would be 0.
RELATED TASKS
Customizing compiler-message severities on page 710
RELATED REFERENCES
Severity codes for compiler diagnostic messages on page 282
For helpful tips about using a message-exit module, see the comments within the
code.
*****************************************************************
* IGYMSGXT - Sample COBOL program for MSGEXIT *
*****************************************************************
* Function: This is a SAMPLE user exit for the MSGEXIT *
* suboption of the EXIT compiler option. This exit *
* can be used to customize the severity of or *
* suppress compiler diagnostic messages and FIPS *
* messages. This example program includes several *
* sample customizations to show how customizations *
* are done. If you do not want the sample *
* customizations then either delete the unwanted *
* lines of code or comment them out with a comment *
* indicator in column 7 (*). *
* *
*---------------------------------------------------------------*
* *
* USAGE NOTE: To use this user exit program, make the *
| * link-edited program object available to your *
* compiles that will use the MSGEXIT suboption of *
* the EXIT compiler option. Also, the name should *
* be changed, since IBM recommends that you avoid *
* having programs with names that start with IGY. *
* Sample steps to take: *
* 1) Make your customizations *
* 2) Change program name (E.G. MSGEXT) *
* 3) Compile and link into a data set *
* 4) Include that data set in your compile *
* JCL concatenation for the compile step. *
* If you link into USER.COBOLLIB: *
* *
* //COBOL.STEPLIB DD DSNAME=SYS1.SIGYCOMP,DISP=SHR *
* // DD DSNAME=USER.COBOLLIB,DISP=SHR *
* *
*****************************************************************
Id Division.
Program-Id. IGYMSGXT.
Data Division.
Working-Storage Section.
*****************************************************************
* *
* Definition of the User-Exit Parameter List, which is *
* passed from the COBOL compiler to the user-exit module. *
* *
*****************************************************************
Linkage Section.
01 EXIT-TYPE PIC 9(4) COMP.
01 EXIT-OPERATION PIC 9(4) COMP.
01 EXIT-RETURNCODE PIC 9(9) COMP.
01 EXIT-WORK-AREA.
02 EXIT-WORK-AREA-PTR OCCURS 6 POINTER.
01 EXIT-DUMMY POINTER.
01 EXIT-MESSAGE-PARMS.
02 EXIT-MESSAGE-NUM PIC 9(4) COMP.
02 EXIT-DEFAULT-SEV PIC 9(4) COMP.
02 EXIT-USER-SEV PIC S9(4) COMP.
01 EXIT-STRING.
02 EXIT-STR-LEN PIC 9(4) COMP.
02 EXIT-STR-TXT PIC X(64).
*****************************************************************
*****************************************************************
* *
* Begin PROCEDURE DIVISION *
* *
* Check parameters and perform the operation requested. *
* *
*****************************************************************
*****************************************************************
Compute EXIT-RETURNCODE = 0
Evaluate TRUE
*****************************************************************
* Handle a bad invocation of this exit by the compiler. *
* This could happen if this routine was used for one of the *
* other EXITs, such as INEXIT, PRTEXIT or LIBEXIT. *
*****************************************************************
When EXIT-TYPE Not = 6
Move EXIT-TYPE to EXIT-TYPEN
Display **** Invalid exit routine identifier
Display **** EXIT TYPE = EXIT-TYPE
Compute EXIT-RETURNCODE = 16
*****************************************************************
* Handle the OPEN call to this exit by the compiler *
* Display the exit string (str5 in syntax diagram) from *
* the EXIT(MSGEXIT(str5,mod5)) option specification. *
*****************************************************************
*****************************************************************
* Handle the CLOSE call to this exit by the compiler *
*****************************************************************
When EXIT-OPERATION = 1
* Display Closing MSGEXIT
GOBACK
*****************************************************************
* Handle the customize message severity call to this exit *
* Display information about every customized severity. *
*****************************************************************
When EXIT-OPERATION = 5
* Display MSGEXIT called with MSGSEV
If EXIT-MESSAGE-NUM < 8000 Then
Perform Error-Messages-Severity
Else
Perform FIPS-Messages-Severity
End-If
* If EXIT-RETURNCODE = 4 Then
* Display >>>> Customizing message EXIT=MESSAGE-NUM
* with new severity EXIT-USER-SEV <<<<
* If EXIT-MESSAGE-NUM > 8000 Then
* Display FIPS sev = EXIT-DEFAULT-SEV-FIPS <<<<
* End-If
* End-If
*****************************************************************
* Handle a bad invocation of this exit by the compiler *
* The compiler should not invoke this exit with EXIT-TYPE = 6 *
* and an opcode other than 0, 1, or 5. This should not happen *
* and IBM service should be contacted if it does. *
*****************************************************************
When Other
Display **** Invalid MSGEXIT routine operation
Display **** EXIT OPCODE = EXIT-OPERATION
Compute EXIT-RETURNCODE = 16
End-Evaluate
Goback.
*****************************************************************
* ERROR MESSAGE PROCESSOR *
*****************************************************************
Error-Messages-Severity.
Evaluate EXIT-MESSAGE-NUM
*****************************************************************
* Change severity of message 1154(W) to 12 (S)
* This is the case of redefining a large item
* with a smaller item, IBM Req # MR0904063236
*****************************************************************
When(1154)
Compute EXIT-USER-SEV = 12
*****************************************************************
* Message severity Not customized
*****************************************************************
When Other
Compute EXIT-RETURNCODE = 0
End-Evaluate
.
*****************************************************************
* FIPS MESSAGE PROCESSOR *
*****************************************************************
Fips-Messages-Severity.
EVALUATE EXIT-DEFAULT-SEV
When 81
MOVE D To EXIT-DEFAULT-SEV-FIPS
When 82
MOVE E To EXIT-DEFAULT-SEV-FIPS
When 83
MOVE H To EXIT-DEFAULT-SEV-FIPS
When 84
MOVE I To EXIT-DEFAULT-SEV-FIPS
When 85
MOVE N To EXIT-DEFAULT-SEV-FIPS
When 86
MOVE O To EXIT-DEFAULT-SEV-FIPS
When 87
MOVE Q To EXIT-DEFAULT-SEV-FIPS
When 88
MOVE S To EXIT-DEFAULT-SEV-FIPS
When Other
Continue
End-Evaluate
*****************************************************************
* Example of using FIPS category to force coding
* restrictions. This is not a recommendation!
* Change severity of all OBSOLETE item FIPS
* messages to S
*****************************************************************
* If EXIT-DEFAULT-SEV-FIPS = O Then
* Display >>>> Default customizing FIPS category
* EXIT-DEFAULT-SEV-FIPS msg EXIT-MESSAGE-NUM <<<<
* Compute EXIT-USER-SEV = 12
* End-If
*****************************************************************
* Change severity of message 8193(E) to 0(I)
* 8193 = GOBACK
*****************************************************************
When(8193)
Compute EXIT-USER-SEV = 0
*****************************************************************
* Change severity of message 8235(E) to 8 (Error)
* to disallow Complex Occurs Depending On
* 8235 = Complex Occurs Depending On
*****************************************************************
When(8235)
Compute EXIT-USER-SEV = 08
*****************************************************************
* Change severity of message 8270(O) to -1 (Suppress)
* 8270 = SERVICE LABEL
*****************************************************************
When(8270)
Compute EXIT-USER-SEV = -1
*****************************************************************
* Message severity Not customized
*****************************************************************
When Other
* For the default set O to S case...
* If EXIT-USER-SEV = 12 Then
* Compute EXIT-RETURNCODE = 4
* Else
Compute EXIT-RETURNCODE = 0
* End-If
End-Evaluate
.
END PROGRAM IGYMSGXT.
Message IGYSI5207-U is written to the operator if a LOAD request for any of the
user exits fails:
An error occurred while attempting to load user exit exit-name.
Message IGYSI5208-U is written to the operator if an OPEN request for any of the
user exits fails:
An error occurred while attempting to open user exit exit-name.
MSGEXIT failures:
In the MSGEXIT messages, the two characters PP indicate the phase of the
compiler that issued the message that resulted in a call to the MSGEXIT module.
RELATED TASKS
Customizing compiler-message severities on page 710
Using the EXIT compiler option with CICS, SQL and SQLIMS
statements
When you compile using suboptions of the EXIT compiler option, and your
program contains EXEC CICS, EXEC SQL, or EXEC SQLIMS statements, the actions that
you can take in the exit modules depend on whether you use the separate CICS
translator and DB2 precompiler, or the integrated CICS translator and DB2
coprocessor.
If the program contains EXEC SQLIMS statements, the actions that you can take in
the exit modules are the actions that are listed for the integrated translator.
The following table shows which actions you can take in the exit modules
depending on whether you use the integrated or separate translators.
RELATED CONCEPTS
Integrated CICS translator on page 425
DB2 coprocessor on page 431
RELATED TASKS
Compiling with the CICS option on page 423
Compiling with the SQL option on page 435
RELATED REFERENCES
Processing of INEXIT on page 702
JNI.cpy contains sample COBOL data definitions that correspond to the Java JNI
types, and contains JNINativeInterface, the JNI environment structure that contains
function pointers for accessing the JNI callable services.
JNI.cpy is in the z/OS UNIX file system in the include subdirectory of the COBOL
install directory (typically /usr/lpp/cobol/include). JNI.cpy is analogous to the
header file jni.h that C programmers use to access the JNI.
*****************************************************************
* COBOL declarations for Java native method interoperation *
* *
* To use the Java Native Interface callable services from a *
* COBOL program: *
* 1) Use a COPY statement to include this file into the *
* the Linkage Section of the program, e.g. *
* Linkage Section. *
* Copy JNI *
* 2) Code the following statements at the beginning of the *
* Procedure Division: *
* Set address of JNIEnv to JNIEnvPtr *
* Set address of JNINativeInterface to JNIEnv *
*****************************************************************
*
* Sample JNI type definitions in COBOL
*
*01 jboolean1 pic X.
* 88 jboolean1-true value X01 through XFF.
* 88 jboolean1-false value X00.
*
*01 jbyte1 pic X.
*
*01 jchar1 pic N usage national.
*
*01 jshort1 pic s9(4) comp-5.
*01 jint1 pic s9(9) comp-5.
*01 jlong1 pic s9(18) comp-5.
*
*01 jfloat1 comp-1.
*01 jdouble1 comp-2.
*
*01 jobject1 object reference.
*01 jclass1 object reference.
*01 jstring1 object reference jstring.
*01 jarray1 object reference jarray.
*
*01 jbooleanArray1 object reference jbooleanArray.
*01 jbyteArray1 object reference jbyteArray.
*01 jcharArray1 object reference jcharArray.
*01 jshortArray1 object reference jshortArray.
*01 jintArray1 object reference jintArray.
*01 jlongArray1 object reference jlongArray.
*01 floatArray1 object reference floatArray.
*01 jdoubleArray1 object reference jdoubleArray.
*01 jobjectArray1 object reference jobjectArray.
* Used in ReleaseScalarArrayElements
01 releaseMode pic s9(9) comp-5.
88 JNI-COMMIT value 1.
88 JNI-ABORT value 2.
01 JNIenv pointer.
RELATED TASKS
Compiling OO applications under z/OS UNIX on page 291
Accessing JNI services on page 623
RELATED REFERENCES
ADATA on page 305
Compiler options that affect the SYSADATA file
SYSADATA record types on page 728
SYSADATA record descriptions on page 730
The SYSADATA fields shown in the following table contain line numbers whose
contents differ depending on the NUM|NONUM setting.
The Type 0038 Source record contains two fields that relate to line numbers and
record numbers:
v AS_STMT contains the compiler line number in both the NUM and NONUM cases.
v AS_CUR_REC# contains the physical source record number.
These two fields can always be used to correlate the compiler line numbers, used
in all the above fields, with physical source record numbers.
The remaining compiler options have no direct effect on the SYSADATA file, but
might trigger generation of additional error messages associated with the specific
option, such as FLAGSTD or SSRANGE.
RELATED REFERENCES
SYSADATA record types
COMPILE on page 316
EXIT on page 324
LANGUAGE on page 331
NUMBER on page 339
TEST on page 359
Example: SYSADATA
The following sample shows part of the listing of a COBOL program. If this
COBOL program were compiled with the ADATA option, the records produced in
the associated data file would be in the sequence shown in the table below.
000001 IDENTIFICATION DIVISION. AD000020
000002 PROGRAM-ID. AD04202. AD000030
000003 ENVIRONMENT DIVISION. AD000040
000004 DATA DIVISION. AD000050
000005 WORKING-STORAGE SECTION. AD000060
000006 77 COMP3-FLD2 pic S9(3)v9. AD000070
000007 PROCEDURE DIVISION. AD000080
000008 STOP RUN.
Type Description
X'0120' EVENTS Timestamp record
X'0120' EVENTS Processor record
X'0120' EVENTS File-ID record
X'0120' EVENTS Program record
X'0001' ADATA Identification record
X'0000' Job Identification record
X'0010' Options record
X'0038' Source record for statement 1
X'0038' Source record for statement 2
X'0038' Source record for statement 3
X'0038' Source record for statement 4
X'0038' Source record for statement 5
RELATED REFERENCES
SYSADATA record descriptions
In the fields described in each of the record types, these symbols occur:
C Indicates character (EBCDIC or ASCII) data
H Indicates 2-byte binary integer data
F Indicates 4-byte binary integer data
A Indicates 4-byte binary integer address and offset data
X Indicates hexadecimal (bit) data or 1-byte binary integer data
No boundary alignments are implied by any data type, and the implied lengths
above might be changed by the presence of a length indicator (Ln). All integer data
is in big-endian or little-endian format depending on the indicator bit in the header
flag byte. Big-endian format means that bit 0 is always the most significant bit and
bit n is the least significant bit. Little-endian refers to byte-reversed integers as
seen on Intel processors.
RELATED REFERENCES
Common header section on page 731
Job identification record: X'0000' on page 733
ADATA identification record: X'0001' on page 734
Compilation unit start | end record: X'0002' on page 734
Options record: X'0010' on page 735
External symbol record: X'0020' on page 744
Parse tree record: X'0024' on page 745
Token record: X'0030' on page 760
Source error record: X'0032' on page 774
Source record: X'0038' on page 774
COPY REPLACING record: X'0039' on page 775
730 Enterprise COBOL for z/OS, V5.2 Programming Guide
Symbol record: X'0042' on page 776
Symbol cross-reference record: X'0044' on page 787
Nested program record: X'0046' on page 788
Library record: X'0060' on page 789
Statistics record: X'0090' on page 789
EVENTS record: X'0120' on page 790
1. When a batch compilation (sequence of programs) is run with the ADATA option, there
will be multiple Job Identification, Options, and Statistics records for each compilation.
The mapping of the 12-byte header does not include the area used for the
variable-length record-descriptor word required by the access method on MVS and
VSE.
1. Where the number of input files would exceed the record size for the associated data
file, the record is continued on the next record. The current number of input files (for
that record) is stored in the record, and the record is written to the associated data file.
The next record contains the rest of the input files. The count of the number of input
files is a count for the current record.
1. The appropriate CCS flag will always be set. If the CCSID is set to nonzero, the
code-page name length will be zero. If the CCSID is set to zero, the code-page name
length will be nonzero and the code-page name will be present.
Types X'12', X'C0', X'C1' and X'C6' are for COBOL only.
Flags XL1 Not applicable for COBOL
Reserved HL2 Reserved for future use
Symbol-ID FL4 Symbol-ID of program that contains the reference (only
for types x'02' and x'12')
Line number FL4 Line number of statement that contains the reference
(only for types x'02' and x'12')
Section length FL4 Not applicable for COBOL
LD ID FL4 Not applicable for COBOL
Reserved CL8 Reserved for future use
External name length HL2 Number of characters in the external name
Alias name length HL2 Not applicable for COBOL
External name CL(n) The external name
301 Section
302 Procedure section
401 Paragraph
402 Procedure paragraph
501 Sentence
502 File definition
503 Sort file definition
504 Program-name
505 Program attribute
508 ENVIRONMENT DIVISION clause
509 CLASS attribute
510 METHOD attribute
511 USE statement
601 Statement
602 Data description clause
603 Data entry
604 File description clause
605 Data entry name
606 Data entry level
607 EXEC entry
801 Phrase
802 ON phrase
803 NOT phrase
804 THEN phrase
805 ELSE phrase
806 Condition
807 Expression
808 Relative indexing
809 EXEC CICS Option
810 Reserved word
811 INITIALIZE REPLACING category
1001 Subscript
1002 Reference modification
Node subtype HL2 The subtype of the node.
0023 INVOKE
0024 MERGE
0025 MOVE
0026 MULTIPLY
0027 OPEN
0028 PERFORM
0029 READ
0030 READY
0031 RELEASE
0032 RESET
0033 RETURN
0034 REWRITE
0035 SEARCH
0036 SERVICE
0037 SET
0038 SORT
0039 START
0040 STOP
0041 STRING
0042 SUBTRACT
0043 UNSTRING
0044 EXEC SQL
0144 EXEC CICS
0045 WRITE
0046 XML
0033 BEFORE
0034 AFTER
0035 EXCEPTION
0036 CORRESPONDING
0037 Reserved for future use
0038 RETURNING
0039 GIVING
0040 THROUGH
0041 KEY
0042 DELIMITER
0043 POINTER
0044 COUNT
0045 METHOD
0046 PROGRAM
0047 INPUT
0048 OUTPUT
0049 I-O
0050 EXTEND
0051 RELOAD
0052 ASCENDING
0053 DESCENDING
0054 DUPLICATES
0055 NATIVE (USAGE)
0056 INDEXED
0057 FROM
0058 FOOTING
0059 LINES AT BOTTOM
0060 LINES AT TOP
0061 XML ENCODING
0062 XML GENERATE XML-DECLARATION
0063 XML GENERATE ATTRIBUTES
0064 XML GENERATE NAMESPACE
0065 XML PARSE PROCESSING
0066 XML PARSE VALIDATING
0067 XML GENERATE NAME
0068 XML GENERATE TYPE
0069 XML GENERATE SUPPRESS
0033 UPPER-CASE
0034 CURRENT-DATE
0035 INTEGER-PART
0036 PRESENT-VALUE
0037 WHEN-COMPILED
0038 DAY-OF-INTEGER
0039 INTEGER-OF-DAY
0040 DATE-OF-INTEGER
0041 INTEGER-OF-DATE
0042 STANDARD-DEVIATION
0043 YEAR-TO-YYYY
0044 DAY-TO-YYYYDDD
0045 DATE-TO-YYYYMMDD
0049 DISPLAY-OF
0050 NATIONAL-OF
0051 UPOS
0052 UVALID
0053 UWIDTH
0054 ULENGTH
0055 USUBSTR
0056 USUPPLEMENTARY
For Special Register type:
0001 ADDRESS OF
0002 LENGTH OF
For Keyword Class Test Name type:
0001 ALPHABETIC
0002 ALPHABETIC-LOWER
0003 ALPHABETIC-UPPER
0004 DBCS
0005 KANJI
0006 NUMERIC
0007 NEGATIVE
0008 POSITIVE
0009 ZERO
0030 MULTIPLY
0031 OPEN
0032 PERFORM
0033 READ
0035 RELEASE
0036 RETURN
0037 REWRITE
0038 SEARCH
0040 SET
0041 SORT
0042 START
0043 STOP
0044 STRING
0045 SUBTRACT
0048 UNSTRING
0049 USE
0050 WRITE
0051 CONTINUE
0052 END-ADD
0053 END-CALL
0054 END-COMPUTE
0055 END-DELETE
0056 END-DIVIDE
0057 END-EVALUATE
0058 END-IF
0059 END-MULTIPLY
0060 END-READ
0061 END-RETURN
0062 END-REWRITE
0063 END-SEARCH
0064 END-START
0065 END-STRING
0066 END-SUBTRACT
0067 END-UNSTRING
0068 END-WRITE
0069 GOBACK
0070 EVALUATE
0071 RESET
0072 SERVICE
0073 END-INVOKE
0074 END-EXEC
0075 XML
0076 END-XML
0099 FOREIGN-VERB
0101 DATA-NAME
0105 DASHED-NUM
0106 DECIMAL
0107 DIV-SIGN
0108 EQ
0109 EXPONENTIATION
0110 GT
0111 INTEGER
0112 LT
0113 LPAREN
0114 MINUS-SIGN
0115 MULT-SIGN
0116 NONUMLIT
0117 PERIOD
0118 PLUS-SIGN
0121 RPAREN
0122 SIGNED-INTEGER
0123 QUID
0124 COLON
0125 IEOF
0126 EGCS-LIT
0127 COMMA-SPACE
0128 SEMICOLON-SPACE
0129 PROCEDURE-NAME
0130 FLT-POINT-LIT
0131 Language Environment
0132 GE
0133 IDREF
0134 EXPREF
0136 CICS
0137 NEW
0138 NATIONAL-LIT
0200 ADDRESS
0201 ADVANCING
0202 AFTER
0203 ALL
0204 ALPHABETIC
0205 ALPHANUMERIC
0206 ANY
0207 AND
0208 ALPHANUMERIC-EDITED
0209 BEFORE
0210 BEGINNING
0211 FUNCTION
0212 CONTENT
0213 CORR
CORRESPONDING
0214 DAY
0215 DATE
0216 DEBUG-CONTENTS
0217 DEBUG-ITEM
0218 DEBUG-LINE
0219 DEBUG-NAME
0220 DEBUG-SUB-1
0221 DEBUG-SUB-2
0222 DEBUG-SUB-3
0223 DELIMITED
0224 DELIMITER
0225 DOWN
0226 NUMERIC-EDITED
0227 XML-EVENT
0228 END-OF-PAGE
EOP
0229 EQUAL
0230 ERROR
0231 XML-NTEXT
0232 EXCEPTION
0233 EXTEND
0234 FIRST
0235 FROM
0236 GIVING
0237 GREATER
0238 I-O
0239 IN
0240 INITIAL
0241 INTO
0242 INVALID
0243 SQL
0244 LESS
0245 LINAGE-COUNTER
0246 XML-TEXT
0247 LOCK
0248 GENERATE
0249 NEGATIVE
0250 NEXT
0251 NO
0252 NOT
0253 NUMERIC
0254 KANJI
0255 OR
0256 OTHER
0257 OVERFLOW
0258 PAGE
0259 CONVERTING
0260 POINTER
0261 POSITIVE
0262 DBCS
0263 PROCEDURES
0264 PROCEED
0265 REFERENCES
0266 DAY-OF-WEEK
0267 REMAINDER
0268 REMOVAL
0269 REPLACING
0270 REVERSED
0271 REWIND
0272 ROUNDED
0273 RUN
0274 SENTENCE
0275 STANDARD
0276 RETURN-CODE
SORT-CORE-SIZE
SORT-FILE-SIZE
SORT-MESSAGE
SORT-MODE-SIZE
SORT-RETURN
TALLY
XML-CODE
0277 TALLYING
0278 SUM
0279 TEST
0280 THAN
0281 UNTIL
0282 UP
0283 UPON
0284 VARYING
0285 RELOAD
0286 TRUE
0287 THEN
0288 RETURNING
0289 ELSE
0290 SELF
0291 SUPER
0292 WHEN-COMPILED
0293 ENDING
0294 FALSE
0295 REFERENCE
0296 NATIONAL-EDITED
0297 COM-REG
0298 ALPHABETIC-LOWER
0299 ALPHABETIC-UPPER
0301 REDEFINES
0302 OCCURS
0303 SYNC
SYNCHRONIZED
0304 MORE-LABELS
0305 JUST
JUSTIFIED
0306 SHIFT-IN
0307 BLANK
0308 VALUE
0309 COMP
COMPUTATIONAL
0310 COMP-1
COMPUTATIONAL-1
0311 COMP-3
COMPUTATIONAL-3
0312 COMP-2
COMPUTATIONAL-2
0313 COMP-4
COMPUTATIONAL-4
0314 DISPLAY-1
0315 SHIFT-OUT
0316 INDEX
0317 USAGE
0318 SIGN
0319 LEADING
0320 SEPARATE
0321 INDEXED
0322 LEFT
0323 RIGHT
0324 PIC
PICTURE
0325 VALUES
0326 GLOBAL
0327 EXTERNAL
0328 BINARY
0329 PACKED-DECIMAL
0330 EGCS
0331 PROCEDURE-POINTER
0332 COMP-5
COMPUTATIONAL-5
0333 FUNCTION-POINTER
0334 TYPE
0335 JNIENVPTR
0336 NATIONAL
0337 GROUP-USAGE
| 0342 VOLATILE
0401 HIGH-VALUE
HIGH-VALUES
0402 LOW-VALUE
LOW-VALUES
0403 QUOTE
QUOTES
0404 SPACE
SPACES
0405 ZERO
0406 ZEROES
ZEROS
0407 NULL
NULLS
0501 BLOCK
0502 BOTTOM
0505 CHARACTER
0506 CODE
0507 CODE-SET
0514 FILLER
0516 FOOTING
0520 LABEL
0521 LENGTH
0524 LINAGE
0526 OMITTED
0531 RENAMES
0543 TOP
0545 TRAILING
0549 RECORDING
0601 INHERITS
0603 RECURSIVE
0701 ACCESS
0702 ALSO
0703 ALTERNATE
0704 AREA
AREAS
0705 ASSIGN
0707 COLLATING
0708 COMMA
0709 CURRENCY
0710 CLASS
0711 DECIMAL-POINT
0712 DUPLICATES
0713 DYNAMIC
0714 EVERY
0716 MEMORY
0717 MODE
0718 MODULES
0719 MULTIPLE
0720 NATIVE
0721 OFF
0722 OPTIONAL
0723 ORGANIZATION
0724 POSITION
0725 PROGRAM
0726 RANDOM
0727 RELATIVE
0728 RERUN
0729 RESERVE
0730 SAME
0731 SEGMENT-LIMIT
0732 SELECT
0733 SEQUENCE
0734 SEQUENTIAL
0736 SORT-MERGE
0737 STANDARD-1
0738 TAPE
0739 WORDS
0740 PROCESSING
0741 APPLY
0742 WRITE-ONLY
0743 COMMON
0744 ALPHABET
0745 PADDING
0746 SYMBOLIC
0747 STANDARD-2
0748 OVERRIDE
0750 PASSWORD
0751 XML-SCHEMA
0801 ARE
IS
0802 ASCENDING
0803 AT
0804 BY
0805 CHARACTERS
0806 CONTAINS
0808 COUNT
0809 DEBUGGING
0810 DEPENDING
0811 DESCENDING
0812 DIVISION
0814 FOR
0815 ORDER
0816 INPUT
0817 REPLACE
0818 KEY
0819 LINE
LINES
0820 XML-INFORMATION
0821 OF
0822 ON
0823 OUTPUT
0825 RECORD
0826 RECORDS
0827 REEL
0828 SECTION
0829 SIZE
0830 STATUS
0831 THROUGH
THRU
0832 TIME
0833 TIMES
0834 TO
0836 UNIT
| 840 SQLIMS
0837 USING
0838 WHEN
0839 WITH
0840 SQLIMS
0901 PROCEDURE
0902 DECLARATIVES
0903 END
1001 DATA
1002 FILE
1003 FD
1004 SD
1005 WORKING-STORAGE
1006 LOCAL-STORAGE
1007 LINKAGE
1101 ENVIRONMENT
1102 CONFIGURATION
1103 SOURCE-COMPUTER
1104 OBJECT-COMPUTER
1105 SPECIAL-NAMES
1106 REPOSITORY
1107 INPUT-OUTPUT
1108 FILE-CONTROL
1109 I-O-CONTROL
1201 ID
IDENTIFICATION
1202 PROGRAM-ID
1203 AUTHOR
1204 INSTALLATION
1205 DATE-WRITTEN
1206 DATE-COMPILED
1207 SECURITY
1208 CLASS-ID
1209 METHOD-ID
1210 METHOD
1211 FACTORY
1212 OBJECT
2020 TRACE
| 2046 SUPPRESS
3000 DATADEF
3001 F-NAME
3002 UPSI-SWITCH
3003 CONDNAME
3004 CONDVAR
3005 BLOB
3006 CLOB
3007 DBCLOB
3008 BLOB-LOCATOR
3009 CLOB-LOCATOR
3010 DBCLOB-LOCATOR
3011 BLOB-FILE
3012 CLOB-FILE
3013 DBCLOB-FILE
3014 DFHRESP
5001 PARSE
5002 AUTOMATIC
5003 PREVIOUS
5004 ENCODING
5005 NAMESPACE
5006 NAMESPACE-PREFIX
5007 XML-DECLARATION
5008 ATTRIBUTES
5009 VALIDATING
5010 UNBOUNDED
5011 ATTRIBUTE
5012 ELEMENT
5013 NONNUMERIC
5014 NAME
| 5015 CYCLE
| 5016 PARAGRAPH
9999 COBOL
Token length HL2 The length of the token
Token column FL4 The starting column number of the token in the source
listing
The following table shows the contents of the COPY REPLACING record.
Table 125. SYSADATA COPY REPLACING record
Field Size Description
Starting line number FL4 The listing line number of the start of the text that
of replaced string resulted from REPLACING
Starting column FL4 The listing column number of the start of the text that
number of replaced resulted from REPLACING
string
Ending line number FL4 The listing line number of the end of the text that
of replaced string resulted from REPLACING
Ending column FL4 The listing column number of the end of the text that
number of replaced resulted from REPLACING
string
Starting line number FL4 The source file line number of the start of the text that
of original string was changed by REPLACING
Starting column FL4 The source file column number of the start of the text
number of original that was changed by REPLACING
string
Ending line number FL4 The source file line number of the end of the text that
of original string was changed by REPLACING
Ending column FL4 The source file column number of the end of the text that
number of original was changed by REPLACING
string
1. The reference flag field and the statement number field occur as many times as the
number of references field dictates. For example, if there is a value of 10 in the number
of references field, there will be 10 occurrences of the reference flag and statement
number pair for data-name, procedure, or program symbols, or 10 occurrences of the
statement number for verbs.
Where the number of references would exceed the record size for the SYSADATA file,
the record is continued on the next record. The continuation flag is set in the common
header section of the record.
1. If 10 COPY members are retrieved from a library, the "Number of members" field will
contain 10 and there will be 10 occurrences of the "COPY/BASIS member file ID" field,
the "COPY/BASIS name length" field, and the "COPY/BASIS name" field.
2. If COPY/BASIS members are retrieved from different libraries, a library record is written
to the SYSADATA file for each unique library.
Pseudocode and other comments about the programs are included in the program
prolog, which you can obtain in a program listing.
RELATED CONCEPTS
IGYTCARA: batch application
IGYTCARB: interactive program on page 799
IGYTSALE: nested program application on page 802
The following diagram shows the parts of the application and how they are
organized:
RELATED REFERENCES
Input data for IGYTCARA
Report produced by IGYTCARA on page 797
Language elements and concepts that are illustrated on page 809
1. Transaction code
2. Shift
3. Home code
Data-set and procedure names might be changed at installation time. Check with
your system programmer to verify these names.
Do not change these options on the CBL statement in the source file for
IGYTCARA:
v NOADV
v NODYNAM
v NONAME
v NONUMBER
v QUOTE
v SEQUENCE
With these options in effect, the program will not cause any diagnostic messages to
be issued. You can use the sequence number string in the source file to search for
the language elements used.
RELATED CONCEPTS
IGYTCARA: batch application on page 795
RELATED TASKS
Running IGYTCARA
RELATED REFERENCES
Input data for IGYTCARA on page 796
Report produced by IGYTCARA on page 797
Language elements and concepts that are illustrated on page 809
Running IGYTCARA
The following procedure compiles, link-edits, and runs the IGYTCARA program. If
you want only to compile or only to compile and link-edit the program, you must
change the IGYWCLG cataloged procedure.
To run IGYTCARA under z/OS, use JCL to define a VSAM cluster and compile the
program. Insert the information specific to your system and installation
(accounting information, volume serial number, unit name, cluster prefix) in the
fields that are shown in lowercase letters. These examples use the name
IGYTCAR.MASTFILE; you can use another name if you want to.
1. Use this JCL to create the required VSAM cluster:
//CREATE JOB (acct-info),IGYTCAR CREATE VSAM,MSGLEVEL=(1,1),
// TIME=(0,29)
//CREATE EXEC PGM=IDCAMS
//VOL1 DD VOL=SER=your-volume-serial,UNIT=your-unit,DISP=SHR
//SYSPRINT DD SYSOUT=A
//SYSIN DD *
DELETE your-prefix.IGYTCAR.MASTFILE -
FILE(VOL1) -
PURGE
DEFINE CLUSTER -
(NAME(your-prefix.IGYTCAR.MASTFILE) -
VOLUME(your-volume-serial) -
FILE(VOL1) -
RELATED TASKS
Chapter 10, Processing VSAM files, on page 185
RELATED REFERENCES
Compile, link-edit, and run procedure (IGYWCLG) on page 259
The input data for IGYTCARB is the same as that for IGYTCARA. IGYTCARB lets
you append to the information in your input file by using an ISPF panel. An
example of the panel used by IGYTCARB is shown below:
--------------------------- CARPOOL DATA ENTRY -------------------------------
New Data Entry Previous Entry
Type =======> - A, R, or D A
Shift ======> - 1, 2, or 3 1
Home Code ==> -- 2 Chars 01
Work Code ==> -- 2 Chars 11
Name =======> --------- 9 Chars POPOWICH
Initials ===> -- 2 Chars AD
Address ====> ------------------ 18 Chars 134 SIXTH AVENUE
City =======> ------------- 13 Chars SAN FRANCISCO
State ======> -- 2 Chars CA
Zip Code ===> ----- 5 Chars 99903
Home Phone => ---------- 10 Chars 4155553390
Work Phone => ---------- 10 Chars 4155557855
Home Jnc code > -- 2 Chars H3
Work Jnc Code > -- 2 Chars W7
Commuter Stat > - D, R or blank
RELATED TASKS
Preparing to run IGYTCARB on page 800
Do not change the following options in the CBL statement in the source file for
IGYTCARB:
v NONUMBER
v QUOTE
v SEQUENCE
With these options in effect, the program will not cause any diagnostic messages to
be issued. You can use the sequence number string in the source file to search for
language elements.
RELATED CONCEPTS
IGYTCARB: interactive program on page 799
RELATED TASKS
Running IGYTCARB
RELATED REFERENCES
Language elements and concepts that are illustrated on page 809
Running IGYTCARB
The following procedure compiles, link-edits, and runs the IGYTCARB program. If
you want only to compile or only to compile and link-edit the program, you must
change the procedure.
RELATED REFERENCES
ISPF Dialog Developer's Guide and Reference
RELATED REFERENCES
Input data for IGYTSALE
Reports produced by IGYTSALE on page 805
Language elements and concepts that are illustrated on page 809
This input file, called IGYTABLE, is loaded into three separate tables for use
during transaction processing. The format of the file is as follows, with an
explanation of the items below:
1. Record type
2. Customer code
3. Customer name
4. Product code
The value of field 1 (C, P, or S) determines the format of the input record. The
following sample shows a section of IGYTABLE:
S1111Edyth Phillips 062484042327
S1122Chuck Morgan 052780084425
S1133Art Tung 022882061728
S1144Billy Jim Bob 010272121150
S1155Chris Preston 122083053377
S1166Al Willie Roz 111276100000
P01Footballs 0000620
P02Football Equipment 0032080
P03Football Uniform 0004910
P04Basketballs 0002220
P05Basketball Rim/Board0008830
P06Basketball Uniform 0004220
C01L. A. Sports
C02Gear Up
C03Play Outdoors
C04Sports 4 You
C05Sports R US
C06Stay Active
C07Sport Shop
C08Stay Sporty
C09Hot Sports
C10The Sportsman
C11Playing Ball
C12Sports Play
. . .
You can change data-set names and procedure-names at installation time. Check
with your system programmer to verify these names.
Do not change these options in the CBL statement in the source file for IGYTSALE:
v NONUMBER
v SEQUENCE
v NONUMBER
v QUOTE
With these options in effect, the program might not cause any diagnostic messages
to be issued. You can use the sequence number string in the source file to search
for the language elements used.
When you run IGYTSALE, the following messages are printed to the SYSOUT data
set:
Program IGYTSALE Begins
There were 00041 records processed in this program
Program IGYTSALE Normal End
RELATED CONCEPTS
IGYTSALE: nested program application on page 802
RELATED TASKS
Running IGYTSALE on page 809
Running IGYTSALE
Use the following JCL to compile, link-edit, and run the IGYTSALE program. If
you want only to compile or only to compile and link-edit the program, change the
IGYWCLG cataloged procedure.
Insert the accounting information for your system or installation in the fields that
are shown in lowercase letters.
//IGYTSALE JOB (acct-info),IGYTSALE,MSGLEVEL=(1,1),TIME=(0,29)
//TEST EXEC IGYWCLG
//COBOL.SYSLIB DD DSN=IGY.V5R1M0.SIGYSAMP,DISP=SHR
//COBOL.SYSIN DD DSN=IGY.V5R1M0.SIGYSAMP(IGYTSALE),DISP=SHR
//GO.SYSOUT DD SYSOUT=A
//GO.IGYTABLE DD DSN=IGY.V5R1M0.SIGYSAMP(IGYTABLE),DISP=SHR
//GO.IGYTRANS DD DSN=IGY.V5R1M0.SIGYSAMP(IGYTRANA),DISP=SHR
//GO.IGYPRINT DD SYSOUT=A,DCB=BLKSIZE=133
//GO.IGYPRT2 DD SYSOUT=A,DCB=BLKSIZE=133
//
To find the applicable language element for a sample program, locate the
abbreviation for that program in the sequence string:
The following table lists the language elements and programming concepts that the
sample programs illustrate. The language element or concept is described, and the
sequence string is shown. The sequence string is the special character string that
appears in the sequence field of the source file. You can use this string as a search
argument for locating the elements in the listing.
IBM may not offer the products, services, or features discussed in this document in
other countries. Consult your local IBM representative for information on the
products and services currently available in your area. Any reference to an IBM
product, program, or service is not intended to state or imply that only that IBM
product, program, or service may be used. Any functionally equivalent product,
program, or service that does not infringe any IBM intellectual property right may
be used instead. However, it is the user's responsibility to evaluate and verify the
operation of any non-IBM product, program, or service.
IBM may have patents or pending patent applications covering subject matter
described in this document. The furnishing of this document does not grant you
any license to these patents. You can send license inquiries, in writing, to:
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:
INTERNATIONAL BUSINESS MACHINES CORPORATION PROVIDES THIS
PUBLICATION "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS
FOR A PARTICULAR PURPOSE. Some states do not allow disclaimer of express or
implied warranties in certain transactions, therefore, this statement may not apply
to you.
Any references in this information 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.
Licensees of this program who wish to have information about it for the purpose
of enabling: (i) the exchange of information between independently created
programs and other programs (including this one) and (ii) the mutual use of the
information which has been exchanged, should contact:
IBM Corporation
J46A/G4
555 Bailey Avenue
San Jose, CA 95141-1003
U.S.A.
The licensed program described in this document and all licensed material
available for it are provided by IBM under terms of the IBM Customer Agreement,
IBM International Program License Agreement or any equivalent agreement
between us.
All statements regarding IBM's future direction or intent are subject to change or
withdrawal without notice, and represent goals and objectives only.
This information contains examples of data and reports used in daily business
operations. To illustrate them as completely as possible, the examples include the
names of individuals, companies, brands, and products. All of these names are
fictitious and any similarity to the names and addresses used by an actual business
enterprise is entirely coincidental.
COPYRIGHT LICENSE:
Each copy or any portion of these sample programs or any derivative work, must
include a copyright notice as follows:
(your company name) (year). Portions of this code are derived from IBM Corp.
Sample Programs. Copyright IBM Corp. _enter the year or years_. All rights
reserved.
If you are viewing this information softcopy, the photographs and color
illustrations may not appear.
Trademarks
IBM, the IBM logo, and ibm.com are trademarks or registered trademarks of
International Business Machines Corp., registered in many jurisdictions worldwide.
Other product and service names might be trademarks of IBM or other companies.
A current list of IBM trademarks is available on the Web at Copyright and
trademark information at www.ibm.com/legal/copytrade.shtml.
Java and all Java-based trademarks and logos are trademarks or registered
trademarks of Oracle and/or its affiliates.
UNIX is a registered trademark of The Open Group in the United States and other
countries.
Other product and service names might be trademarks of IBM or other companies.
Notices 817
818 Enterprise COBOL for z/OS, V5.2 Programming Guide
Glossary
The terms in this glossary are defined in decimal point characters period (.) or
accordance with their meaning in COBOL. These comma (,), of the decimal point position
terms might or might not have the same meaning in a data item.
in other languages.
actual document encoding
For an XML document, one of the
This glossary includes terms and definitions from
following encoding categories that the
the following publications:
XML parser determines by examining the
v ANSI INCITS 23-1985, Programming languages - first few bytes of the document:
COBOL, as amended by ANSI INCITS 23a-1989,
v ASCII
Programming Languages - COBOL - Intrinsic
Function Module for COBOL, and ANSI INCITS v EBCDIC
23b-1993, Programming Languages - Correction v UTF-8
Amendment for COBOL v UTF-16, either big-endian or
v ANSI X3.172-2002, American National Standard little-endian
Dictionary for Information Systems v Other unsupported encoding
v No recognizable encoding
American National Standard definitions are
preceded by an asterisk (*). * alphabet-name
A user-defined word, in the
A SPECIAL-NAMES paragraph of the
ENVIRONMENT DIVISION, that assigns a
* abbreviated combined relation condition
name to a specific character set or
The combined condition that results from
collating sequence or both.
the explicit omission of a common subject
or a common subject and common * alphabetic character
relational operator in a consecutive A letter or a space character.
sequence of relation conditions.
alphabetic data item
abend Abnormal termination of a program. A data item that is described with a
PICTURE character string that contains
above the 16 MB line
only the symbol A. An alphabetic data
Storage above the so-called 16 MB line (or
item has USAGE DISPLAY.
boundary) but below the 2 GB bar. This
storage is addressable only in 31-bit * alphanumeric character
mode. Before IBM introduced the Any character in the single-byte character
MVS/XA architecture in the 1980s, the set of the computer.
virtual storage for a program was limited
alphanumeric data item
to 16 MB. Programs that have been
A general reference to a data item that is
compiled with a 24-bit mode can address
described implicitly or explicitly as USAGE
only 16 MB of space, as though they were
DISPLAY, and that has category
kept under an imaginary storage line.
alphanumeric, alphanumeric-edited, or
Since VS COBOL II, a program that has
numeric-edited.
been compiled with a 31-bit mode can be
above the 16 MB line. alphanumeric-edited data item
A data item that is described by a PICTURE
* access mode
character string that contains at least one
The manner in which records are to be
instance of the symbol A or X and at least
operated upon within a file.
one of the simple insertion symbols B, 0,
* actual decimal point or /. An alphanumeric-edited data item
The physical representation, using the has USAGE DISPLAY.
* alphanumeric function
A function whose value is composed of a
Copyright IBM Corp. 1991, 2015 819
string of one or more characters from the arithmetic statement, or the evaluation of
alphanumeric character set of the an arithmetic expression, that results in a
computer. mathematically correct solution to the
arguments presented.
alphanumeric group item
A group item that is defined without a * arithmetic operator
GROUP-USAGE NATIONAL clause. For A single character, or a fixed
operations such as INSPECT, STRING, and two-character combination that belongs to
UNSTRING, an alphanumeric group item is the following set:
processed as though all its content were
described as USAGE DISPLAY regardless of Character Meaning
the actual content of the group. For + Addition
operations that require processing of the - Subtraction
elementary items within a group, such as * Multiplication
MOVE CORRESPONDING, ADD CORRESPONDING, / Division
or INITIALIZE, an alphanumeric group ** Exponentiation
item is processed using group semantics.
* arithmetic statement
alphanumeric literal
A statement that causes an arithmetic
A literal that has an opening delimiter
operation to be executed. The arithmetic
from the following set: , ", X, X", Z, or
statements are ADD, COMPUTE, DIVIDE,
Z". The string of characters can include
MULTIPLY, and SUBTRACT.
any character in the character set of the
computer. array An aggregate that consists of data objects,
each of which can be uniquely referenced
* alternate record key
by subscripting. An array is roughly
A key, other than the prime record key,
analogous to a COBOL table.
whose contents identify a record within
an indexed file. * ascending key
A key upon the values of which data is
ANSI (American National Standards Institute)
ordered, starting with the lowest value of
An organization that consists of
the key up to the highest value of the key,
producers, consumers, and
in accordance with the rules for
general-interest groups and establishes the
comparing data items.
procedures by which accredited
organizations create and maintain ASCII
voluntary industry standards in the American National Standard Code for
United States. Information Interchange. The standard
code uses a coded character set that is
argument
based on 7-bit coded characters (8 bits
(1) An identifier, a literal, an arithmetic
including parity check). The standard is
expression, or a function-identifier that
used for information interchange between
specifies a value to be used in the
data processing systems, data
evaluation of a function. (2) An operand
communication systems, and associated
of the USING phrase of a CALL or INVOKE
equipment. The ASCII set consists of
statement, used for passing values to a
control characters and graphic characters.
called program or an invoked method.
IBM has defined an extension to ASCII
* arithmetic expression
(characters 128-255).
An identifier of a numeric elementary
item, a numeric literal, such identifiers assignment-name
and literals separated by arithmetic A name that identifies the organization of
operators, two arithmetic expressions a COBOL file and the name by which it is
separated by an arithmetic operator, or an known to the system.
arithmetic expression enclosed in
* assumed decimal point
parentheses.
A decimal point position that does not
* arithmetic operation involve the existence of an actual
The process caused by the execution of an character in a data item. The assumed
Glossary 821
case structure v DBCS character position, for DBCS
A program-processing logic in which a characters represented in USAGE
series of conditions is tested in order to DISPLAY-1
choose between a number of resulting v National character position, for characters
actions. represented in USAGE NATIONAL;
cataloged procedure synonymous with character encoding unit
A set of job control statements that are for UTF-16
placed in a partitioned data set called the character set
procedure library (SYS1.PROCLIB). You A collection of elements that are used to
can use cataloged procedures to save time represent textual information, but for
and reduce errors in coding JCL. which no coded representation is
CCSID assumed. See also coded character set.
See coded character set identifier. character string
century window A sequence of contiguous characters that
A 100-year interval within which any form a COBOL word, a literal, a PICTURE
two-digit year is unique. Several types of character string, or a comment-entry. A
century window are available to COBOL character string must be delimited by
programmers: separators.
v For the windowing intrinsic functions checkpoint
DATE-TO-YYYYMMDD, DAY-TO-YYYYDDD, and A point at which information about the
YEAR-TO-YYYY, you specify the century status of a job and the system can be
window with argument-2. recorded so that the job step can be
v For Language Environment callable restarted later.
services, you specify the century * class
window in CEESCEN. The entity that defines common behavior
* character and implementation for zero, one, or
The basic indivisible unit of the language. more objects. The objects that share the
same implementation are considered to be
character encoding unit objects of the same class. Classes can be
A unit of data that corresponds to one defined hierarchically, allowing one class
code point in a coded character set. One to inherit from another.
or more character encoding units are used
to represent a character in a coded * class condition
character set. Also known as encoding unit. The proposition (for which a truth value
can be determined) that the content of an
For USAGE NATIONAL, a character encoding item is wholly alphabetic, is wholly
unit corresponds to one 2-byte code point numeric, is wholly DBCS, is wholly Kanji,
of UTF-16. or consists exclusively of the characters
For USAGE DISPLAY, a character encoding that are listed in the definition of a
unit corresponds to a byte. class-name.
Glossary 823
comment line complex ODO
A source program line represented by an Certain forms of the OCCURS DEPENDING ON
asterisk (*) in the indicator area of the clause:
line and any characters from the character v Variably located item or group: A data
set of the computer that follow in Area A item described by an OCCURS clause
and Area B of that line. A comment line with the DEPENDING ON option is
serves only for documentation. A special followed by a nonsubordinate data
form of comment line represented by a item or group. The group can be an
slant (/) in the indicator area of the line alphanumeric group or a national
and any characters from the character set group.
of the computer in Area A and Area B of
v Variably located table: A data item
that line causes page ejection before the
described by an OCCURS clause with the
comment is printed.
DEPENDING ON option is followed by a
* common program nonsubordinate data item described by
A program that, despite being directly an OCCURS clause.
contained within another program, can be v Table with variable-length elements: A
called from any program directly or data item described by an OCCURS
indirectly contained in that other clause contains a subordinate data item
program. described by an OCCURS clause with the
* compile DEPENDING ON option.
(1) To translate a program expressed in a v Index name for a table with
high-level language into a program variable-length elements.
expressed in an intermediate language, v Element of a table with variable-length
assembly language, or a computer elements.
language. (2) To prepare a
machine-language program from a component
computer program written in another (1) A functional grouping of related files.
programming language by making use of (2) In object-oriented programming, a
the overall logic structure of the program, reusable object or program that performs
or generating more than one computer a specific function and is designed to
instruction for each symbolic statement, work with other components and
or both, as well as performing the applications. JavaBeans is Oracle's
function of an assembler. architecture for creating components.
Glossary 825
NOCURRENCY compiler option is in effect, DBCS character
the dollar sign ($) is used as the default Any character defined in IBM's
currency sign value and currency symbol. double-byte character set.
Multiple currency symbols and currency
DBCS character position
sign values can be defined. See also
See character position.
currency sign value.
DBCS data item
* current record
A data item that is described by a PICTURE
In file processing, the record that is
character string that contains at least one
available in the record area associated
symbol G, or, when the NSYMBOL(DBCS)
with a file.
compiler option is in effect, at least one
* current volume pointer symbol N. A DBCS data item has USAGE
A conceptual entity that points to the DISPLAY-1.
current volume of a sequential file.
* debugging line
Any line with a D in the indicator area of
D
the line.
* data clause
* debugging section
A clause, appearing in a data description
A section that contains a USE FOR
entry in the DATA DIVISION of a COBOL
DEBUGGING statement.
program, that provides information
describing a particular attribute of a data * declarative sentence
item. A compiler-directing sentence that
consists of a single USE statement
* data description entry
terminated by the separator period.
An entry in the DATA DIVISION of a
COBOL program that is composed of a * declaratives
level-number followed by a data-name, if A set of one or more special-purpose
required, and then followed by a set of sections, written at the beginning of the
data clauses, as required. PROCEDURE DIVISION, the first of which is
preceded by the key word DECLARATIVE
DATA DIVISION
and the last of which is followed by the
The division of a COBOL program or
key words END DECLARATIVES. A
method that describes the data to be
declarative is composed of a section
processed by the program or method: the
header, followed by a USE
files to be used and the records contained
compiler-directing sentence, followed by a
within them; internal WORKING-STORAGE
set of zero, one, or more associated
records that will be needed; data to be
paragraphs.
made available in more than one program
in the COBOL run unit. * de-edit
The logical removal of all editing
* data item
characters from a numeric-edited data
A unit of data (excluding literals) defined
item in order to determine the unedited
by a COBOL program or by the rules for
numeric value of the item.
function evaluation.
* delimited scope statement
data set
Any statement that includes its explicit
Synonym for file.
scope terminator.
* data-name
* delimiter
A user-defined word that names a data
A character or a sequence of contiguous
item described in a data description entry.
characters that identify the end of a string
When used in the general formats,
of characters and separate that string of
data-name represents a word that must
characters from the following string of
not be reference-modified, subscripted, or
characters. A delimiter is not part of the
qualified unless specifically permitted by
string of characters that it delimits.
the rules for the format.
dependent region
DBCS See double-byte character set (DBCS).
In IMS, the MVS virtual storage region
Glossary 827
source-level debugging needs of different edited data item
languages in a unified fashion by A data item that has been modified by
supplying language-independent suppressing zeros or inserting editing
debugging information. A DWARF file characters or both.
contains debugging data organized into
* editing character
different elements. For more information,
A single character or a fixed two-character
see DWARF program information in the
combination belonging to the following
DWARF/ELF Extensions Library Reference.
set:
* dynamic access
An access mode in which specific logical Character Meaning
records can be obtained from or placed Space
into a mass storage file in a nonsequential 0 Zero
manner and obtained from a file in a + Plus
sequential manner during the scope of the - Minus
same OPEN statement. CR Credit
DB Debit
dynamic CALL Z Zero suppress
A CALL literal statement in a program that * Check protect
has been compiled with the DYNAM option $ Currency sign
and the NODLL option, or a CALL identifier , Comma (decimal point)
statement in a program that has been . Period (decimal point)
compiled with the NODLL option. / Slant (forward slash)
dynamic link library (DLL)
A file that contains executable code and EJB See Enterprise JavaBeans.
data that are bound to a program at load
EJB container
time or run time, rather than during
A container that implements the EJB
linking. Several applications can share the
component contract of the J2EE
code and data in a DLL simultaneously.
architecture. This contract specifies a
Although a DLL is not part of the
runtime environment for enterprise beans
executable file for a program, it can be
that includes security, concurrency, life
required for an executable file to run
cycle management, transaction,
properly.
deployment, and other services. An EJB
dynamic storage area (DSA) container is provided by an EJB or J2EE
Dynamically acquired storage composed server. (Oracle)
of a register save area and an area
EJB server
available for dynamic storage allocation
Software that provides services to an EJB
(such as program variables). A DSA is
container. An EJB server can host one or
allocated upon invocation of a program or
more EJB containers. (Oracle)
function and persists for the duration of
the invocation instance. DSAs are element (text element)
generally allocated within stack segments One logical unit of a string of text, such
managed by Language Environment. as the description of a single data item or
verb, preceded by a unique code
* EBCDIC (Extended Binary-Coded Decimal
identifying the element type.
Interchange Code)
A coded character set based on 8-bit * elementary item
coded characters. A data item that is described as not being
further logically subdivided.
EBCDIC character
Any one of the symbols included in the encapsulation
EBCDIC (Extended Binary-Coded-Decimal In object-oriented programming, the
Interchange Code) set. technique that is used to hide the inherent
details of an object. The object provides
an interface that queries and manipulates
Glossary 829
* extend mode factory data
The state of a file after execution of an Data that is allocated once for a class and
OPEN statement, with the EXTEND phrase shared by all instances of the class.
specified for that file, and before the Factory data is declared in the
execution of a CLOSE statement, without WORKING-STORAGE SECTION of the DATA
the REEL or UNIT phrase for that file. DIVISION in the FACTORY paragraph of the
class definition, and is equivalent to Java
Extensible Markup Language
private static data.
See XML.
factory method
extensions
A method that is supported by a class
COBOL syntax and semantics supported
independently of an object instance.
by IBM compilers in addition to those
Factory methods are declared in the
| described in the 85 COBOL Standard.
FACTORY paragraph of the class definition,
external code page and are equivalent to Java public static
For XML documents, the value specified methods. They are typically used to
by the CODEPAGE compiler option. customize the creation of objects.
* external data * figurative constant
The data that is described in a program as A compiler-generated value referenced
external data items and external file through the use of certain reserved
connectors. words.
* external data item * file A collection of logical records.
A data item that is described as part of an
* file attribute conflict condition
external record in one or more programs
An unsuccessful attempt has been made
of a run unit and that can be referenced
to execute an input-output operation on a
from any program in which it is
file and the file attributes, as specified for
described.
that file in the program, do not match the
* external data record fixed attributes for that file.
A logical record that is described in one
* file clause
or more programs of a run unit and
A clause that appears as part of any of
whose constituent data items can be
the following DATA DIVISION entries: file
referenced from any program in which
description entry (FD entry) and
they are described.
sort-merge file description entry (SD
external decimal data item entry).
See zoned decimal data item and national
* file connector
decimal data item.
A storage area that contains information
* external file connector about a file and is used as the linkage
A file connector that is accessible to one between a file-name and a physical file
or more object programs in the run unit. and between a file-name and its
associated record area.
external floating-point data item
See display floating-point data item and * file control entry
national floating-point data item. A SELECT clause and all its subordinate
clauses that declare the relevant physical
external program
attributes of a file.
The outermost program. A program that
is not nested. FILE-CONTROL paragraph
A paragraph in the ENVIRONMENT DIVISION
* external switch
in which the data files for a given source
A hardware or software device, defined
unit are declared.
and named by the implementor, which is
used to indicate that one of two alternate * file description entry
states exists. An entry in the FILE SECTION of the DATA
DIVISION that is composed of the level
F
Glossary 831
the general formats that an arithmetic hide To redefine a factory or static method
expression can be specified. (inherited from a parent class) in a
subclass.
function-name
A word that names the mechanism whose * high-order end
invocation, along with required The leftmost character of a string of
arguments, determines the value of a characters.
function.
hiperspace
function-pointer data item In a z/OS environment, a range of up to
A data item in which a pointer to an 2 GB of contiguous virtual storage
entry point can be stored. A data item addresses that a program can use as a
defined with the USAGE IS buffer.
FUNCTION-POINTER clause contains the
address of a function entry point. I
Typically used to communicate with C
IBM COBOL extension
and Java programs.
COBOL syntax and semantics supported
by IBM compilers in addition to those
G
| described in the 85 COBOL Standard.
garbage collection
IDENTIFICATION DIVISION
The automatic freeing by the Java runtime
One of the four main component parts of
system of the memory for objects that are
a COBOL program, class definition, or
no longer referenced.
method definition. The IDENTIFICATION
* global name DIVISION identifies the program, class, or
A name that is declared in only one method. The IDENTIFICATION DIVISION
program but that can be referenced from can include the following documentation:
the program and from any program author name, installation, or date.
contained within the program.
* identifier
Condition-names, data-names, file-names,
A syntactically correct combination of
record-names, report-names, and some
character strings and separators that
special registers can be global names.
names a data item. When referencing a
global reference data item that is not a function, an
A reference to an object that is outside the identifier consists of a data-name,
scope of a method. together with its qualifiers, subscripts,
and reference-modifier, as required for
group item
uniqueness of reference. When referencing
(1) A data item that is composed of
a data item that is a function, a
subordinate data items. See alphanumeric
function-identifier is used.
group item and national group item. (2)
When not qualified explicitly or by * imperative statement
context as a national group or an A statement that either begins with an
alphanumeric group, the term refers to imperative verb and specifies an
groups in general. unconditional action to be taken or is a
conditional statement that is delimited by
grouping separator
its explicit scope terminator (delimited
A character used to separate units of
scope statement). An imperative statement
digits in numbers for ease of reading. The
can consist of a sequence of imperative
default is the character comma.
statements.
H * implicit scope terminator
A separator period that terminates the
header label
scope of any preceding unterminated
(1) A data-set label that precedes the data
statement, or a phrase of a statement that
records in a unit of recording media. (2)
by its occurrence indicates the end of the
Synonym for beginning-of-file label.
scope of any statement contained within
the preceding phrase.
Glossary 833
are zero in the returned value for any * intrarecord data structure
possible evaluation of the function. The entire collection of groups and
elementary data items from a logical
integer function
record that a contiguous subset of the
A function whose category is numeric and
data description entries defines. These
whose definition does not include any
data description entries include all entries
digit positions to the right of the decimal
whose level-number is greater than the
point.
level-number of the first data description
Interactive System Productivity Facility (ISPF) entry describing the intra-record data
An IBM software product that provides a structure.
menu-driven interface for the TSO or VM
intrinsic function
user. ISPF includes library utilities, a
A predefined function, such as a
powerful editor, and dialog management.
commonly used arithmetic function,
interlanguage communication (ILC) called by a built-in function reference.
The ability of routines written in different
* invalid key condition
programming languages to communicate.
A condition, at run time, caused when a
ILC support lets you readily build
specific value of the key associated with
applications from component routines
an indexed or relative file is determined
written in a variety of languages.
to be not valid.
intermediate result
* I-O-CONTROL
An intermediate field that contains the
The name of an ENVIRONMENT DIVISION
results of a succession of arithmetic
paragraph in which object program
operations.
requirements for rerun points, sharing of
* internal data same areas by several data files, and
The data that is described in a program multiple file storage on a single
and excludes all external data items and input-output device are specified.
external file connectors. Items described
* I-O-CONTROL entry
in the LINKAGE SECTION of a program are
An entry in the I-O-CONTROL paragraph of
treated as internal data.
the ENVIRONMENT DIVISION; this entry
* internal data item contains clauses that provide information
A data item that is described in one required for the transmission and
program in a run unit. An internal data handling of data on named files during
item can have a global name. the execution of a program.
internal decimal data item * I-O mode
A data item that is described as USAGE The state of a file after execution of an
PACKED-DECIMAL or USAGE COMP-3, and that OPEN statement, with the I-O phrase
has a PICTURE character string that defines specified, for that file and before the
the item as numeric (a valid combination execution of a CLOSE statement without
of symbols 9, S, P, or V). Synonymous the REEL or UNIT phase for that file.
with packed-decimal data item.
* I-O status
* internal file connector A conceptual entity that contains the
A file connector that is accessible to only two-character value indicating the
one object program in the run unit. resulting status of an input-output
operation. This value is made available to
internal floating-point data item
the program through the use of the FILE
A data item that is described as USAGE
STATUS clause in the file control entry for
COMP-1 or USAGE COMP-2. COMP-1 defines a
the file.
single-precision floating-point data item.
COMP-2 defines a double-precision is-a A relationship that characterizes classes
floating-point data item. There is no and subclasses in an inheritance hierarchy.
PICTURE clause associated with an internal Subclasses that have an is-a relationship
floating-point data item. to a class inherit from that class.
Glossary 835
program was exited (the values are not multiple links in a multipoint or
reset to their initial values). token-ring configuration. (2) To
interconnect items of data or portions of
* letter
one or more computer programs; for
A character belonging to one of the
example, linking object programs by a
following two sets:
linkage-editor to produce an executable
1. Uppercase letters: A, B, C, D, E, F, G, file.
H, I, J, K, L, M, N, O, P, Q, R, S, T, U,
V, W, X, Y, Z LINKAGE SECTION
The section in the DATA DIVISION of the
2. Lowercase letters: a, b, c, d, e, f, g, h, i,
called program or invoked method that
j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y,
describes data items available from the
z
calling program or invoking method. Both
* level indicator the calling program or invoking method
Two alphabetic characters that identify a and the called program or invoked
specific type of file or a position in a method can refer to these data items.
hierarchy. The level indicators in the DATA
linker A term that refers to either the z/OS
DIVISION are: CD, FD, and SD.
| binder (linkage-editor).
* level-number
literal
A user-defined word (expressed as a
A character string whose value is
two-digit number) that indicates the
specified either by the ordered set of
hierarchical position of a data item or the
characters comprising the string or by the
special properties of a data description
use of a figurative constant.
entry. Level-numbers in the range from 1
through 49 indicate the position of a data little-endian
item in the hierarchical structure of a The default format that Intel processors
logical record. Level-numbers in the range use to store binary data and UTF-16
1 through 9 can be written either as a characters. In this format, the most
single digit or as a zero followed by a significant byte of a binary data item is at
significant digit. Level-numbers 66, 77, the highest address and the most
and 88 identify special properties of a significant byte of a UTF-16 character is at
data description entry. the highest address. Compare with
big-endian.
* library-name
A user-defined word that names a local reference
COBOL library that the compiler is to use A reference to an object that is within the
for compiling a given source program. scope of your method.
* library text locale A set of attributes for a program
A sequence of text words, comment lines, execution environment that indicates
the separator space, or the separator culturally sensitive considerations, such as
pseudo-text delimiter in a COBOL library. character code page, collating sequence,
date and time format, monetary value
Lilian date
representation, numeric value
The number of days since the beginning
representation, or language.
of the Gregorian calendar. Day one is
Friday, October 15, 1582. The Lilian date * LOCAL-STORAGE SECTION
format is named in honor of Luigi Lilio, The section of the DATA DIVISION that
the creator of the Gregorian calendar. defines storage that is allocated and freed
on a per-invocation basis, depending on
* linage-counter
the value assigned in the VALUE clauses.
A special register whose value points to
the current position within the page body. * logical operator
One of the reserved words AND, OR, or
link (1) The combination of the link connection
NOT. In the formation of a condition,
(the transmission medium) and two link
either AND, or OR, or both can be used
stations, one at each end of the link
as logical connectives. NOT can be used
connection. A link can be shared among
for logical negation.
Glossary 837
NATIONAL data item or national literal. (2) sequence associated with the computer
Any character represented in UTF-16. specified in the OBJECT-COMPUTER
paragraph.
national character position
See character position. native method
A Java method with an implementation
national data item
that is written in another programming
A data item of category national,
language, such as COBOL.
national-edited, or numeric-edited of
USAGE NATIONAL. * negated combined condition
The NOT logical operator immediately
national decimal data item
followed by a parenthesized combined
An external decimal data item that is
condition. See also condition and combined
described implicitly or explicitly as USAGE
condition.
NATIONAL and that contains a valid
combination of PICTURE symbols 9, S, P, * negated simple condition
and V. The NOT logical operator immediately
followed by a simple condition. See also
national-edited data item
condition and simple condition.
A data item that is described by a PICTURE
character string that contains at least one nested program
instance of the symbol N and at least one A program that is directly contained
of the simple insertion symbols B, 0, or /. within another program.
A national-edited data item has USAGE
* next executable sentence
NATIONAL.
The next sentence to which control will be
national floating-point data item transferred after execution of the current
An external floating-point data item that statement is complete.
is described implicitly or explicitly as
* next executable statement
USAGE NATIONAL and that has a PICTURE
The next statement to which control will
character string that describes a
be transferred after execution of the
floating-point data item.
current statement is complete.
national group item
* next record
A group item that is explicitly or
The record that logically follows the
implicitly described with a GROUP-USAGE
current record of a file.
NATIONAL clause. A national group item is
processed as though it were defined as an * noncontiguous items
elementary data item of category national Elementary data items in the
for operations such as INSPECT, STRING, WORKING-STORAGE SECTION and LINKAGE
and UNSTRING. This processing ensures SECTION that bear no hierarchic
correct padding and truncation of relationship to other data items.
national characters, as contrasted with
null A figurative constant that is used to
defining USAGE NATIONAL data items
assign, to pointer data items, the value of
within an alphanumeric group item. For
an address that is not valid. NULLS can be
operations that require processing of the
used wherever NULL can be used.
elementary items within a group, such as
MOVE CORRESPONDING, ADD CORRESPONDING, * numeric character
and INITIALIZE, a national group is A character that belongs to the following
processed using group semantics. set of digits: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
* native character set numeric data item
The implementor-defined character set (1) A data item whose description restricts
associated with the computer specified in its content to a value represented by
the OBJECT-COMPUTER paragraph. characters chosen from the digits 0
through 9. If signed, the item can also
* native collating sequence
contain a +, -, or other representation of
The implementor-defined collating
an operational sign. (2) A data item of
category numeric, internal floating-point,
Glossary 839
WORKING-STORAGE SECTION * output file
01 TABLE-1. A file that is opened in either output
05 X PICS9.
mode or extend mode.
05 Y OCCURS 3 TIMES
DEPENDING ON X PIC X. * output mode
The state of a file after execution of an
The value of the ODO object determines OPEN statement, with the OUTPUT or EXTEND
how many of the ODO subject appear in phrase specified, for that file and before
the table. the execution of a CLOSE statement
ODO subject without the REEL or UNIT phrase for that
In the example above, Y is the subject of file.
the OCCURS DEPENDING ON clause (ODO * output procedure
subject). The number of Y ODO subjects A set of statements to which control is
that appear in the table depends on the | given during execution of a format 1 SORT
value of X. statement after the sort function is
* open mode completed, or during execution of a MERGE
The state of a file after execution of an statement after the merge function reaches
OPEN statement for that file and before the a point at which it can select the next
execution of a CLOSE statement without record in merged order when requested.
the REEL or UNIT phrase for that file. The overflow condition
particular open mode is specified in the A condition that occurs when a portion of
OPEN statement as either INPUT, OUTPUT, the result of an operation exceeds the
I-O, or EXTEND. capacity of the intended unit of storage.
* operand overload
(1) The general definition of operand is To define a method with the same name
the component that is operated upon. as another method that is available in the
(2) For the purposes of this document, same class, but with a different signature.
any lowercase word (or words) that See also signature.
appears in a statement or entry format
can be considered to be an operand and, override
as such, is an implied reference to the To redefine an instance method (inherited
data indicated by the operand. from a parent class) in a subclass.
operation P
A service that can be requested of an
object. package
A group of related Java classes, which can
* operational sign be imported individually or as a whole.
An algebraic sign that is associated with a
numeric data item or a numeric literal, to packed-decimal data item
indicate whether its value is positive or See internal decimal data item.
negative. padding character
optional file An alphanumeric or national character
A file that is declared as being not that is used to fill the unused character
necessarily available each time the object positions in a physical record.
program is run. page A vertical division of output data that
* optional word represents a physical separation of the
A reserved word that is included in a data. The separation is based on internal
specific format only to improve the logical requirements or external
readability of the language. Its presence is characteristics of the output medium or
optional to the user when the format in both.
which the word appears is used in a * page body
source unit. That part of the logical page in which
lines can be written or spaced or both.
Glossary 841
group of logically successive sections, runtime environment to execute it. (2) A
within the PROCEDURE DIVISION. logical assembly of one or more
interrelated modules. Multiple copies of
* procedure branching statement
the same program can be run in different
A statement that causes the explicit
processes.
transfer of control to a statement other
than the next executable statement in the * program identification entry
sequence in which the statements are In the PROGRAM-ID paragraph of the
written in the source code. The procedure IDENTIFICATION DIVISION, an entry that
branching statements are: ALTER, CALL, contains clauses that specify the
EXIT, EXIT PROGRAM, GO TO, MERGE (with the program-name and assign selected
OUTPUT PROCEDURE phrase), PERFORM and program attributes to the program.
SORT (with the INPUT PROCEDURE or OUTPUT
program-name
PROCEDURE phrase), XML PARSE.
In the IDENTIFICATION DIVISION and the
PROCEDURE DIVISION end program marker, a user-defined word
The COBOL division that contains or alphanumeric literal that identifies a
instructions for solving a problem. COBOL source program.
procedure integration project
One of the functions of the COBOL The complete set of data and actions that
optimizer is to simplify calls to performed are required to build a target, such as a
procedures or contained programs. dynamic link library (DLL) or other
executable (EXE).
PERFORM procedure integration is the
process whereby a PERFORM statement is * pseudo-text
replaced by its performed procedures. A sequence of text words, comment lines,
Contained program procedure integration or the separator space in a source
is the process where a call to a contained program or COBOL library bounded by,
program is replaced by the program code. but not including, pseudo-text delimiters.
* procedure-name * pseudo-text delimiter
A user-defined word that is used to name Two contiguous equal sign characters (==)
a paragraph or section in the PROCEDURE used to delimit pseudo-text.
DIVISION. It consists of a paragraph-name
* punctuation character
(which can be qualified) or a
A character that belongs to the following
section-name.
set:
procedure-pointer data item
A data item in which a pointer to an Character Meaning
entry point can be stored. A data item , Comma
defined with the USAGE IS ; Semicolon
PROCEDURE-POINTER clause contains the : Colon
address of a procedure entry point. . Period (full stop)
Typically used to communicate with " Quotation mark
COBOL and Language Environment ( Left parenthesis
programs. ) Right parenthesis
Space
process = Equal sign
The course of events that occurs during
the execution of all or part of a program.
Multiple processes can run concurrently, Q
and programs that run within a process
QSAM (Queued Sequential Access Method)
can share resources.
An extended version of the basic
program sequential access method (BSAM). When
(1) A sequence of instructions suitable for this method is used, a queue is formed of
processing by a computer. Processing may input data blocks that are awaiting
include the use of a compiler to prepare processing or of output data blocks that
the program for execution, as well as a
Glossary 843
Character Meaning by an integer value greater than zero,
> Greater than which specifies the logical ordinal
< Less than position of the record in the file.
= Equal to * relative record number
The ordinal number of a record in a file
* relation condition whose organization is relative. This
The proposition (for which a truth value number is treated as a numeric literal that
can be determined) that the value of an is an integer.
arithmetic expression, data item, * reserved word
alphanumeric literal, or index-name has a A COBOL word that is specified in the
specific relationship to the value of list of words that can be used in a
another arithmetic expression, data item, COBOL source program, but that must
alphanumeric literal, or index name. See not appear in the program as a
also relational operator. user-defined word or system-name.
* relational operator * resource
A reserved word, a relation character, a A facility or service, controlled by the
group of consecutive reserved words, or a operating system, that an executing
group of consecutive reserved words and program can use.
relation characters used in the
construction of a relation condition. The * resultant identifier
permissible operators and their meanings A user-defined data item that is to contain
are: the result of an arithmetic operation.
Glossary 845
* sign condition environment, where the source program is
The proposition (for which a truth value compiled, is described.
can be determined) that the algebraic
* source computer entry
value of a data item or an arithmetic
An entry in the SOURCE-COMPUTER
expression is either less than, greater than,
paragraph of the ENVIRONMENT DIVISION;
or equal to zero.
this entry contains clauses that describe
signature the computer environment in which the
(1) The name of an operation and its source program is to be compiled.
parameters. (2) The name of a method
* source item
and the number and types of its formal
An identifier designated by a SOURCE
parameters.
clause that provides the value of a
* simple condition printable item.
Any single condition chosen from this set:
source program
v Relation condition Although a source program can be
v Class condition represented by other forms and symbols,
v Condition-name condition in this document the term always refers
to a syntactically correct set of COBOL
v Switch-status condition
statements. A COBOL source program
v Sign condition commences with the IDENTIFICATION
See also condition and negated simple DIVISION or a COPY statement and
condition. terminates with the end program marker,
if specified, or with the absence of
single-byte character set (SBCS) additional source program lines.
A set of characters in which each
character is represented by a single byte. source unit
See also ASCII and EBCDIC (Extended A unit of COBOL source code that can be
Binary-Coded Decimal Interchange Code). separately compiled: a program or a class
definition. Also known as a compilation
slack bytes unit.
Bytes inserted between data items or
records to ensure correct alignment of special character
some numeric items. Slack bytes contain A character that belongs to the following
no meaningful data. In some cases, they set:
are inserted by the compiler; in others, it
Character Meaning
is the responsibility of the programmer to
+ Plus sign
insert them. The SYNCHRONIZED clause
- Minus sign (hyphen)
instructs the compiler to insert slack bytes
* Asterisk
when they are needed for proper
/ Slant (forward slash)
alignment. Slack bytes between records
= Equal sign
are inserted by the programmer.
$ Currency sign
* sort file , Comma
A collection of records to be sorted by a ; Semicolon
| format 1 SORT statement. The sort file is . Period (decimal point, full stop)
created and can be used by the sort " Quotation mark
function only. ' Apostrophe
( Left parenthesis
* sort-merge file description entry
) Right parenthesis
An entry in the FILE SECTION of the DATA
> Greater than
DIVISION that is composed of the level
< Less than
indicator SD, followed by a file-name, and
: Colon
then followed by a set of file clauses as
_ Underscore
required.
* SOURCE-COMPUTER SPECIAL-NAMES
The name of an ENVIRONMENT DIVISION The name of an ENVIRONMENT DIVISION
paragraph in which the computer
Glossary 847
T trailer-label
(1) A data-set label that follows the data
* table
records on a unit of recording medium.
A set of logically consecutive items of
(2) Synonym for end-of-file label.
data that are defined in the DATA DIVISION
by means of the OCCURS clause. troubleshoot
To detect, locate, and eliminate problems
* table element
in using computer software.
A data item that belongs to the set of
repeated items comprising a table. * truth value
The representation of the result of the
text deck
evaluation of a condition in terms of one
Synonym for object deck or object module.
of two values: true or false.
* text-name
typed object reference
A user-defined word that identifies library
A data-name that can refer only to an
text.
object of a specified class or any of its
* text word subclasses.
A character or a sequence of contiguous
characters between margin A and margin U
R in a COBOL library, source program, or
* unary operator
pseudo-text that is any of the following
A plus (+) or a minus (-) sign that
characters:
precedes a variable or a left parenthesis in
v A separator, except for space; a an arithmetic expression and that has the
pseudo-text delimiter; and the opening effect of multiplying the expression by +1
and closing delimiters for alphanumeric or -1, respectively.
literals. The right parenthesis and left
parenthesis characters, regardless of Unicode
context within the library, source A universal character encoding standard
program, or pseudo-text, are always that supports the interchange, processing,
considered text words. and display of text that is written in any
of the languages of the modern world.
v A literal including, in the case of
There are multiple encoding schemes to
alphanumeric literals, the opening
represent Unicode, including UTF-8,
quotation mark and the closing
UTF-16, and UTF-32. Enterprise COBOL
quotation mark that bound the literal.
supports Unicode using UTF-16 in
v Any other sequence of contiguous big-endian format as the representation
COBOL characters except comment for the national data type.
lines and the word COPY bounded by
separators that are neither a separator Uniform Resource Identifier (URI)
nor a literal. A sequence of characters that uniquely
names a resource; in Enterprise COBOL,
thread the identifier of a namespace. URI syntax
A stream of computer instructions is defined by the document Uniform
(initiated by an application within a Resource Identifier (URI): Generic Syntax.
process) that is in control of a process.
unit A module of direct access, the dimensions
token In the COBOL editor, a unit of meaning in of which are determined by IBM.
a program. A token can contain data, a
language keyword, an identifier, or other universal object reference
part of the language syntax. A data-name that can refer to an object of
any class.
top-down design
The design of a computer program using unrestricted storage
a hierarchic structure in which related Storage below the 2 GB bar. It can be
functions are performed at each level of above or below the 16 MB line. If it is
the structure. above the 16 MB line, it is addressable
only in 31-bit mode.
top-down development
See structured programming.
V W
* variable web service
A data item whose value can be changed A modular application that performs
by execution of the object program. A specific tasks and is accessible through
variable used in an arithmetic expression open protocols like HTTP and SOAP.
must be a numeric elementary item.
white space
variable-length item Characters that introduce space into a
A group item that contains a table document. They are:
described with the DEPENDING phrase of v Space
the OCCURS clause.
v Horizontal tabulation
* variable-length record v Carriage return
A record associated with a file whose file
v Line feed
description or sort-merge description
entry permits records to contain a varying v Next line
number of character positions. as named in the Unicode Standard.
* variable-occurrence data item * word
A variable-occurrence data item is a table A character string of not more than 30
element that is repeated a variable characters that forms a user-defined word,
number of times. Such an item must a system-name, a reserved word, or a
contain an OCCURS DEPENDING ON clause in function-name.
its data description entry or be
subordinate to such an item. * WORKING-STORAGE SECTION
The section of the DATA DIVISION that
* variably located group describes WORKING-STORAGE data items,
A group item following, and not composed either of noncontiguous items
subordinate to, a variable-length table in or WORKING-STORAGE records or of both.
the same record. The group item can be
an alphanumeric group or a national workstation
group. A generic term for computers, including
personal computers, 3270 terminals,
* variably located item intelligent workstations, and UNIX
A data item following, and not terminals. Often a workstation is
subordinate to, a variable-length table in connected to a mainframe or to a
the same record. network.
Glossary 849
wrapper and content of XML documents. An XML
An object that provides an interface schema, which is itself expressed in XML,
between object-oriented code and effectively defines a class of XML
procedure-oriented code. Using wrappers documents of a given type, for example,
lets programs be reused and accessed by purchase orders.
other systems.
Z
X
z/OS UNIX file system
x The symbol in a PICTURE clause that can A collection of files and directories that
hold any character in the character set of are organized in a hierarchical structure
the computer. and can be accessed by using z/OS
UNIX.
XML Extensible Markup Language. A standard
metalanguage for defining markup zoned decimal data item
languages that was derived from and is a An external decimal data item that is
subset of SGML. XML omits the more described implicitly or explicitly as USAGE
complex and less-used parts of SGML and DISPLAY and that contains a valid
makes it much easier to write applications combination of PICTURE symbols 9, S, P,
to handle document types, author and and V. The content of a zoned decimal
manage structured information, and data item is represented in characters 0
transmit and share structured information through 9, optionally with a sign. If the
across diverse computing systems. The PICTURE string specifies a sign and the
use of XML does not require the robust SIGN IS SEPARATE clause is specified, the
applications and processing that is sign is represented as characters + or -. If
necessary for SGML. XML is developed SIGN IS SEPARATE is not specified, the
under the auspices of the World Wide sign is one hexadecimal digit that
Web Consortium (W3C). overlays the first 4 bits of the sign
position (leading or trailing).
XML data
Data that is organized into a hierarchical
#
structure with XML elements. The data
definitions are defined in XML element | 85 COBOL Standard
type declarations. The COBOL language defined by the
following standards:
XML declaration
XML text that specifies characteristics of v ANSI INCITS 23-1985, Programming
the XML document such as the version of languages - COBOL, as amended by
XML being used and the encoding of the ANSI INCITS 23a-1989, Programming
document. Languages - COBOL - Intrinsic Function
Module for COBOL and ANSI INCITS
XML document 23b-1993, Programming Languages -
A data object that is well formed as Correction Amendment for COBOL
defined by the W3C XML specification.
v ISO 1989:1985, Programming languages -
XML namespace COBOL, as amended by ISO/IEC
A mechanism, defined by the W3C XML 1989/AMD1:1992, Programming languages
Namespace specifications, that limits the - COBOL: Intrinsic function module and
scope of a collection of element names ISO/IEC 1989/AMD2:1994, Programming
and attribute names. A uniquely chosen languages - Correction and clarification
XML namespace ensures the unique amendment for COBOL
identity of an element name or attribute
| 2002 COBOL Standard
name across multiple XML documents or
The COBOL language defined by the
multiple contexts within an XML
following standards:
document.
v INCITS/ISO/IEC 1989-2002,
XML schema Information Technology - Programming
A mechanism, defined by the W3C, for Languages - COBOL
describing and constraining the structure
Glossary 851
852 Enterprise COBOL for z/OS, V5.2 Programming Guide
List of resources
z/OS DFSMS
Enterprise COBOL for z/OS
v Access Method Services for Catalogs
COBOL for z/OS publications v Checkpoint/Restart
You can find the following publications in the v Macro Instructions for Data Sets
Enterprise COBOL for z/OS library: v Using Data Sets
v Customization Guide, SC14-7380 v Utilities
v Language Reference, SC14-7381
z/OS DFSORT
v Programming Guide, SC14-7382
v Application Programming Guide
v Migration Guide, GC14-7383
v Installation and Customization
v Program Directory, GI11-9180
v Licensed Program Specifications, GI11-9181 z/OS ISPF
v Dialog Developer's Guide and Reference
Softcopy publications
v User's Guide Vol I
The following collection kits contain Enterprise v User's Guide Vol II
COBOL and other product publications. You can
find them at http://www-05.ibm.com/e- z/OS Language Environment
business/linkweb/publications/servlet/pbi.wss. v Concepts Guide
v z/OS Software Products Collection v Customization
v z/OS and Software Products DVD Collection v Debugging Guide
v Programming Guide
Support
v Programming Reference
Performance Tuning, www.ibm.com/support/ v Run-Time Messages
docview.wss?uid=swg27018287 v Run-Time Application Migration Guide
v Language Environment Vendor Interfaces
If you have a problem using Enterprise COBOL
for z/OS, see the following site, which provides v Writing Interlanguage Communication Applications
up-to-date support information:
www.ibm.com/software/awdtools/cobol/zos/ z/OS MVS
support. v JCL Reference
v JCL User's Guide
Related publications v Program Management: User's Guide and Reference
v System Commands
z/OS library publications
v z/OS Unicode Services User's Guide and Reference
You can find the following publications in the v z/OS XML System Services User's Guide and
z/OS Internet Library. Reference
IMS
v Application Programming API Reference,
SC18-9699
v Application Programming Guide, SC18-9698
Index 857
class condition COBOL (continued) coding (continued)
testing object-oriented (continued) OO programs
for DBCS 151 compiling using JCL or must be reentrant 480
for Kanji 151 TSO/E 295 overview 579
for numeric 54 linking 292 PROCEDURE DIVISION 17
overview 98 running 293 programs to run under CICS
validating data 379 under IMS 448 calls 421
CLASSPATH environment variable COBOL client DISPLAY statement 420
description 455 example 615 I/O 420
example of setting 297 example of passing object must be reentrant 480
specifying location of Java references 602 overview 419
classes 293 COBOL DLL programs, calling 503 restrictions 419
client COBOL terms 23 SORT statement 428
defining 596 COBOL3 translator option 426 system date, getting 421
definition of 596 COBOPT environment variable 283 programs to run under DB2
CLIST for compiling under TSO 264 code CCSID of string data 437
CLOSE statement copy 665 overview 431
line-sequential files 215 optimized 657 stored procedures must be
QSAM 170 code page reentrant 480
VSAM 193 conflict in XML documents 545 programs to run under IMS
closing files DBCS 315 must be reentrant 480
line-sequential 217 definition 129 overview 443
multithreading serialization 510 euro currency support 65 restrictions 443
QSAM hexadecimal values of special simplifying 665
overview 173 characters 540 SQL statements
with multithreading 173 of DB2 string data 437 overview 432
VSAM overriding 140 restriction 432
overview 200 specifying 313 SQLIMS statements
with multithreading 201 specifying for alphanumeric XML overview 444
closing files, automatic document 539 subclasses
line-sequential 217 code point, definition 129 example 610
QSAM 173 CODE-SET clause 14 overview 607
VSAM 200 coded character set tables 67
cluster, VSAM 203 definition 129 techniques 11, 651
cob2 command in XML documents 536 test conditions 99
compiling with CODEPAGE compiler option collating sequence
examples 286 DBCS code pages 315 alternate
overview 285 description 313 choosing 229
description 287 for national literals 137 example 7
for compiling OO applications 291 items that are not affected 314 ASCII 7
for creating DLLs 286 operations that override 314 binary for national keys 228
for linking OO applications 292 coding EBCDIC 7
input and output 288 class definition 582 HIGH-VALUE 7
linking with clients 596 ISO 7-bit code 7
examples 286 condition tests 99 LOW-VALUE 7
overview 285 constructor methods 612 MERGE 7, 229
options and syntax 287 DATA DIVISION 11 NATIVE 7
COBJVMINITOPTIONS environment decisions 93 nonnumeric comparisons 6
variable efficiently 651 ordinal position of a character 119
description 455 ENVIRONMENT DIVISION 5 SEARCH ALL 7
specifying JVM options 295 errors, avoiding 651 SORT 7, 229
COBOL EVALUATE statement 95 specifying 6
and Java factory definition 611 STANDARD-1 7
binding 296 factory methods 612 STANDARD-2 7
communicating between 623 file input/output (overview) 153 symbolic characters in the 8
compatibility 300 IDENTIFICATION DIVISION 3 COLLATING SEQUENCE phrase
compiling under z/OS UNIX 291 IF statement 93 does not apply to national keys 228
compiling using JCL or input/output overview 156 overrides PROGRAM COLLATING
TSO/E 295 input/output statements SEQUENCE clause 6, 229
linking 292 for line-sequential files 215 use in SORT or MERGE 229
running 293, 296 for QSAM files 170 columns in tables 67
structuring applications 620 for VSAM files 193 COMMON attribute 4, 474
under IMS 448 instance methods 587, 609 COMP (COMPUTATIONAL) 48
object-oriented interoperable data types with COMP-1 (COMPUTATIONAL-1)
binding 296 Java 628 format 50
compiling under z/OS UNIX 291 loops 101 performance tips 654
Index 859
compiler options (continued) compiling and linking in the z/OS UNIX continuation
SQLCCSID (continued) shell (continued) entry 235
effect on CCSID of string examples 286 of program 241
data 437 OO applications syntax checking 316
performance considerations 438 cob2 command 292 CONTINUE statement 93
recommended with DB2 example 293 control
coprocessor 438 overview 285 in nested programs 474
SQLIMS 356 completion code program flow 93
SSRANGE 357, 383 merge 230 transfer 463
performance considerations 661 sort 230 control interval size (CISZ), performance
status 391 complex OCCURS DEPENDING ON considerations 210, 663
STGOPT 358 basic forms of 81 CONTROL statement 373
table of 301 complex ODO item 82 converting data items
TERMINAL 359 variably located data item 82 between code pages 119
TEST variably located group 82 between data formats 52
description 359 computation exceptions with national data 140
performance considerations 661 arithmetic data items 653 precision 52
use for debugging 387 of indexes 72 reversing order of characters 117
THREAD of subscripts 656 to alphanumeric
debugging restriction 380 COMPUTATIONAL (COMP) 48 with DISPLAY 36
description 362 COMPUTATIONAL-1 (COMP-1) with DISPLAY-OF 139
performance considerations 661 format 50 to Chinese GB 18030 from
TRUNC performance tips 654 national 146
description 363 COMPUTATIONAL-2 (COMP-2) to integers with INTEGER,
performance considerations 661 format 50 INTEGER-PART 114
under IMS and CICS 420 performance tips 654 to national
VBREF 366, 387 COMPUTATIONAL-3 (COMP-3) from Chinese GB 18030 146
VLR description 50 from UTF-8 141
description 366 COMPUTATIONAL-4 (COMP-4) 48 with ACCEPT 35
WORD 367 COMPUTATIONAL-5 (COMP-5) 49 with MOVE 138
XMLPARSE 368 COMPUTE statement with NATIONAL-OF 139
XREF 369, 386 assigning arithmetic results 34 to numbers with NUMVAL,
ZONEDATA 370 simpler to code 56 NUMVAL-C 117
ZWB 372 computer, describing 5 to uppercase or lowercase
Compiler options concatenating data items (STRING) 105 with INSPECT 116
listing example 405 condition handling with intrinsic functions 117
compiler-directing statements closing QSAM files 173 to UTF-8 from national 141
description 373 closing VSAM files 200 with INSPECT 115
overview 20 in input or output procedures 225 with intrinsic functions 116
compiling using Language Environment 667 CONVERTING phrase (INSPECT),
batch 275 condition testing 99 example 116
control of 272 conditional expression coprocessor, DB2
data sets for 267 EVALUATE statement 93 CCSID determination of string
DLLs 286 IF statement 93 data 437
from an assembler program 265 PERFORM statement 103 differences from the precompiler 439
OO applications conditional statement enable with SQL compiler option 435
cob2 command 291 overview 19 overview 431
example 293, 298 with NOT phrase 19 recommended compiler option
under z/OS UNIX 291 with object references 599 SQLCCSID 438
using JCL or TSO/E 295 CONFIGURATION SECTION 5 using SQL INCLUDE with 433
under TSO conflicting compiler options 304 coprocessor, IMS
example CLIST 264 conformance requirements enable with SQLIMS compiler
| overview 262 85 COBOL Standard 304 option 446
under z/OS 255 example of passing object references overview 443
under z/OS UNIX 283 in INVOKE 602 copy libraries
using shell script 290 RETURNING phrase of INVOKE 603 COPY statement 373
using the cob2 command USING phrase of INVOKE 601 data set 267
examples 286 Constant area 409 example 666
overview 285 constants search order 374
with cataloged procedures 256 data items 652 specifying 270
compile 257 definition 26 SYSLIB 270
compile and link-edit 258 figurative, definition 26 z/OS UNIX search order 284, 288
compile, link-edit, run 259 contained program integration 658 COPY statement
with JCL (job control language) 256 CONTENT-CHARACTERS XML event DB2 considerations 439
compiling and linking in the z/OS UNIX example 557 description 373
shell when parsing segments 534 example 666
DLLs 286 nested 665, 704
Index 861
DB2 (continued) DD control statement (continued) DELETE statement (continued)
coprocessor (continued) ASCII tape files 183 VSAM, coding 193
database request module creating QSAM files 174, 177 deleting records from VSAM file 200
(DBRM) 432, 436 DBRMLIB 436 delimited scope statement
differences from the DCB overrides data-set label 176 description of 19
precompiler 439 define file 8 nested 21
enable with SQL compiler defining merge data sets 226 DEPENDING ON clause 162, 192
option 435 defining sort data sets 226 depth in tables 69
overview 431 JAVAERR 297 device
recommended compiler option JAVAIN 297 classes 267
SQLCCSID 438 JAVAOUT 297 requirements 267
using SQL INCLUDE with 433 RLS parameter 207 DFHCOMMAREA parameter
DYNAM compiler option with TSO or SYSADATA 271 calling nested CICS programs 422
IMS 441 SYSIN 269 calling separately compiled CICS
NODYNAM compiler option with SYSJAVA 272 programs 421
CICS or CAF 441 SYSLIB 270 DFHEIBLK parameter
precompiler SYSLIN 271 calling nested CICS programs 422
differences from the SYSMDECK 272 calling separately compiled CICS
coprocessor 439 SYSOPTF 269 programs 421
recommended compiler option SYSPRINT 270 DFSORT
NOSQLCCSID 438 SYSPUNCH 271 defining data sets for 226
specifying code page for host ddname definition 8 error message for RETURN
variables 433 deadlock in I/O error declarative 244 statement 224
SQL compiler option 435 Debug Tool diagnostics, program 391
SQL statements compiler options for 387 DIAGTRUNC compiler option 319
CCSID determination 437 description 377 direct-access
coding 432 debugging direct indexing 72
overview 431 and performance 360 file organization 154
return codes 435 compiler options for storage device (DASD) 210
SQL DECLARE 433 overview 382 directories
SQL INCLUDE 433 TEST restriction 380 adding a path to 288
using binary data in 435 THREAD restriction 380 disability xxii
using character data in 433 overview 377 DISPLAY (USAGE IS)
using national decimal data 434 runtime options for 380 encoding and storage 137
SQLCCSID compiler option 437 using COBOL language features 378 external decimal 47
DBCS comparison 98 using the debugger 387 floating point 48
DBCS compiler option debugging, language features display floating-point data (USAGE
description 318 class test 379 DISPLAY) 48
for Java interoperability 291, 295 debugging lines 380 DISPLAY statement
for OO COBOL 291, 295 debugging statements 380 directing output 344
multioption interaction 305 declaratives 380 displaying data values 35
DBCS data DISPLAY statements 378 displaying on the system logical
comparing file status keys 379 output device 36
to national 149 INITIALIZE statements 380 interaction with OUTDD 36
converting scope terminators 378 suppressing line spacing 37
to alphanumeric with SET statements 380 under CICS 420
IGZCD2A 688 WITH DEBUGGING MODE using in debugging 378
to and from alphanumeric 685 clause 380 writing to stdout or stderr 36
to national, overview 152 DECK compiler option 319 DISPLAY-1 (USAGE IS)
declaring 150 declarative procedures encoding and storage 137
encoding and storage 137 EXCEPTION/ERROR 244 DISPLAY-OF intrinsic function
literals with multithreading 244 example with Chinese data 147
description 26 USE FOR DEBUGGING 380 example with Greek data 140
maximum length 151 deferred restart 645 example with UTF-8 data 141
using 150 defining using 139
MOVE statement with 32 files, overview 8, 153 with XML documents 538
notation for 685 libraries 270 DISPSIGN compiler option 320
testing for 151 line-sequential files to z/OS 215 DLL compiler option
dbg suffix with cob2 289 QSAM files description 321
DBRM data set to z/OS 174, 177 for Java interoperability 291, 295
defining 436 sort or merge files under z/OS 226 for OO COBOL 291, 295
description 432 VSAM files multioption interaction 305
DBRMLIB DD statement 432, 436 to z/OS 203 DLL igzcjava.x
DCB 169 dek suffix with cob2 289 binding with
DD control statement DELETE statement example 298
allocating line-sequential files 215 compiler-directing 375 preparing OO applications 297
AMP parameter 206 multithreading serialization 510
Index 863
error (continued) EXIT compiler option (continued) FASTSRT compiler option
processing (continued) user-exit work area 701 description 327
XML PARSE 544 using 324 improving sort performance 231, 660
routines for handling 250 exit modules information message 231
error messages called for SYSADATA data set 707 requirements
compiler calling COBOL programs 702 JCL 231
choosing severity to be error messages generated 717 QSAM 232
flagged 384 message severity customization 709 sort input and output files 231
correcting source 280 used in place of library-name 703 VSAM 233
customizing 710 used in place of SYSLIB 703 FD (file description) entry 12
determining what severity level to used in place of SYSPRINT 706 figurative constants
produce 327 EXIT PROGRAM statement definition 26
embedding in source listing 384 in subprogram 464 HIGH-VALUE restriction 132
format 281 with multithreading 464 national-character 132
from exit modules 717 explicit scope terminator 20 file access mode
generating a list of 280 exponentiation choosing 155
location in listing 281 evaluated in fixed-point dynamic 191
sending to terminal 271 arithmetic 678 example 191
severity levels 282, 711 evaluated in floating-point for indexed files (KSDS) 191
compiler-directed 280 arithmetic 683 for relative files (RRDS) 191
ESDS (entry-sequenced data sets) performance tips 654 for sequential files (ESDS) 191
file access mode 191 EXPORTALL compiler option performance considerations 210
organization 188 description 326 random 191
euro currency sign 65 DLL considerations 498 sequential 191
EVALUATE statement multioption interaction 305 summary table of 188
case structure 95 extended mode 43, 675 file allocation 157
coding 95 external class-name 585, 597 file availability
contrasted with nested IFs 96, 97 EXTERNAL clause QSAM files under z/OS 171
example that tests several example for files 492 VSAM files under z/OS 202
conditions 97 for data items 491 file description (FD) entry 12
example with multiple WHEN for sharing files 12, 491 file organization
phrases 97 external data choosing 155
example with THRU phrase 96 obtaining storage for 42 comparison of ESDS, KSDS,
performance 96 sharing 491 RRDS 187
structured programming 652 storage location of 42 indexed 154, 188
testing multiple values, example 100, external decimal data line-sequential 213
101 national 47 overview 153
use to test multiple conditions 93 zoned 47 QSAM 159
evaluating data item contents external file 491 relative 154
class test external floating-point data relative-record 190
for numeric 54 display 48 sequential 153, 188
overview 98 national 48 VSAM 186
INSPECT statement 115 External symbols 410 file position indicator (CRP) 195, 198
intrinsic functions 119 FILE SECTION
exception condition BLOCK CONTAINS clause 13
CALL 250
XML GENERATE 567
F CODE-SET clause 14
DATA RECORDS clause 13
F-format record
XML PARSE 544 description 11
layout 162
exception handling EXTERNAL clause 12
requesting 161
with Java 624 FD entry 12
factoring expressions 652
with XML GENERATE 567 GLOBAL clause 12
factory data
with XML PARSE 542 LABEL RECORDS clause 13
defining 612
EXCEPTION XML event 544 LINAGE clause 13
definition of 579
EXCEPTION/ERROR declarative OMITTED 13
making it accessible 612
description 244 RECORD CONTAINS clause 13
private 612
file status key 246 record description 11
factory definition, coding 611
line-sequential error processing 218 RECORD IS VARYING 13
factory methods
QSAM error processing 174 RECORDING MODE clause 14
defining 612
VSAM error processing 201 VALUE OF 13
definition of 579
EXEC control statement, RD parameter FILE STATUS clause
hiding 613
of 644 description 158
invoking 614
EXIT compiler option example 249
using to wrap procedural
considerations for SQL and CICS line-sequential error processing 218
programs 620
statements 718 NOFASTSRT error processing 233
FACTORY paragraph
description 324 QSAM error processing 174
factory data 612
MSGEXIT suboption 709 using 245
factory methods 612
register usage 702 VSAM error processing 201
factory section, defining 611
Index 865
group move contrasted with elementary IGZETUN module INITIAL clause
move 33, 135 with multithreading 514 effect on main program 465
GROUP-USAGE NATIONAL clause IGZSRTCD data set 235 effect on nested programs 5
communicating with Java 628 imperative statement, list 19 setting programs to initial state 5
defining a national group 134 implicit scope terminator 20 INITIALIZE statement
defining tables 68 IMS examples 28
example of declaring a national COBOL-Java interoperability loading group values 30
group 24 accessing databases 450 loading national group values 31
initializing a national group 31 calling COBOL method from loading table values 73
grouping data to pass as an Java 448 REPLACING phrase 73
argument 486 calling Java method from using for debugging 380
COBOL 449 initializing
messages 450 a group item
H restriction on EXEC SQL 450
STOP RUN 450
using a VALUE clause 76
using INITIALIZE 30, 73
header on listing 5
synchronizing transactions 450 a national group item
HEAP runtime option
using the AIB 450 using a VALUE clause 76
influencing data location 42
coding programs under using INITIALIZE 31, 74
multioption interaction 40
overview 443 a structure using INITIALIZE 30
hexadecimal literals
restrictions 5, 443 a table
as currency sign 65
compiling and linking for 447 all occurrences of an element 76
national
coprocessor at the group level 76
description 26
overview 443 each item individually 75
using 131
performance considerations 663 using INITIALIZE 73
HGPR compiler option 330
SQLIMS compiler option 446 using PERFORM VARYING 103
performance considerations 660
SQLIMS statements 445 examples 28
hiding factory methods 613
return codes 445 instance data 604
hierarchy of compiler options
SQLIMS INCLUDE 444 variable-length group 81
in batch 277
using character data in 445 inline PERFORM
in SYSOPTF data sets 342
using EXEC SQL under IMS 450 example 102
under z/OS 272
IMS SQL overview 102
under z/OS UNIX 284
coprocessor 444 input
incrementing addresses 487 coding for CICS 420
index coding for line-sequential files 215
I assigning a value to 72 coding for QSAM files 170
I-level message 282, 384 computation of element displacement, coding for VSAM files 193
IDENTIFICATION DIVISION example 70 from files 153
class 584 creating with OCCURS INDEXED BY to compiler, under z/OS 267
CLASS-ID paragraph 584, 608 clause 72 input procedure
client 596 definition 70 coding 222
coding 3 incrementing or decrementing 72 example 228
DATE-COMPILED paragraph 3 initializing 72 FASTSRT option not effective 232
errors 3 key, detecting faulty 249 requires RELEASE or RELEASE
listing header example 5 range checking 383 FROM 223
method 588 referencing other tables with 72 restrictions 225
PROGRAM-ID paragraph 3 index data item INPUT-OUTPUT SECTION 5
required paragraphs 3 cannot use as subscript or index 73 input/output
subclass 608 creating with USAGE IS INDEX checking for errors 245
TITLE statement 5 clause 72 coding overview 156
IF statement indexed file organization controlling with FASTSRT option 327
coding 93 description 154 logic flow after error 241
nested 94 specifying 188 overview 153
use EVALUATE instead for multiple indexing processing errors
conditions 94 computation of element displacement, line-sequential files 218
with null branch 93 example 70 QSAM files 174, 241
IGZCA2D service routine 685 definition 70 VSAM files 201, 241
IGZCD2A service routine 688 example 77 input/output coding
igzcjava.x preferred to subscripting 654 AT END (end-of-file) phrase 244
binding with tables 72 checking for successful operation 245
example 298 INEXIT suboption of EXIT option checking VSAM status codes 246
preparing OO applications 297 processing of 702 detecting faulty index key 249
linking with syntax 325 error handling techniques 241
example 293 inheritance hierarchy, definition of 581 EXCEPTION/ERROR
preparing OO applications 292 INITIAL attribute declaratives 244
IGZEOPT module effect on subprograms 466, 467 INSERT statement 375
with multithreading 514 use of dynamic call and CANCEL INSPECT statement
instead 468 avoid with UTF-8 data 541
Index 867
Java (continued) keys level-88 item
string array 629 alternate in KSDS file 189 conditional expressions 98
strings for binary search 87 setting switches off, example 101
declaring 629 for merging setting switches on, example 100
manipulating 632 defining 227 switches and flags 99
Java virtual machine overview 220 testing multiple values, example 100
exceptions 625 for sorting testing single values, example 99
initializing 294 defining 227 level-number 393
object references 626 overview 220 LIBEXIT suboption of EXIT option
java.lang.Object permissible data types processing of 703
referring to as Base 584 in MERGE statement 228 syntax 325
javac command in OCCURS clause 68 libjvm.x
compiling Java class definitions 291 in SORT statement 228 binding with
recompile for Java 5 or Java 6 300 prime in KSDS file 188 example 298
JAVAERR data set 297 relative-record 190 preparing OO applications 297
JAVAIN data set 297 to specify order of table elements 68 linking with
JAVAOUT data set 297 KSDS (key-sequenced data sets) example 293
JCL file access mode 191 preparing OO applications 292
ASCII tape files 183 organization 188 with EBCDIC services 634
cataloged procedures 256 LIBPATH environment variable
example of checkpoint/restart 647 description 455
FASTSRT requirement 231
for compiling 256
L example of setting 297
specifying location for COBOL
LABEL RECORDS clause
for compiling in the z/OS UNIX file classes 293
FILE SECTION entry 13
system 258 library
LANGUAGE compiler option
for line-sequential files 215 BASIS 270
description 331
for merge 226 COPY 270
Language Environment callable services
for OO applications 295 defining 270
condition handling 667
example 298 directory entry 265
corresponding math intrinsic
for QSAM files 176 specifying path for 373
functions 58
for sort 226 library-name
date and time computations 667
for VSAM data sets 206 alternative if not specified 288
differences from intrinsic
JNI cross-reference to data-set names 413
functions 59
accessing services 623 when not used 703
dynamic storage services 667
comparing object references 599 library-name environment variable 284
example of using 670
converting local references to limits of the compiler
feedback code 669
global 604 DATA DIVISION 11
for date and time 60
EBCDIC services 633 user data 11
for mathematics 58
environment structure 623 line number 392
invoking with CALL 669
addressability for 623 line-sequential files
mathematics 667
exception handling services 624 adding records to 217
message handling 668
Java array services 630 blocking 12
national language support 668
Java string services 632 closing 217
omitted feedback code 669
obtaining class object reference 624 closing to prevent reopening 216
overview 667
restrictions when using 624 control characters in 214
return code 670
Unicode services 632 DATA DIVISION entries 214
RETURN-CODE special register 670
UTF-8 services 634 ENVIRONMENT DIVISION
sample list of 668
JNI.cpy entries 213
types of 667
for compiling 291 input/output error processing 218
large block interface (LBI) 169
for JNINativeInterface 623 input/output statements for 215
largest or smallest item, finding 120
listing 721 national data not supported 217
last-used state
JNIEnvPtr special register opening 216
subprograms with EXIT PROGRAM
use for JNI callable services 623 organization 213
or GOBACK 465
JNINativeInterface processing 213
subprograms without INITIAL
environment structure 623 reading from 215
attribute 466, 467
JNI.cpy 623 reading records from 216
LBI (large block interface) 169
JOB control statement, RD parameter under z/OS
LENGTH intrinsic function
of 644 allocating 215
compared with LENGTH OF special
job resubmission 647 creating 215
register 122
job stream 463 job control language (JCL) 215
example 61, 122
jstring Java class 628 writing to 215
using 119
LINECOUNT compiler option 332
variable-length results 121
LINK macro 265
with national data 122
K length of data items, finding 122
LINKAGE SECTION
coding 485
Kanji comparison 98 LENGTH OF special register
for describing parameters 484
Kanji data, testing for 151 passing 482
with recursive calls 17
keyboard navigation xxii using 122
Index 869
methods (continued) multithreading (continued) national data (continued)
obtaining passed arguments 591 overview 507 encoding in XML documents 537
overloading 592 preinitializing 509 evaluating with intrinsic
overriding 591, 613 preparing COBOL programs for 507 functions 119
returning a value from 591 recursion 509 external decimal 47
signature 588 recursive requirement 513 external floating-point 48
migration considerations reentrancy 513 figurative constants 132
Java and COBOL 300 reentrancy requirement 513 finding the smallest or largest
MIN intrinsic function runtime restrictions 514 item 120
example 114 sort and merge restriction 219 in conditional expressions 147, 148
using 120 STOP RUN statement 464 in generated XML documents 562
mixed DBCS/EBCDIC literal synchronizing access to in keys
alphanumeric to DBCS resources 513 in MERGE statement 228
conversion 685 terminology 508 in OCCURS clause 68
DBCS to alphanumeric THREAD compiler option in SORT statement 228
conversion 688 restrictions with 362 initializing, example of 29
mnemonic-name when to choose 509 input with ACCEPT 35
SPECIAL-NAMES paragraph 5 UPSI switches 514 inspecting (INSPECT) 115
MOVE statement with PL/I tasks 513 LENGTH intrinsic function and 122
assigning arithmetic results 34 LENGTH OF special register 122
converting to national data 138 literals
CORRESPONDING 33
effect of ODO on lengths of sending
N using 131
MOVE statement with 32, 138
N delimiter for national or DBCS
and receiving items 79 NSYMBOL compiler option if no
literals 26
group move contrasted with USAGE clause 131
NAME compiler option
elementary move 33, 135 reference modification of 112
description 337
with elementary receiving items 32 reversing characters 117
using 3
with group receiving items 33 specifying 130
name declaration
with national items 32 splitting (UNSTRING) 108
searching for 476
MSGEXIT suboption of EXIT option VALUE clause with alphanumeric
NAMESPACE-DECLARATION XML
effect on compilation return code 712 literal, example 121
event 528
example user exit 713 national decimal data (USAGE
naming
message severity levels 711 NATIONAL)
files 8
processing of 709 defining 133
programs 3
syntax 325 example 43
NATIONAL (USAGE IS)
MSGFILE runtime option 344 format 47
external decimal 47
multiple currency signs initializing, example of 29
floating point 48
example 66 national floating-point data (USAGE
national comparison 98
using 65 NATIONAL)
national data
multiple inheritance, not permitted 582, defining 133
communicating with Java 628
607 definition 48
comparing
multiple thread environment, running national group item
overview 147
in 362 advantages over alphanumeric
to alphabetic, alphanumeric, or
multithreading groups 133
DBCS 149
AMODE setting 513 can contain only national data 24,
to alphanumeric groups 149
asynchronous signals 513 135
to numeric 148
choosing data section 507 communicating with Java 628
two operands 148
in an OO client 599 contrasted with USAGE NATIONAL
concatenating (STRING) 105
closing QSAM files 173 group 25
converting
closing VSAM files 201 defining 134
exceptions 140
COBOL programs 507 example 24
from alphanumeric or DBCS with
coding file I/O for defining tables 68
NATIONAL-OF 139
example 512 in generated XML documents 562
from alphanumeric, DBCS, or
recommended organization 511 initializing
integer with MOVE 138
recommended usage patterns 511 using a VALUE clause 76
overview 138
serialization 510 using INITIALIZE 31, 74
to alphanumeric with
control transfer 509 LENGTH intrinsic function and 122
DISPLAY-OF 139
ending programs 510 MOVE statement with 33
to numbers with NUMVAL,
EXIT PROGRAM statement 464 overview 133
NUMVAL-C 117
GOBACK statement 464 passing as an argument 486
to or from Chinese GB 18030 146
I/O error declaratives 244 treated as a group item
to or from Greek alphanumeric,
IGZEOPT 514 example with INITIALIZE 136
example 140
IGZETUN 514 in INITIALIZE 31
to or from UTF-8 141
interlanguage communication 513 in MOVE CORRESPONDING 33
to uppercase or lowercase 117
limitations 513 summary 136
with INSPECT 115
nested programs 513 treated as an elementary item
defining 131
older compilers 514 example with MOVE 33
displaying on output 36
Index 871
NUMVAL-C intrinsic function object-oriented COBOL (continued) optimization (continued)
description 117 running (continued) factor expressions 652
example 61 XPLINK linkage 299 index computations 656
NX delimiter for national literals 26 writing OO programs 579 indexing 654
OCCURS clause nested program integration 658
ASCENDING|DESCENDING KEY OCCURS DEPENDING ON 655
O phrase
example 88
out-of-line PERFORM 652
packed-decimal data items 653
o suffix with cob2 289
needed for binary search 87 performance implications 655
object
specify order of table elements 68 procedure integration 658
creating 604
cannot use in a level-01 item 68 structured programming 652
definition of 579
defining tables 67 subscript computations 656
deleting 606
for defining table elements 68 subscripting 654
object code
INDEXED BY phrase for creating table elements 654
compilation and listing 274
indexes 72 top-down programming 652
creating 271
nested for creating multidimensional unreachable code 657
generating 316
tables 68 unused data items 343, 393
producing in 80-column record 319
OCCURS DEPENDING ON (ODO) OPTIMIZE compiler option
OBJECT compiler option
clause description 343
description 340
complex 81 effect on parameter passing 484
multioption interaction 305
for creating variable-length tables 78 performance considerations 657, 660
object instances, definition of 579
initializing ODO elements 81 optimizer
OBJECT paragraph
ODO object 78 overview 657
instance data 586, 609
ODO subject 78 optional files
instance methods 587
optimization 655 QSAM 171
object references
simple 78 VSAM 196
comparing 599
variable-length records ORD intrinsic function, example 119
converting from local to global 604
QSAM 162 ORD-MAX intrinsic function
example of passing 602
VSAM 192 example table calculation 89
setting 599
OCCURS INDEXED BY clause, creating using 120
typed 598
indexes with 72 ORD-MIN intrinsic function 120
universal 598
ODO object 78 order of evaluation
OBJECT-COMPUTER paragraph 5
ODO subject 78 arithmetic operators 57, 677
object-oriented COBOL
OFFSET compiler option compiler options 305
binding
description 341 out-of-line PERFORM 102
example 298
multioption interaction 305 OUTDD compiler option
overview 296
output 415 DD not allocated 36
calls to and from OO programs 477
OMITTED clause, FILE SECTION 13 description 344
communicating with Java 628
OMITTED parameters 669 interaction with DISPLAY 36
compatibility 300
OMITTED phrase for omitting output
compiling
arguments 485 coding for CICS 420
under z/OS UNIX 291
ON EXCEPTION phrase coding for line-sequential files 215
using JCL or TSO/E 295
INVOKE statement 601, 614 coding for QSAM files 170
DLLs in 506
OPEN statement coding for VSAM files 193
IMS
file availability 170, 195, 216 data set 270
accessing databases 450
file status key 245 from compiler, under z/OS 268
calling COBOL method from
line-sequential files 215 to files 153
Java 448
multithreading serialization 510 output files with cob2 289
calling Java method from
QSAM files 170 output procedure
COBOL 449
VSAM files 193 coding 224
linking
opening files example 224, 228
example 293
line-sequential 216 FASTSRT option not effective 232
overview 292
multithreading serialization 510 requires RETURN or RETURN
preparing applications
QSAM 170 INTO 224
under z/OS UNIX 292
VSAM restrictions 225
using JCL or TSO/E 296
empty 196 overflow condition
programs must be reentrant 480
overview 195 CALL 250
restrictions
OPTFILE compiler option 342 joining and splitting strings 240
cannot run under CICS 419
optimization UNSTRING 107
CICS 579
avoid ALTER statement 652 overloading instance methods 592
EXEC CICS statements 579
BINARY data items 653 overriding
EXEC SQL statements 579
consistent data 653 factory methods 613
sort and merge 219
constant data items 652 instance methods 591
SQL compiler option 579
contained program integration 658
SQL statements 432
effect of compiler options on 658
running
effect on parameter passing 484
under z/OS UNIX 293
effect on performance 652
using JCL or TSO/E 296
Index 873
preserving original sequence in a program (continued) QSAM files (continued)
sort 230 decisions (continued) input/output error processing 174,
priority numbers, segmentation 658 PERFORM statement 103 241
procedure and data-name cross-reference, switches and flags 99 input/output statements for 170
description 386 developing for z/OS UNIX 453 obtaining buffers for 181
PROCEDURE DIVISION diagnostics 391 opening 170
additional information 399 initialization code 405 processing
client 596 limitations 651 existing files 179
description 17 main 463 in reverse order 171
in subprograms 486 nesting level 392 new files 180
instance method 590 reentrant 480 overview 159
RETURNING restarting 644 z/OS UNIX files 181
to return a value 17 signature information bytes 399 replacing records 172
using 490 statistics 391 retrieving 177
signature information bytes 399 structure 3 striped extended-format 180
statements subprogram 463 tape performance 169
compiler-directing 20 PROGRAM COLLATING SEQUENCE under z/OS
conditional 19 clause creating files 174, 177
delimited scope 19 does not affect national or DBCS DD statement for 174, 177
imperative 19 operands 7 defining 174, 177
terminology 17 establishing collating sequence 6 environment variable for 174
USING overridden by COLLATING file availability 171
BY VALUE 486 SEQUENCE phrase 6 job control language (JCL) 176
to receive parameters 17, 484 overrides default collating updating files 172
verbs present in 399 sequence 229 using same input/output file under
procedure integration 658 Program information FASTSRT 232
procedure-pointer data item listing example 405 writing to a printer 172
calling C/C++ 479 program processing table 422 QUALIFY compiler option 347
calling JNI services 479 Program prolog area QUOTE compiler option 348
definition 477 listing example 407
entry address for entry point 477 program termination
passing parameters to callable
services 477
actions taken in main and
subprogram 464
R
railroad track diagrams, how to read xvi
SET procedure-pointer 477 statements 464
random numbers, generating 59
with DLLs 503 PROGRAM-ID paragraph
RANGE intrinsic function
process coding 3
example statistics calculation 62
definition 508 COMMON attribute 4
example table calculation 89
PROCESS (CBL) statement INITIAL clause 5
RD parameter of JOB or EXEC
batch compiling 277 program-names
statement 644
conflicting options in 304 avoid using certain prefixes 3
READ INTO for format-V VSAM
overview 375 cross-reference 412
files 193
precedence handling of case 345
READ NEXT statement 193
in batch 277 specifying 3
READ statement
under z/OS 272 protecting VSAM files 202
AT END phrase 244
under z/OS UNIX 284 PRTEXIT suboption of EXIT option
line-sequential files 215
specifying compiler options 273 processing of 706
multithreading serialization 510
processing syntax 325
QSAM 170
chained lists
VSAM 193
example 488
reading records
overview 487
tables
Q block size 168
QSAM files from line-sequential files 216
example using indexing 77
adding records to 172 reading records from VSAM files
example using subscripting 77
ASCII tape file 182 dynamically 198
producing XML output 561
ASSIGN clause 160 randomly 198
product support xviii, 853
attributes 178 sequentially 198
program
BLOCK CONTAINS clause 168, 310 reason code from XML parsing 542, 691
attribute codes 397
block size 168, 310 record
compiling and linking using cob2
blocking enhances performance 168, description 11
DLLs 286
310 format
examples 286
blocking records 168, 181 fixed-length QSAM 161, 162
overview 285
closing 173 fixed-length VSAM 192
compiling under z/OS 255
closing to prevent reopening 171 format D 162, 163, 183
compiling under z/OS UNIX 283
DATA DIVISION entries 160 format F 161, 162, 183
decisions
ENVIRONMENT DIVISION format S 164, 165, 166
EVALUATE statement 93
entries 159 format U 166, 167, 183
IF statement 93
FASTSRT requirements 232 format V 162, 163, 183
loops 103
QSAM ASCII tape 183
Index 875
runtime options section (continued) sharing (continued)
| 85 COBOL Standard definition 18 data (continued)
conformance 304 grouping 104 passing arguments to a
AIXBLD 663 segmentation 658 method 601
ALL31 469 SELECT clause PROCEDURE DIVISION
CBLOPTS 495 ASSIGN clause 8 header 486
CBLPSHPOP 428 naming files 8 RETURN-CODE special
CHECK(OFF) vary input-output file 9 register 490
performance considerations 661 SELECT OPTIONAL returning a value from a
DEBUG 380 QSAM 171 method 603
ENVAR 297 VSAM 196 scope of names 476
MSGFILE 344 SELF 599 with Java 627
NOSIMVRD 190 sentence, definition of 18 files
POSIX separate CICS translator scope of names 476
DLL search order 501 compiler options for 423, 426 using EXTERNAL clause 12, 491
use in OO applications 297 restrictions 425 using GLOBAL clause 12
specifying under z/OS 495 using 426 short listing, example 389
specifying under z/OS UNIX 453 separate sign sign condition
TRAP for line-sequential files 217 testing sign of numeric operand 98
closing files in QSAM 173 portability 44 SIGN IS SEPARATE clause
closing files in VSAM 200 printing 44 for line-sequential files 217
closing line-sequential files 217 required for signed national portability 44
ON SIZE ERROR 240 decimal 44 printing 44
XPLINK SEQUENCE compiler option 352 required for signed national decimal
not recommended as a sequential file organization 153 data 44
default 299 sequential search sign representation 53
setting 299 description 86 signature
example 86 definition of 588
sequential storage device 154 must be unique 588
S serial search
description 86
signature information bytes
compiler options in effect 399
S-format record
example 86 DATA DIVISION 399
layout 166
serialization of files with ENVIRONMENT DIVISION 399
overview 165
multithreading 510 PROCEDURE DIVISION 399
requesting 164
SERVICE compiler option 353 size of printed page, control 172
S-level error message 282, 384
SERVICE LABEL statement 375 skip a block of records 168
sample programs 795
SET condition-name TO TRUE statement softcopy information xviii
scope of names
example 102, 104 sort
global 476
switches and flags 100 alternate collating sequence 229
local 476
SET statement checkpoint/restart 236
scope terminator
for changing an index 72 completion code 230
aids in debugging 378
for changing index data items 72 controlling behavior of 234
explicit 19, 20
for function-pointer data items 477 criteria 227
implicit 20
for object references 599 data sets needed under z/OS 226
SD (sort description) entry, example 222
for procedure-pointer data items 477 DD statements for defining z/OS data
SEARCH ALL statement
for setting a condition, example 100 sets 226
binary search 87
handling of program-name in 345 description 219
example 88
using for debugging 380 determining success 230
for changing an index 72
setting diagnostic message 230
table must be ordered 87
index data items 72 FASTSRT compiler option
search order
indexes 72 improving performance 231
DLLs in the z/OS UNIX file
switches and flags 100 requirements 231
system 501
sharing using same QSAM file for input
SEARCH statement
data and output 232
example 86
between separately compiled files, describing 221
for changing an index 72
programs 491 input procedures
nesting to search more than one level
coding the LINKAGE coding 222
of a table 86
SECTION 485 example 228
serial search 86
from another program 16 keys
searching
in recursive or multithreaded defining 227
for name declarations 476
programs 17 overview 220
tables
in separately compiled NOFASTSRT compiler option 233
binary search 87
programs 16 output procedures
overview 85
overview 481 coding 224
performance 85
parameter-passing example 224, 228
serial search 86
mechanisms 481 pass control statements to 235
section
declarative 21
Index 877
STRING statement (continued) SYSABEND file table (continued)
overflow condition 240 description 268 description 39
using 105 SYSADATA dynamically loading 73
with DBCS data 685 file, creating 271 efficient coding 654, 656
strings output 305 elements 67
handling 105 records, exit module 707 identical element specifications 654
Java SYSADATA file index, definition 70
declaring 629 description 268 initializing
manipulating 632 example 729 all occurrences of an element 76
null-terminated 486 file contents 727 at the group level 76
striped extended-format QSAM file 180 record descriptions 730 each item individually 75
structure, initializing using record types 728 using INITIALIZE 73
INITIALIZE 30 SYSIN data set using PERFORM VARYING 103
structured programming 652 defining 269 loading values in 73
structuring OO applications 620 description 267 looping through 103
subclass SYSJAVA file multidimensional 68
coding defining 272 one-dimensional 67
example 610 description 268 processing with intrinsic
overview 607 SYSLIB data set functions 89
instance data 609 defining 270 redefining a record as 75
subprogram description 267 reference modification 71
and main program 463 when not used 703 referencing substrings of
definition 481 SYSLIB environment variable elements 112
description 463 description 284 referencing with indexes, example 70
linkage 463 specifying location of JNI.cpy 291 referencing with subscripts,
common data items 484 SYSLIN data set 271 example 70
PROCEDURE DIVISION in 486 description 268 referring to elements 70
termination SYSMDECK file rows 69
effects 464 defining 272 searching
subscript description 268 binary 87
definition 70 SYSMDUMP file overview 85
literal, example 70 description 268 performance 85
range checking 383 SYSOPTF data set sequential 86
variable, example 70 defining 269 serial 86
subscripting description 267 sorting
definition 70 SYSPRINT data set overview 88
example 77 defining 270 stride computation 656
literal, example 70 description 268 subscript, definition 70
reference modification 71 when not used 706 three-dimensional 69
relative 71 SYSPUNCH data set two-dimensional 69
restrictions 71 description 268, 271 variable-length
use data-name or literal 71 requirements for DECK compiler creating 78
variable, example 70 option 319 example of loading 80
substitution character 132 system date initializing 81
substrings under CICS 421 preventing overlay in 84
of table elements 112 system dump 239 TALLYING phrase (INSPECT),
reference modification of 111 system-determined block size example 115
SUM intrinsic function, example table compiler data sets 268 tape files
calculation 89 QSAM files 168, 310 performance 169
SUPER 604 system-name 5 reverse order 171
support xviii, 853 SYSTERM data set TERMINAL compiler option 359
switch-status condition 98 defining 271 terminal, sending messages to the 359
switches and flags description 268 terminating XML parsing 546
defining 99 sending messages to 359 termination 464
description 99 SYSUDUMP file terminology
resetting 100 description 268 VSAM 185
setting switches off, example 101 SYSUT data set 267 terms used in MAP output 395
setting switches on, example 100 test
testing multiple values, example 100 conditions 103
testing single values, example 99
SYMBOLIC CHARACTERS clause 8
T data 98
numeric operand 98
table
symbolic constant 652 UPSI switch 98
assigning values to 75
syntax diagrams, how to read xvi TEST AFTER 103
columns 67
syntax errors TEST BEFORE 103
compare to array 39
finding with NOCOMPILE compiler TEST compiler option
defining with OCCURS clause 67
option 382 description 359
definition 67
multioption interaction 305
depth 69
Index 879
VSAM files (continued) WORD compiler option (continued) XML document (continued)
closing 200 multioption interaction 305 parsing with validation (continued)
coding input/output statements 193 recommended for CICS integrated restrictions 531
comparison of file organizations 187 translator 424 processing 517
creating alternate indexes 204 recommended for CICS separate specifying encoding if
DATA DIVISION entries 192 translator 427 alphanumeric 539
deleting records from 200 work data sets for compiling 267 white space 538
ENVIRONMENT DIVISION WORKING-STORAGE SECTION XML declaration 538
entries 188 client 598, 599 XML event
error processing 241 comparison with LOCAL-STORAGE CONTENT-CHARACTERS
extended addressability 211 example 15 example 557
file position indicator (CRP) 195, 198 OO client 599 when parsing segments 534
file status key 201 overview 14 encoding conflicts 545
input/output error processing 201 factory data 612 END-OF-INPUT
loading instance data 586, 609 example 557
dynamically or randomly 196 instance method 589 when parsing segments 533
extended format 197 multithreading considerations 599 EXCEPTION 544
sequentially 196 storage location for data 318 fatal errors 545
with access method services 197 workspace NAMESPACE-DECLARATION 528
opening use during sort 236 overview 524
empty 196 wrapper, definition of 620 processing 518, 522
overview 195 wrapping procedure-oriented processing procedure 520
performance considerations 209 programs 620 XML exception codes
processing files 185 Writable static area 408 for generating 700
protecting with password 202 write a block of records 168 for parsing 691
reading records from 198 WRITE ADVANCING statement 173 for parsing with
record-level sharing (RLS) WRITE statement XMLPARSE(COMPAT)
error handling 208 line-sequential files 215 handleable 693
overview 207 multithreading serialization 510 not handleable 697
preventing update problems 207 QSAM 170 for parsing with
restrictions 208 VSAM 193 XMLPARSE(XMLSS) 691
replacing records in 200 XML GENERATE statement
status codes COUNT IN 567
description 246
example 247
X NAME 565
NAMESPACE 563
x suffix with cob2 289
under z/OS NAMESPACE-PREFIX 564
XML declaration
defining data sets 203 NOT ON EXCEPTION 566
generating 563
file availability 202 ON EXCEPTION 567
specifying encoding declaration 539
JCL 206 SUPPRESS 565
white space cannot precede 538
RLS mode 207 TYPE 565
XML document
updating records 199 WITH ATTRIBUTES 563
accessing 520
VSAM terminology WITH ENCODING 566
code pages supported 536
BDAM data set 185 XML-DECLARATION 563
controlling the encoding of 566
comparison to non-VSAM terms 185 XML generation
EBCDIC special characters 540
ESDS for QSAM 185 controlling type of XML data 565
encoding 536, 537
KSDS for ISAM 185 counting generated characters 562
enhancing
RRDS for BDAM 185 description 561
example of modifying data
enhancing output
definitions 573
example of modifying data
rationale and techniques 573
W events
definitions 573
rationale and techniques 573
W-level message 282, 384 example 553
example 568
WHEN phrase generating
generating attributes 563
EVALUATE statement 95 example 568
generating elements 562
SEARCH ALL statement 87 overview 561
handling errors 567
SEARCH statement 86 handling parsing exceptions 542
ignored data items 562
WHEN-COMPILED intrinsic national language 537
naming attributes or elements 565
function 123 parser 518
no byte order mark 567
WHEN-COMPILED special register 123 parsing
overview 561
white space in XML documents 538 description 520
suppressing generation of specified
WITH DEBUGGING MODE clause example 548, 553, 556
attributes or elements 565
for debugging lines 380 large documents 535
using namespace prefixes 564
for debugging statements 380 one segment at a time 533
using namespaces 563
WITH POINTER phrase UTF-8 541
XML output
STRING 105 parsing with validation
controlling the encoding of 566
UNSTRING 107 example 558
WORD compiler option overview 530
description 367 performance considerations 531
Index 881
ZWB compiler option 372
Printed in USA
SC14-7382-03