COBOL Programming Guide
COBOL Programming Guide
Programming Guide
Version 3 Release 2
SC27-1412-01
Enterprise COBOL for z/OS and OS/390
Programming Guide
Version 3 Release 2
SC27-1412-01
Note!
Before using this information and the product it supports, be sure to read the general information under “Notices” on
page 699.
iv Programming Guide
Chapter 10. Processing VSAM files 147 Sorting variable-length records . . . . . . . 186
VSAM files . . . . . . . . . . . . . . 148 Requesting the sort or merge . . . . . . . . 186
Defining VSAM file organization and records . . 149 Setting sort or merge criteria . . . . . . . 187
Specifying sequential organization for VSAM Example: sorting with input and output
files . . . . . . . . . . . . . . . 150 procedures . . . . . . . . . . . . . 188
Specifying indexed organization for VSAM files 150 Choosing alternate collating sequences . . . . 188
Specifying relative organization for VSAM files 151 Sorting on windowed date fields . . . . . . 189
Specifying access modes for VSAM files . . . 153 Preserving the original sequence of records with
Defining record lengths for VSAM files. . . . 154 equal keys . . . . . . . . . . . . . 189
Coding input and output statements for VSAM Determining whether the sort or merge was
files . . . . . . . . . . . . . . . . 155 successful . . . . . . . . . . . . . . 190
File position indicator . . . . . . . . . 157 Stopping a sort or merge operation prematurely 190
Opening a file (ESDS, KSDS, or RRDS) . . . . 157 Improving sort performance with FASTSRT . . . 191
Reading records from a VSAM file . . . . . 159 FASTSRT requirements for JCL . . . . . . 191
Updating records in a VSAM file . . . . . . 160 FASTSRT requirements for sort input and
Adding records to a VSAM file . . . . . . 161 output files . . . . . . . . . . . . . 191
Replacing records in a VSAM file. . . . . . 162 Checking for sort errors with NOFASTSRT . . . 193
Deleting records from a VSAM file . . . . . 162 Controlling sort behavior . . . . . . . . . 193
Closing VSAM files . . . . . . . . . . 162 Sort special registers . . . . . . . . . . 194
Handling errors in VSAM files . . . . . . . 163 Changing DFSORT defaults with control
Protecting VSAM files with a password . . . . 164 statements . . . . . . . . . . . . . 195
Example: password protection for a VSAM Allocating storage for sort or merge operations 195
indexed file . . . . . . . . . . . . . 164 Allocating space for sort files . . . . . . . 196
Working with VSAM data sets under z/OS and Using checkpoint/restart with DFSORT . . . . 196
UNIX . . . . . . . . . . . . . . . . 165 Sorting under CICS . . . . . . . . . . . 197
Defining VSAM files . . . . . . . . . . 165 CICS SORT application restrictions . . . . . 197
Creating alternate indexes . . . . . . . . 166
Allocating VSAM files . . . . . . . . . 168 Chapter 13. Processing XML
Sharing VSAM files through RLS . . . . . . 170 documents . . . . . . . . . . . . 199
Improving VSAM performance . . . . . . . 171 XML parser in COBOL . . . . . . . . . . 199
Accessing XML documents . . . . . . . . . 201
Chapter 11. Processing line-sequential Parsing XML documents . . . . . . . . . 201
files . . . . . . . . . . . . . . . 173 Processing XML events . . . . . . . . . 202
Defining line-sequential files and records in Writing procedures to process XML . . . . . 208
COBOL . . . . . . . . . . . . . . . 173 Understanding XML document encoding . . . . 213
Allowable control characters . . . . . . . 174 Specifying the code page . . . . . . . . 214
Describing the structure of a line-sequential file 174 Parsing documents in other code pages. . . . 214
Defining and allocating line-sequential files . . . 175 Handling errors in XML documents . . . . . . 215
Coding input-output statements for line-sequential Unhandled exceptions . . . . . . . . . 216
files . . . . . . . . . . . . . . . . 175 Handling exceptions . . . . . . . . . . 216
Opening line-sequential files . . . . . . . 176 Terminating the parse . . . . . . . . . 217
Reading records from line-sequential files . . . 176 CCSID conflict exception . . . . . . . . 217
Adding records to line-sequential files . . . . 177
Closing line-sequential files. . . . . . . . 177 Chapter 14. Handling errors . . . . . 221
Handling errors in line-sequential files . . . . . 178 Requesting dumps . . . . . . . . . . . 221
Creating a formatted dump. . . . . . . . 221
Chapter 12. Sorting and merging files 179 Creating a system dump . . . . . . . . 222
Sort and merge process . . . . . . . . . . 180 Handling errors in joining and splitting strings . . 222
Describing the sort or merge file . . . . . . . 180 Handling errors in arithmetic operations . . . . 223
Describing the input to sorting or merging . . . 181 Example: checking for division by zero . . . . 223
Example: describing sort and input files for Handling errors in input and output operations 223
SORT . . . . . . . . . . . . . . . 181 Using the end-of-file condition (AT END) . . . 226
Coding the input procedure . . . . . . . . 182 Coding ERROR declaratives . . . . . . . 227
Describing the output from sorting or merging . . 183 Using file status keys . . . . . . . . . . 228
Coding the output procedure . . . . . . . . 183 Example: file status key . . . . . . . . . 229
Coding considerations when using DFSORT . . 184 Using VSAM return codes (VSAM files only) 229
Example: coding the output procedure when Example: checking VSAM status codes . . . . 230
using DFSORT . . . . . . . . . . . . 184 Coding INVALID KEY phrases . . . . . . 231
Restrictions on input and output procedures . . . 185 Example: FILE STATUS and INVALID KEY . . 232
Defining sort and merge data sets . . . . . . 185 Handling errors when calling programs . . . . 233
Contents v
Writing routines for handling errors . . . . . . 233 Chapter 17. Compiling, linking, and
running OO applications . . . . . . 277
Part 2. Compiling and debugging Compiling, linking, and running OO applications
your program . . . . . . . . . . 235 under UNIX . . . . . . . . . . . . . . 277
Compiling OO applications under UNIX . . . 277
Preparing OO applications under UNIX . . . 278
Chapter 15. Compiling under z/OS 237 Example: compiling and linking a COBOL class
Compiling with JCL . . . . . . . . . . . 237 definition under UNIX . . . . . . . . . 279
Using a cataloged procedure . . . . . . . 238 Running OO applications under UNIX . . . . 279
Writing JCL to compile programs. . . . . . 248 Compiling, linking, and running OO applications
Compiling under TSO . . . . . . . . . . 249 using JCL or TSO/E . . . . . . . . . . . 281
Example: ALLOCATE and CALL for compiling Compiling OO applications using JCL or TSO/E 281
under TSO . . . . . . . . . . . . . 250 Preparing and running OO applications using
Example: CLIST for compiling under TSO . . . 250 JCL or TSO/E . . . . . . . . . . . . 282
Starting the compiler from an assembler program 251 Example: compiling, linking, and running an
Defining compiler input and output . . . . . . 252 OO application using JCL . . . . . . . . 283
Data sets used by the compiler under z/OS . . 253
Defining the source code data set (SYSIN) . . . 255
Chapter 18. Compiler options . . . . 287
Specifying source libraries (SYSLIB) . . . . . 255
Option settings for COBOL 85 Standard
Defining the output data set (SYSPRINT) . . . 256
conformance. . . . . . . . . . . . . . 289
Directing compiler messages to your terminal
Conflicting compiler options . . . . . . . . 289
(SYSTERM) . . . . . . . . . . . . . 256
ADATA . . . . . . . . . . . . . . . 290
Creating object code (SYSLIN or SYSPUNCH) 256
ADV . . . . . . . . . . . . . . . . 291
Creating an associated data file (SYSADATA) 257
ARITH . . . . . . . . . . . . . . . 291
Defining the output Java data set (SYSJAVA) 257
AWO . . . . . . . . . . . . . . . . 292
Defining the debug data set (SYSDEBUG) . . . 257
BUFSIZE . . . . . . . . . . . . . . . 292
Specifying compiler options under z/OS . . . . 258
CICS . . . . . . . . . . . . . . . . 293
Specifying compiler options with the PROCESS
CODEPAGE . . . . . . . . . . . . . . 294
(CBL) statement . . . . . . . . . . . 258
COMPILE . . . . . . . . . . . . . . 294
Example: specifying compiler options using JCL 259
CURRENCY . . . . . . . . . . . . . . 295
Example: specifying compiler options under
DATA . . . . . . . . . . . . . . . . 296
TSO . . . . . . . . . . . . . . . 259
DATEPROC . . . . . . . . . . . . . . 297
Compiler options and compiler output under
DBCS . . . . . . . . . . . . . . . . 298
z/OS . . . . . . . . . . . . . . . 259
DECK . . . . . . . . . . . . . . . . 298
Compiling multiple programs (batch compilation) 261
DIAGTRUNC . . . . . . . . . . . . . 298
Example: batch compilation . . . . . . . 261
DLL . . . . . . . . . . . . . . . . 299
Specifying compiler options in a batch
DUMP . . . . . . . . . . . . . . . 300
compilation . . . . . . . . . . . . . 262
DYNAM . . . . . . . . . . . . . . . 301
Example: precedence of options in a batch
EXIT . . . . . . . . . . . . . . . . 301
compilation . . . . . . . . . . . . . 263
EXPORTALL . . . . . . . . . . . . . 301
Example: LANGUAGE option in a batch
FASTSRT . . . . . . . . . . . . . . . 302
compilation . . . . . . . . . . . . . 264
FLAG . . . . . . . . . . . . . . . . 302
Correcting errors in your source program . . . . 265
FLAGSTD . . . . . . . . . . . . . . 303
Generating a list of compiler error messages . . 265
INTDATE . . . . . . . . . . . . . . 304
Messages and listings for compiler-detected
LANGUAGE . . . . . . . . . . . . . 305
errors . . . . . . . . . . . . . . . 266
LIB . . . . . . . . . . . . . . . . . 306
Format of compiler error messages . . . . . 266
LINECOUNT . . . . . . . . . . . . . 306
Severity codes for compiler error messages . . 267
LIST . . . . . . . . . . . . . . . . 306
MAP . . . . . . . . . . . . . . . . 307
Chapter 16. Compiling under UNIX 269 NAME . . . . . . . . . . . . . . . 308
Setting environment variables under UNIX . . . 269 NSYMBOL . . . . . . . . . . . . . . 309
Specifying compiler options under UNIX . . . . 270 NUMBER . . . . . . . . . . . . . . 309
Compiling and linking with the cob2 command 271 NUMPROC . . . . . . . . . . . . . . 310
Defining input and output . . . . . . . . 271 OBJECT . . . . . . . . . . . . . . . 311
Creating a DLL . . . . . . . . . . . . 272 OFFSET . . . . . . . . . . . . . . . 312
Example: using cob2 to compile under UNIX 272 OPTIMIZE . . . . . . . . . . . . . . 312
cob2 . . . . . . . . . . . . . . . 273 Unused data items . . . . . . . . . . 312
cob2 input and output files . . . . . . . . 274 OUTDD . . . . . . . . . . . . . . . 313
Compiling using scripts . . . . . . . . . . 275 PGMNAME . . . . . . . . . . . . . . 314
PGMNAME(COMPAT) . . . . . . . . . 314
vi Programming Guide
PGMNAME(LONGUPPER). . . . . . . . 314 Chapter 20. Developing COBOL
PGMNAME(LONGMIXED) . . . . . . . 315 programs for CICS . . . . . . . . . 375
QUOTE/APOST . . . . . . . . . . . . 316 Coding COBOL programs to run under CICS . . 375
RENT . . . . . . . . . . . . . . . . 316 Coding file input and output . . . . . . . 376
RMODE . . . . . . . . . . . . . . . 317 Retrieving the system date and time. . . . . 376
SEQUENCE . . . . . . . . . . . . . . 318 Displaying the contents of data items . . . . 377
SIZE . . . . . . . . . . . . . . . . 318 Calling to or from COBOL programs . . . . 377
SOURCE . . . . . . . . . . . . . . . 319 Coding nested programs . . . . . . . . 377
SPACE . . . . . . . . . . . . . . . 319 Coding a COBOL program to run above the
SQL . . . . . . . . . . . . . . . . 320 16-MB line . . . . . . . . . . . . . 378
SSRANGE . . . . . . . . . . . . . . 321 Determining the success of ECI calls. . . . . 378
TERMINAL . . . . . . . . . . . . . . 321 Compiling with the CICS option . . . . . . . 378
TEST . . . . . . . . . . . . . . . . 322 Compiling a sequence of programs . . . . . 379
THREAD . . . . . . . . . . . . . . . 325 Separating CICS suboptions . . . . . . . 379
TRUNC . . . . . . . . . . . . . . . 326 Integrated CICS translator . . . . . . . . 380
TRUNC example 1 . . . . . . . . . . 327 Using the separate CICS translator . . . . . . 381
TRUNC example 2 . . . . . . . . . . 328 CICS reserved-word table . . . . . . . . . 382
VBREF . . . . . . . . . . . . . . . 329 Handling errors by using CICS HANDLE . . . . 383
WORD . . . . . . . . . . . . . . . 329 Example: handling errors by using CICS
XREF . . . . . . . . . . . . . . . . 330 HANDLE . . . . . . . . . . . . . 383
YEARWINDOW . . . . . . . . . . . . 331
ZWB . . . . . . . . . . . . . . . . 331
Compiler-directing statements . . . . . . . . 332
Chapter 21. Programming for a DB2
environment . . . . . . . . . . . . 385
Chapter 19. Debugging . . . . . . . 337 Coding SQL statements . . . . . . . . . . 385
Using SQL INCLUDE with the DB2 coprocessor 385
Debugging with source language . . . . . . . 338
Using character data . . . . . . . . . . 385
Tracing program logic . . . . . . . . . 338
Using binary items . . . . . . . . . . 386
Finding and handling input-output errors . . . 339
Determining the success of SQL statements . . 387
Validating data . . . . . . . . . . . . 339
Compiling with the SQL option . . . . . . . 387
Finding uninitialized data . . . . . . . . 339
Compiling in batch . . . . . . . . . . 388
Generating information about procedures . . . 340
Separating DB2 suboptions . . . . . . . . 388
Debugging using compiler options . . . . . . 341
DB2 coprocessor . . . . . . . . . . . 388
Finding coding errors . . . . . . . . . 342
Finding line sequence problems . . . . . . 343
Checking for valid ranges . . . . . . . . 343 Chapter 22. Developing COBOL
Selecting the level of error to be diagnosed . . 344 programs for IMS. . . . . . . . . . 391
Finding program entity definitions and Compiling and linking COBOL programs for
references . . . . . . . . . . . . . 345 running under IMS . . . . . . . . . . . 391
Listing data items . . . . . . . . . . . 346 Using object-oriented COBOL and Java under IMS 392
Getting listings . . . . . . . . . . . . . 347 Calling a COBOL method from an IMS Java
Example: short listing . . . . . . . . . 348 application . . . . . . . . . . . . . 392
Example: SOURCE and NUMBER output . . . 351 Building a mixed COBOL and Java application
Example: embedded map summary . . . . . 353 that starts with COBOL . . . . . . . . . 393
Terms used in MAP output. . . . . . . . 354 Writing mixed-language applications . . . . 394
Symbols used in LIST and MAP output . . . 354
Example: nested program map . . . . . . 356 Chapter 23. Running COBOL
Reading LIST output . . . . . . . . . . 356 programs under UNIX . . . . . . . . 397
Example: XREF output - data-name
Running in UNIX environments . . . . . . . 397
cross-references. . . . . . . . . . . . 368
Setting and accessing environment variables . . . 398
Example: XREF output - program-name
Setting environment variables that affect
cross-references. . . . . . . . . . . . 369
execution . . . . . . . . . . . . . . 398
Example: embedded cross-reference . . . . . 369
Resetting environment variables . . . . . . 399
Example: OFFSET compiler output . . . . . 370
Accessing environment variables . . . . . . 399
Example: VBREF compiler output . . . . . 371
Example: accessing environment variables . . . 400
Preparing to use the debugger. . . . . . . . 371
Calling UNIX/POSIX APIs . . . . . . . . . 400
fork(), exec(), and spawn() . . . . . . . . 400
Part 3. Targeting COBOL programs Samples . . . . . . . . . . . . . . 401
for certain environments . . . . . 373 Accessing main program parameters . . . . . 402
Example: accessing main program parameters 402
Contents vii
Part 4. Structuring complex Using DLLs in OO COBOL applications . . . . 446
applications . . . . . . . . . . . 405
Chapter 27. Preparing COBOL
programs for multithreading . . . . . 449
Chapter 24. Using subprograms . . . 407
Multithreading . . . . . . . . . . . . . 449
Main programs, subprograms, and calls . . . . 408
Choosing THREAD to support multithreading . . 451
Ending and reentering main programs or
Transferring control with multithreading . . . . 451
subprograms . . . . . . . . . . . . . 408
Using cancel with threaded programs . . . . 451
Transferring control to another program . . . . 410
Ending a program . . . . . . . . . . . 451
Making static calls. . . . . . . . . . . 410
Preinitializing the COBOL environment . . . 452
Making dynamic calls . . . . . . . . . 411
Processing files with multithreading . . . . . . 452
Performance considerations of static and
File definition storage . . . . . . . . . 452
dynamic calls . . . . . . . . . . . . 413
Recommended usage for file access . . . . . 453
Making both static and dynamic calls . . . . 414
Example: usage patterns of file input and
Examples: static and dynamic CALL statements 414
output with multithreading. . . . . . . . 453
Calling nested COBOL programs . . . . . . 416
Handling COBOL limitations with multithreading 454
Making recursive calls . . . . . . . . . . 419
Calling to and from object-oriented programs . . 419
Using procedure and function pointers . . . . . 420 Part 5. Developing object-oriented
Deciding which type of pointer to use . . . . 421 programs . . . . . . . . . . . . 457
Calling a C function pointer . . . . . . . 421
Calling to alternate entry points . . . . . . 421
Chapter 28. Writing object-oriented
Making programs reentrant . . . . . . . . 422
programs . . . . . . . . . . . . . 459
Example: accounts. . . . . . . . . . . . 460
Chapter 25. Sharing data . . . . . . 423
Subclasses . . . . . . . . . . . . . 461
Passing data . . . . . . . . . . . . . . 423
Defining a class . . . . . . . . . . . . 462
Describing arguments in the calling program 424
CLASS-ID paragraph for defining a class . . . 464
Describing parameters in the called program 425
REPOSITORY paragraph for defining a class 464
Testing for OMITTED arguments . . . . . . 425
WORKING-STORAGE SECTION for defining
Coding the LINKAGE SECTION . . . . . . . 425
class instance data . . . . . . . . . . . 466
Coding the PROCEDURE DIVISION for passing
Example: defining a class . . . . . . . . 467
arguments . . . . . . . . . . . . . . 426
Defining a class instance method . . . . . . . 467
Grouping data to be passed . . . . . . . 426
METHOD-ID paragraph for defining a class
Handling null-terminated strings . . . . . . 426
instance method . . . . . . . . . . . 468
Using pointers to process a chained list . . . 427
INPUT-OUTPUT SECTION for defining a class
Passing return code information . . . . . . . 430
instance method . . . . . . . . . . . 469
Understanding the RETURN-CODE special
DATA DIVISION for defining a class instance
register . . . . . . . . . . . . . . 430
method . . . . . . . . . . . . . . 469
Using PROCEDURE DIVISION RETURNING . .
PROCEDURE DIVISION for defining a class
.. . . . . . . . . . . . . . . . . 431
instance method . . . . . . . . . . . 470
Specifying CALL . . . RETURNING . . . . . 431
Overriding an instance method . . . . . . 471
Sharing data by using the EXTERNAL clause. . . 431
Overloading an instance method . . . . . . 472
Sharing files between programs (external files) . . 432
Coding attribute (get and set) methods . . . . 473
Example: using external files . . . . . . . 432
Example: defining a method . . . . . . . 474
Defining a client . . . . . . . . . . . . 475
Chapter 26. Creating a DLL or a DLL REPOSITORY paragraph for defining a client 477
application . . . . . . . . . . . . 437 DATA DIVISION for defining a client . . . . 478
Dynamic link libraries (DLLs) . . . . . . . . 437 Comparing and setting object references . . . 479
Compiling programs to create DLLs . . . . . . 438 Invoking methods (INVOKE) . . . . . . . 480
Linking DLLs . . . . . . . . . . . . . 439 Creating and initializing instances of classes . . 482
Example: sample JCL for a procedural DLL Freeing instances of classes . . . . . . . . 483
application . . . . . . . . . . . . . . 440 Example: defining a client . . . . . . . . 484
Prelinking certain DLLs . . . . . . . . . . 441 Defining a subclass . . . . . . . . . . . 484
Using CALL identifier with DLLs . . . . . . 441 CLASS-ID paragraph for defining a subclass 485
Search order for DLLs in HFS . . . . . . . 442 REPOSITORY paragraph for defining a subclass 486
Using DLL linkage and dynamic calls together . . 442 WORKING-STORAGE SECTION for defining
Using procedure or function pointers with DLLs 443 subclass instance data . . . . . . . . . 486
Calling DLLs from non-DLLs . . . . . . . 444 Defining a subclass instance method . . . . 487
Example: calling DLLs from non-DLLs . . . . 444 Example: defining a subclass (with methods) 487
Using COBOL DLLs with C/C++ programs . . . 446 Defining a factory section . . . . . . . . . 488
Contents ix
Example: Language Environment callable Calling from exit modules . . . . . . . . . 613
services . . . . . . . . . . . . . . 573 Processing of INEXIT. . . . . . . . . . . 613
Parameter list for INEXIT . . . . . . . . 613
Processing of LIBEXIT . . . . . . . . . . 614
Part 8. Appendixes . . . . . . . . 575
Processing of LIBEXIT with nested COPY
statements . . . . . . . . . . . . . 615
Appendix A. Intermediate results and Parameter list for LIBEXIT . . . . . . . . 616
arithmetic precision . . . . . . . . 577 Processing of PRTEXIT . . . . . . . . . . 617
Terminology used for intermediate results . . . . 578 Parameter list for PRTEXIT . . . . . . . . 617
Example: calculation of intermediate results . . . 579 Processing of ADEXIT . . . . . . . . . . 618
Fixed-point data and intermediate results . . . . 579 Parameter list for ADEXIT . . . . . . . . 619
Addition, subtraction, multiplication, and Error handling for exit modules . . . . . . . 619
division . . . . . . . . . . . . . . 579 Using the EXIT compiler option with CICS and
Exponentiation . . . . . . . . . . . . 580 SQL statements . . . . . . . . . . . . . 620
Example: exponentiation in fixed-point INEXIT . . . . . . . . . . . . . . 620
arithmetic . . . . . . . . . . . . . 581 LIBEXIT . . . . . . . . . . . . . . 620
Truncated intermediate results. . . . . . . 582 PRTEXIT . . . . . . . . . . . . . . 620
Binary data and intermediate results . . . . 582 ADEXIT . . . . . . . . . . . . . . 621
Intrinsic functions evaluated in fixed-point Example: INEXIT user exit . . . . . . . . . 621
arithmetic . . . . . . . . . . . . . . 583
Integer functions . . . . . . . . . . . 583 Appendix F. JNI.cpy . . . . . . . . 625
Mixed functions . . . . . . . . . . . 583
Floating-point data and intermediate results . . . 584
Appendix G. COBOL SYSADATA file
Exponentiations evaluated in floating-point
arithmetic . . . . . . . . . . . . . 585 contents . . . . . . . . . . . . . 631
Intrinsic functions evaluated in floating-point Existing compiler options affecting the SYSADATA
arithmetic . . . . . . . . . . . . . 585 file . . . . . . . . . . . . . . . . . 631
Arithmetic expressions in nonarithmetic statements 586 Record types . . . . . . . . . . . . . 632
Example: SYSADATA . . . . . . . . . . 633
SYSADATA record descriptions . . . . . . . 634
Appendix B. Complex OCCURS
Common header section . . . . . . . . . . 635
DEPENDING ON . . . . . . . . . . 587 Job identification record - X’0000’. . . . . . . 636
Example: complex ODO . . . . . . . . . . 587 ADATA identification record - X’0001’ . . . . . 637
How length is calculated . . . . . . . . 588 Compilation unit start/end record - X’0002’ . . . 637
Setting values of ODO objects . . . . . . . 588 Options record - X’0010’ . . . . . . . . . . 638
Effects of change in ODO object value . . . . . 588 External symbol record - X’0020’ . . . . . . . 647
Preventing index errors when changing ODO Parse tree record - X’0024’ . . . . . . . . . 648
object value . . . . . . . . . . . . . 589 Token record - X’0030’ . . . . . . . . . . 661
Preventing overlay when adding elements to a Source error record - X’0032’ . . . . . . . . 662
variable table . . . . . . . . . . . . 589 Source record - X’0038’ . . . . . . . . . . 662
COPY REPLACING record - X’0039’. . . . . . 663
Appendix C. Converting double-byte Symbol record - X’0042’ . . . . . . . . . . 664
character set (DBCS) data . . . . . . 593 Symbol cross-reference record - X’0044’ . . . . . 675
DBCS notation . . . . . . . . . . . . . 593 Nested program record - X’0046’ . . . . . . . 676
Alphanumeric to DBCS data conversion Library record - X’0060’ . . . . . . . . . . 677
(IGZCA2D) . . . . . . . . . . . . . . 593 Statistics record - X’0090’ . . . . . . . . . 678
IGZCA2D syntax . . . . . . . . . . . 593 EVENTS record - X’0120’ . . . . . . . . . 678
IGZCA2D return codes . . . . . . . . . 594
Example: IGZCA2D . . . . . . . . . . 595 Appendix H. Sample programs . . . . 679
DBCS to alphanumeric data conversion (IGZCD2A) 595 IGYTCARA: batch application . . . . . . . . 679
IGZCD2A syntax . . . . . . . . . . . 595 Input data for IGYTCARA . . . . . . . . 680
IGZCD2A return codes . . . . . . . . . 596 Report produced by IGYTCARA . . . . . . 681
Example: IGZCD2A . . . . . . . . . . 597 Preparing to run IGYTCARA . . . . . . . 682
IGYTCARB: interactive program . . . . . . . 683
Appendix D. XML reference material 599 Preparing to run IGYTCARB . . . . . . . 684
XML exceptions that allow continuation . . . . 599 IGYTSALE: nested program application . . . . 686
XML exceptions that do not allow continuation . . 603 Input data for IGYTSALE . . . . . . . . 687
XML conformance . . . . . . . . . . . . 606 Reports produced by IGYTSALE . . . . . . 689
Preparing to run IGYTSALE . . . . . . . 693
Appendix E. EXIT compiler option . . 611 Language elements and concepts that are
illustrated . . . . . . . . . . . . . . 694
Using the user-exit work area . . . . . . . . 612
x Programming Guide
Notices . . . . . . . . . . . . . . 699 Enterprise COBOL for z/OS and OS/390 . . . . 725
Trademarks . . . . . . . . . . . . . . 700 Related publications . . . . . . . . . . . 725
Contents xi
xii Programming Guide
About this document
Welcome to IBM Enterprise COBOL for z/OS and OS/390, IBM’s latest host
COBOL compiler!
This version of IBM COBOL adds new COBOL function to help integrate COBOL
business processes and Web-oriented business processes by:
v Simplifying the componentization of COBOL programs and enabling
interoperability with Java components
v Promoting the exchange and usage of data in standardized formats, including
XML and Unicode
For a comparison of commonly used Enterprise COBOL and IBM z/OS Language
Environment terms, see “Comparison of commonly used terms” on page xiv.
Abbreviated terms
Certain terms are used in a shortened form in this document. 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 at the back of this document.
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:
If choosing one of the items is optional, the entire stack appears below the main
path:
If one of the items is the default, it appears above the main path and the
remaining choices are shown below:
v An arrow returning to the left, above the main line, indicates an item that can be
repeated:
If the repeat arrow contains a comma, you must separate repeated items with a
comma:
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.
Summary of changes
This section lists the key changes that have been made to Enterprise COBOL for
z/OS and OS/390. The changes that are discussed in this document have an
associated page reference for your convenience. The latest technical changes are
marked by a revision bar in the left margin.
| For further details about these enhancements to debugging support, see Debug
| Tool User’s Guide.
| v Extending Java interoperability to IMS: Object-oriented COBOL programs can
| run in an IMS Java dependent region. The object-oriented COBOL and Java
| languages can be mixed in a single application (“Using object-oriented COBOL
| and Java under IMS” on page 392).
| v Enhanced support for Java interoperability:
| – The OPTIMIZE compiler option is fully supported for programs that contain
| OO syntax for Java interoperability.
| – Object references of type jobjectArray are supported for interoperation
| between COBOL and Java (“Declaring arrays and strings for Java” on
| page 506).
| – OO applications that begin with a COBOL main factory method can be
| invoked with the java command (“Structuring OO applications” on page 498).
| – A new environment variable, COBJVMINITOPTIONS, is provided, enabling
| the user to specify options that will be used when COBOL initializes a Java
| virtual machine (JVM) (“Running OO applications under UNIX” on page 279).
| – OO applications that begin with a COBOL program can, with some
| limitations, be bound as modules in a PDSE and run using batch JCL
| (“Preparing and running OO applications using JCL or TSO/E” on page 282).
| v Unicode enhancement for working with DB2: The code pages for host variables
| are handled implicitly when you use the DB2 integrated coprocessor. SQL
| DECLARE statements are necessary only for variables described with USAGE
| DISPLAY or USAGE DISPLAY-1 when COBOL and DB2 code pages do not match
| (“Coding SQL statements” on page 385).
Be sure to include the name of the document, the publication number of the
document, the version of Enterprise COBOL, and, if applicable, the specific
location (for example, page number) 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 it believes appropriate without incurring any
obligation to you.
2 Programming Guide
Establishing record formats. . . . . . . . 120 Specifying relative organization for VSAM files 151
Logical records . . . . . . . . . . . 120 Fixed-length and variable-length RRDS . . . 152
Requesting fixed-length format . . . . . 121 Simulating variable-length RRDS . . . . . 152
Requesting variable-length format . . . . 122 Specifying access modes for VSAM files . . . 153
Requesting spanned format. . . . . . . 124 Example: using dynamic access with VSAM
Requesting undefined format . . . . . . 126 files . . . . . . . . . . . . . . 154
Setting block sizes . . . . . . . . . . . 127 Defining record lengths for VSAM files. . . . 154
Letting z/OS determine block size . . . . 127 Defining fixed-length records . . . . . . 154
Setting block size explicitly . . . . . . . 127 Defining variable-length records . . . . . 154
Taking advantage of LBI. . . . . . . . 128 Coding input and output statements for VSAM
Block size and the DCB RECFM files . . . . . . . . . . . . . . . . 155
subparameter . . . . . . . . . . . 129 File position indicator . . . . . . . . . 157
Coding input and output statements for QSAM Opening a file (ESDS, KSDS, or RRDS) . . . . 157
files . . . . . . . . . . . . . . . . 129 Opening an empty file . . . . . . . . 158
Opening QSAM files . . . . . . . . . . 130 Statements to load records into a VSAM file 159
Dynamically creating QSAM files with Opening a loaded file (a file with records) 159
CBLQDA . . . . . . . . . . . . . . 130 Reading records from a VSAM file . . . . . 159
Adding records to QSAM files. . . . . . . 131 Updating records in a VSAM file . . . . . . 160
Updating QSAM files . . . . . . . . . 131 Adding records to a VSAM file . . . . . . 161
Writing QSAM files to a printer or spooled data Adding records sequentially . . . . . . 161
set . . . . . . . . . . . . . . . . 131 Adding records randomly or dynamically 162
Controlling the page size . . . . . . . 132 Replacing records in a VSAM file. . . . . . 162
Controlling the vertical positioning of records 132 Deleting records from a VSAM file . . . . . 162
Closing QSAM files . . . . . . . . . . 132 Closing VSAM files . . . . . . . . . . 162
Handling errors in QSAM files . . . . . . . 133 Handling errors in VSAM files . . . . . . . 163
Working with QSAM files . . . . . . . . . 133 Protecting VSAM files with a password . . . . 164
Defining and allocating QSAM files . . . . . 134 Example: password protection for a VSAM
Parameters for creating QSAM files . . . . 135 indexed file . . . . . . . . . . . . . 164
Retrieving QSAM files . . . . . . . . . 136 Working with VSAM data sets under z/OS and
Parameters for retrieving QSAM files . . . 136 UNIX . . . . . . . . . . . . . . . . 165
Ensuring file attributes match your program 137 Defining VSAM files . . . . . . . . . . 165
Processing existing files . . . . . . . . 137 Creating alternate indexes . . . . . . . . 166
Defining variable-length (format-V) records 137 Example: entries for alternate indexes . . . 168
Defining format-U records . . . . . . . 138 Allocating VSAM files . . . . . . . . . 168
Defining fixed-length records . . . . . . 138 Sharing VSAM files through RLS . . . . . . 170
Processing new files . . . . . . . . . 138 Preventing update problems with VSAM files
Processing files dynamically created by in RLS mode . . . . . . . . . . . 170
COBOL . . . . . . . . . . . . . 139 Restrictions when using RLS . . . . . . 170
Using striped extended-format QSAM data sets 139 Handling errors in VSAM files in RLS mode 171
Allocation of buffers for QSAM files. . . . 140 Improving VSAM performance . . . . . . . 171
Accessing HFS files using QSAM . . . . . . . 140
Labels for QSAM files . . . . . . . . . . 141 Chapter 11. Processing line-sequential files . . 173
Using trailer and header labels . . . . . . 141 Defining line-sequential files and records in
Getting a user-label track . . . . . . . 142 COBOL . . . . . . . . . . . . . . . 173
Handling user labels . . . . . . . . . 142 Allowable control characters . . . . . . . 174
Format of standard labels . . . . . . . . 143 Describing the structure of a line-sequential file 174
Standard user labels . . . . . . . . . 143 Defining and allocating line-sequential files . . . 175
Processing QSAM ASCII files on tape . . . . . 143 Coding input-output statements for line-sequential
Requesting the ASCII alphabet . . . . . . 144 files . . . . . . . . . . . . . . . . 175
Defining the record formats . . . . . . . 144 Opening line-sequential files . . . . . . . 176
Defining the ddname . . . . . . . . . . 144 Reading records from line-sequential files . . . 176
Processing ASCII file labels . . . . . . . . . 145 Adding records to line-sequential files . . . . 177
Closing line-sequential files. . . . . . . . 177
Chapter 10. Processing VSAM files . . . . . 147 Handling errors in line-sequential files . . . . . 178
VSAM files . . . . . . . . . . . . . . 148
Defining VSAM file organization and records . . 149 Chapter 12. Sorting and merging files . . . . 179
Specifying sequential organization for VSAM Sort and merge process . . . . . . . . . . 180
files . . . . . . . . . . . . . . . 150 Describing the sort or merge file . . . . . . . 180
Specifying indexed organization for VSAM files 150 Describing the input to sorting or merging . . . 181
Alternate keys . . . . . . . . . . . 151 Example: describing sort and input files for
Alternate index . . . . . . . . . . . 151 SORT . . . . . . . . . . . . . . . 181
4 Programming Guide
Chapter 1. Structuring your program
A COBOL program consists of four divisions, each with a specific logical function:
v IDENTIFICATION DIVISION
v ENVIRONMENT DIVISION
v DATA DIVISION
v PROCEDURE DIVISION
To define a COBOL class or method, you need to define some divisions differently
than you would for a program.
RELATED TASKS
“Identifying a program”
“Describing the computing environment” on page 7
“Describing the data” on page 12
“Processing the data” on page 17
“Defining a class” on page 462
“Defining a class instance method” on page 467
“Structuring OO applications” on page 498
Identifying a program
Use the IDENTIFICATION DIVISION to name your program and, if you want, give
other identifying information.
You can use the optional AUTHOR, INSTALLATION, DATE-WRITTEN, and DATE-COMPILED
paragraphs for descriptive information about your program. The data you enter on
the DATE-COMPILED paragraph is replaced with the latest compilation date.
IDENTIFICATION DIVISION.
Program-ID. Helloprog.
Author. A. Programmer.
Installation. Computing Laboratories.
Date-Written. 08/21/2002.
Date-Compiled. 08/21/2002.
Use the PROGRAM-ID paragraph to name your program. The program name that you
assign is used in these ways:
v Other programs use the name to call your program.
v The name appears in the header on each page, except the first page, of the
program listing generated when the program is compiled.
v If you use the NAME compiler option, the name is placed on the NAME
linkage-editor or binder control statement to identify the object module created
by the compilation.
Tip: Do not use program names that start with prefixes used by IBM products. If
you try to use programs whose names start with any of the following, your CALL
statements might resolve to IBM library or compiler routines rather than to your
intended program:
Tip: When the program name is case sensitive, avoid mismatches with the name
the compiler is looking for. Verify that the appropriate setting of the PGMNAME
compiler option is used.
RELATED TASKS
“Changing the header of a source listing” on page 7
“Identifying a program as recursive”
“Marking a program as callable by containing programs”
“Setting a program to an initial state”
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 containing 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 419
RELATED CONCEPTS
“Nested programs” on page 416
6 Programming Guide
Changing the header of a source listing
The header on the first page of your source statement listing contains the
identification of the compiler and the current release level, plus the date and time
of compilation and the page number. For example:
PP 5655-G53 IBM Enterprise COBOL for z/OS and OS/390 3.2.0 Date 08/21/2002 Time 15:05:19 Page 1
You can customize the header on succeeding pages of the listing with the
compiler-directing TITLE statement.
RELATED REFERENCES
TITLE statement (Enterprise COBOL Language Reference)
RELATED TASKS
“Specifying the collating sequence” on page 8
“Defining symbolic characters” on page 9
“Defining a user-defined class” on page 10
“Defining files to the operating system” on page 10
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 119
Chapter 10, “Processing VSAM files” on page 147
Chapter 11, “Processing line-sequential files” on page 173
“Describing the computing environment” on page 7
The sequence that you use can be based on one of these alphabets:
v EBCDIC (use NATIVE if the native character set is EBCDIC), the default if you
omit the ALPHABET clause
v ASCII (use STANDARD-1)
v ISO 7-bit code, International Reference Version (use STANDARD-2)
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 operands.
8 Programming Guide
RELATED TASKS
“Choosing alternate collating sequences” on page 188
“Comparing national data items” on page 110
Source-Computer. IBM-390.
Object-Computer. IBM-390.
RELATED TASKS
“Specifying the collating sequence” on page 8
The class-name can be referenced only in a class condition. This user-defined class
is not the same as an object-oriented class.
The following shows the relationship of a FILE-CONTROL entry to the system data
definition and to the FD entry in the FILE SECTION.
v JCL DD statement:
(1)
//OUTFILE DD DSNAME=MY.OUT171,UNIT=SYSDA,SPACE=(TRK,(50,5)),
// DCB=(BLKSIZE=400)
/*
. . .
v Environment variable (export command):
(1)
export OUTFILE=DSNAME(MY.OUT171),UNIT(SYSDA),SPACE(TRK,(50,5))
. . .
v COBOL code:
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CARPOOL
ASSIGN TO OUTFILE (1)
ORGANIZATION IS SEQUENTIAL.
. . .
DATA DIVISION.
FILE SECTION.
FD CARPOOL (2)
LABEL RECORD STANDARD
BLOCK CONTAINS 0 CHARACTERS
RECORD CONTAINS 80 CHARACTERS
(1) The ddname in the DD statement or the environment variable name in the
export command, corresponds to the assignment-name in the ASSIGN clause:
v //OUTFILE DD DSNAME=OUT171 . . ., or
v export OUTFILE= . . .
10 Programming Guide
SELECT CARPOOL
. . .
FD CARPOOL
RELATED TASKS
“Optimizing buffer and device space” on page 12
Rules for using different files: The name 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. You can change the actual file by
using the DSNAME in the DD statement or the DSNAME or path name in the
environment variable.
The file-name that you use with the SELECT clause (such as SELECT MASTER) must be
the same as in the FD file-name entry.
Two files should not use the same ddname or environment variable name in their
SELECT clauses; otherwise, results could be unpredictable. For example, if DISPLAY
is directed to SYSOUT, do not use SYSOUT as the ddname or environment variable
name on the SELECT clause for a file.
Example: using different input files: Consider a COBOL program that is used in
exactly the same way for several different master files. It contains this SELECT
clause:
SELECT MASTER
ASSIGN TO DA-3330-S-MASTERA
Assume the three possible input files are MASTER1, MASTER2, and MASTER3. You must
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, prior to running 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 MASTERA will therefore be a reference to the file
currently assigned to 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 HFS, because you cannot specify
an organization field (S- or AS-) with a line-sequential file.
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 292
The Enterprise COBOL compiler limits the maximum size of DATA DIVISION
elements.
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)
12 Programming Guide
v In the record description following the FD entry, describe the fields of the records
in the file:
– You can code a level-01 description of the entire record, and then in the
WORKING-STORAGE SECTION code a working copy that describes the fields of the
record in more detail. Use the READ INTO statement to bring the records into
WORKING-STORAGE. Processing occurs on the copy of data in WORKING-STORAGE.
A WRITE FROM statement then writes processed data into the record area
defined in the FILE SECTION.
– The record-name established is the object of WRITE and REWRITE statements.
– For QSAM files only, you can set the record format in the RECORDING MODE
clause. If you omit the RECORDING MODE clause, the compiler determines the
record format based on the RECORD clause and on the level-01 record
descriptions.
– For QSAM files, you can set a blocking factor for the file in the BLOCK
CONTAINS clause. If you omit the BLOCK CONTAINS clause, the file defaults to
unblocked. However, you can override this with z/OS data management
facilities (including a DD file job control statement).
– For line-sequential files, you can set a blocking factor for the file in the BLOCK
CONTAINS clause. When you code BLOCK CONTAINS 1 RECORDS, or BLOCK
CONTAINS n CHARACTERS, where n is the length of one logical record, WRITE
statements result in the record being transferred immediately to the file,
rather than being buffered. This technique is useful when you want each
record written immediately, such as to an error log.
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 416
RELATED TASKS
“Sharing files between programs (external files)” on page 432
RELATED REFERENCES
“FILE SECTION entries”
RELATED CONCEPTS
“Labels for QSAM files” on page 141
14 Programming Guide
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
“WORKING-STORAGE SECTION for defining class instance data” on page 466
Chapter 27, “Preparing COBOL programs for multithreading” on page 449
“Ending and reentering main programs or subprograms” on page 408
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
(L-S) and WORKING-STORAGE (W-S) 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).
Recursive
CALLs: Main 1 2 3 4 5
___________________________________
L-S num 5 4 3 2 1 0
___________________________________
W-S numb 5 4 3 2 1 0
fact 0 0 0 0 0 0
___________________________________
Recursive
GOBACKs: 5 4 3 2 1 Main
____________________________________
L-S num 0 1 2 3 4 5
____________________________________
W-S numb 0 0 0 0 0 0
fact 1 1 2 6 24 120
____________________________________
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”
RELATED TASKS
“Passing data” on page 423
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 416
16 Programming Guide
Sharing data in recursive or multithreaded programs
If you compile your program as RECURSIVE or with the THREAD compiler option,
data that is defined in the LINKAGE SECTION is not accessible on subsequent
invocations of the program.
If you compile your program as RECURSIVE or 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 449
RELATED TASKS
“Making recursive calls” on page 419
“Processing files with multithreading” on page 452
RELATED REFERENCES
SET statement (Enterprise COBOL Language Reference)
“THREAD” on page 325
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 your division header to receive parameters with the USING phrase or
to return a value with 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
You can also combine USING and RETURNING in a PROCEDURE DIVISION header:
Be sure to define dataname and dataname2 in the LINKAGE SECTION of the DATA
DIVISION.
RELATED CONCEPTS
“How logic is divided in the PROCEDURE DIVISION”
RELATED TASKS
“Eliminating repetitive coding” on page 569
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
RELATED REFERENCES
PROCEDURE DIVISION structure (Enterprise COBOL Language Reference)
18 Programming Guide
Imperative statements
An imperative statement indicates an unconditional action to be taken (such as
ADD, MOVE, INVOKE, or CLOSE).
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).
An explicit scope terminator is required for the inline PERFORM statement, but it is
not valid for the out-of-line PERFORM 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.
RELATED CONCEPTS
“Imperative statements” on page 19
“Scope terminators”
RELATED TASKS
“Selecting program actions” on page 75
RELATED REFERENCES
Conditional statements (Enterprise COBOL Language Reference)
Compiler-directing statements
A compiler-directing statement is not part of the program logic. A
compiler-directing statement causes the compiler to take specific action about the
program structure, COPY processing, listing control, or control flow.
RELATED REFERENCES
“Compiler-directing statements” on page 332
Compiler-directing statements (Enterprise COBOL Language Reference)
Scope terminators
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
END-IF
IF ITEM = “B”
ADD 2 TO TOTAL
END-IF
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
20 Programming Guide
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 TASKS
“Finding and handling input-output errors” on page 339
RELATED REFERENCES
Declaratives (Enterprise COBOL Language Reference)
RELATED CONCEPTS
“Storage and its addressability” on page 33
RELATED TASKS
“Using variables, structures, literals, and constants”
“Assigning values to data items” on page 25
“Displaying values on a screen or in a file (DISPLAY)” on page 30
“Using intrinsic functions (built-in functions)” on page 32
“Using tables (arrays) and pointers” on page 33
Chapter 7, “Coding for run-time use of national languages” on page 103
Variables
A variable is a data item; its value can change during a program. The values are
restricted, however, to the data type that you define when you give the variable a
name and a length. For example, if a customer name is a variable in your program,
you could code:
Data Division.
. . .
01 Customer-Name Pic X(20).
01 Original-Customer-Name Pic X(20).
. . .
Procedure Division.
. . .
Move Customer-Name to Original-Customer-Name
. . .
Literals
A literal is a character string whose value is given by the characters themselves.
When you know the value you want to use for a data item, use a literal
representation of the data value in the PROCEDURE DIVISION. You do not need to
define it or refer to a data-name. For example, you can prepare an error message
for an output file this way:
Move “Name is not valid” To Customer-Name
Constants
A constant is a data item that has only one value. COBOL does not define a
construct specifically for constants. However, most COBOL programmers define a
data item with an initial VALUE (as opposed to initializing a variable using the
INITIALIZE statement). For example:
Data Division.
. . .
01 Report-Header pic x(50) value “Company Sales Report”.
. . .
01 Interest pic 9v9999 value 1.0265.
Figurative constants
Certain commonly used constants and literals are provided as reserved words
called figurative constants: ZERO, SPACE, HIGH-VALUE, LOW-VALUE, QUOTE, NULL, and ALL.
Because they represent fixed values, figurative constants do not require a data
definition. For example:
24 Programming Guide
Move Spaces To Report-Header
RELATED REFERENCES
PICTURE clause (Enterprise COBOL Language Reference)
Literals (Enterprise COBOL Language Reference)
Figurative constants (Enterprise COBOL Language Reference)
RELATED TASKS
“Initializing a structure (INITIALIZE)” on page 27
“Assigning values to variables or structures (MOVE)” on page 27
“Joining data items (STRING)” on page 87
“Splitting data items (UNSTRING)” on page 89
“Assigning arithmetic results (MOVE or COMPUTE)” on page 28
“Tallying and replacing data items (INSPECT)” on page 95
“Assigning input from a screen or file (ACCEPT)” on page 29
“Displaying values on a screen or in a file (DISPLAY)” on page 30
Chapter 7, “Coding for run-time use of national languages” on page 103
26 Programming Guide
RELATED TASKS
“Initializing a structure (INITIALIZE)”
The following example shows how you can reset fields in a transaction record
produced by a program to spaces and zeros. The fields are not identical in each
record produced.
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).
10 DISCOUNT PIC V9(2).
10 SALES-PRICE PIC 9(5)V9(2).
. . .
INITIALIZE TRANSACTION-OUT
For example, the following statement assigns the contents of the variable
Customer-Name to the variable Orig-Customer-Name:
Move Customer-Name to Orig-Customer-Name
When you move a group item to another group item, be sure the subordinate data
descriptions are compatible. The compiler performs all MOVE statements regardless
of whether the items fit, even if a destructive overlap could occur at run time.
For variables that contain numbers, moves can be more complicated because there
are several ways numbers are represented. In general, the algebraic values of
numbers are moved if possible (as opposed to the digit-by-digit move performed
with character data):
This move would result in Item-x containing the value 3.0, represented by 0030.
You can move an alphanumeric item or an integer item to a national variable; the
item is converted. You can move a national item only to another national variable.
In either case padding or truncation might occur, and you must ensure that
truncation does not occur within a character.
The following example shows a data item in the Greek language that moves into 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 encoding of language characters” on page 105
RELATED REFERENCES
MOVE statement (Enterprise COBOL Language Reference)
“CODEPAGE” on page 294
“Converting national data” on page 107
The MOVE statement carries out the assignment with truncation. You can, however,
specify the DIAGTRUNC compiler option to request that the compiler issue a warning
diagnostic 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.
When 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 the ON SIZE ERROR phrase is not specified, 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 variable. For example:
Compute z = y + (x ** 3)
Compute x = Function Max(x y z)
28 Programming Guide
statement, and the values they return are passed in the parameters in the CALL
statement. For example, you can call the Language Environment service CEESIABS
to find the absolute value of a variable with the statement:
Call ’CEESIABS’ Using Arg, Feedback-code, Result.
As a result of this call, the variable Result is assigned to be the absolute value of
the value that is in the variable Arg; the variable Feedback-code contains the return
code indicating whether the service completed successfully. You have to define all
the variables in the Data Division using the correct descriptions, according to the
requirements of the particular callable service you are using. For the example
above, the variables could be defined like this:
77 Arg Pic s9(9) Binary.
77 Feedback-code Pic x(12) Display.
77 Result Pic s9(9) Binary.
RELATED REFERENCES
“DIAGTRUNC” on page 298
Intrinsic functions (Enterprise COBOL Language Reference)
Callable services (Language Environment Programming Reference)
For example:
Environment Division.
Configuration Section.
Special-Names.
Console is Names-Input.
. . .
Accept Customer-Name From Names-Input
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
Note that device can be a ddname that references a hierarchical file system (HFS)
path. If this DD is not defined and your program is running in a UNIX
environment, stdin is the input source. If this DD is not defined and your
program is not running in a UNIX environment, the ACCEPT statement fails.
When you assign a value to a national data item, input data from the console is
converted from EBCDIC to Unicode representation (UTF-16), based on the value of
the CODEPAGE option. This is the only situation where conversion of national data is
done when you use the ACCEPT statement, because the input is known to be
coming from a screen.
If you want conversion done when the input data is from any other device, use the
NATIONAL-OF intrinsic function.
RELATED CONCEPTS
“Unicode and encoding of language characters” on page 105
To write data to a destination other than the system logical output device, use the
UPON clause with a destination other than SYSOUT. For example, the following
statement writes to the file specified in the SYSPUNCH DD statement:
Display “Hello” upon syspunch.
You can specify a file in the hierarchical file system (HFS) with this ddname. For
example, with the following definition, your DISPLAY output is written to the HFS
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 national data item to the console, it is converted
from Unicode representation (UTF-16) to EBCDIC, based on the value of the
CODEPAGE option. This is the only situation where conversion of national data is
done when you use the DISPLAY statement, because the output is known to be
directed to a screen.
If you want a national data item to be converted when you direct output to a
different device, use the DISPLAY-OF intrinsic function, such as in this example:
01 Data-in-Unicode pic N(10) usage national.
. . .
Display function Display-of(Data-in-Unicode, 00037)
The output is directed to the ddname that you specify in the OUTDD compiler
option. You can specify a file in the hierarchical file system (HFS) with this
ddname.
If the OUTDD ddname is not allocated and you are not running in a UNIX
environment, a default DD of SYSOUT=* is allocated.
30 Programming Guide
If the OUTDD ddname is not allocated and you are running in a UNIX environment,
the _IGZ_SYSOUT environment variable is used as follows:
Undefined or set to stdout
Output is routed to stdout (file descriptor 1).
Set to stderr
Output is routed to stderr (file descriptor 2).
Otherwise (set to something other than stdout or stderr)
The DISPLAY statement fails; a severity-3 Language Environment condition
is raised.
When DISPLAY output is routed to stdout or stderr, the output is not subdivided
into records; rather the output is written as a single stream of characters without
line breaks.
If OUTDD and the Language Environment run-time option MSGFILE both specify the
same ddname, DISPLAY output and Language Environment run-time diagnostics
are both routed to the Language Environment message file.
If you specify the WITH NO ADVANCING phrase and the output is going to stdout or
stderr, a new-line 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.
For example:
DISPLAY “ABC”
DISPLAY “CDEF” WITH NO ADVANCING
DISPLAY “GHIJK” WITH NO ADVANCING
DISPLAY “LMNOPQ”
DISPLAY “RSTUVWX”
If you use the statements above, the result sent to the output device is:
ABC
CDEF
+GHIJK
+LMNOPQ
RSTUVMX
The output 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 new-line character is appended to the end of the stream.
RELATED CONCEPTS
“Unicode and encoding of language characters” on page 105
RELATED REFERENCES
DISPLAY statement (Enterprise COBOL Language Reference)
“OUTDD” on page 313
“CODEPAGE” on page 294
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 having 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 variable.
For example, you could use Sqrt to invoke an intrinsic function and to name a
variable 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)
. . .
32 Programming Guide
The functions MAX, MIN, DATEVAL, and UNDATE can return either type of value
depending on the type of arguments you supply.
The functions DATEVAL, UNDATE, and YEARWINDOW are provided with the millennium
language extensions to assist with manipulating and converting windowed date
fields.
Nesting functions
Functions can reference other functions as arguments as long as the results of the
nested functions meet the requirements for the arguments of the outer function.
For example:
Compute x = Function Max((Function Sqrt(5)) 2.5 3.5)
In this case, Function Sqrt(5) returns a numeric value. Thus, the three arguments
to the MAX function are all numeric, which is an allowable argument type for this
function.
RELATED TASKS
“Processing table items using intrinsic functions” on page 73
“Converting data items (intrinsic functions)” on page 96
“Evaluating data items (intrinsic functions)” on page 99
Pointers are data items that contain virtual storage addresses. You define them
explicitly with the USAGE IS POINTER clause in the DATA DIVISION or implicitly as
ADDRESS OF special registers.
RELATED TASKS
“Defining a table (OCCURS)” on page 59
“Using procedure and function pointers” on page 420
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. This attribute is AMODE 24, AMODE 31, or AMODE ANY,
respectively. The object program, the load module, and the executing program each
has an AMODE attribute. All Enterprise COBOL object programs are AMODE ANY.
Residency mode (RMODE) is the attribute of a program load module that identifies
where in virtual storage the program will reside: below the 16-MB line, or either
below or above. This attribute is RMODE 24 or RMODE ANY.
Enterprise COBOL uses Language Environment services to control the storage used
at run time. Thus COBOL compiler options and Language Environment run-time
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.
RMODE Compiler option that influences the residency mode.
RENT Compiler option to generate a reentrant program and that influences the
location of storage and the residency mode of your program.
HEAP Run-time option that controls storage for the run-time heap. For example,
COBOL working storage is allocated from heap storage.
STACK Run-time option that controls storage for the run-time stack. For example,
COBOL local storage is allocated from stack storage.
ALL31 Run-time option that specifies whether an application can run entirely in
AMODE 31.
34 Programming Guide
v Compile reentrant programs (RENT) with DATA(24).
| v Compile nonreentrant programs (NORENT) with RMODE(24) or RMODE(AUTO).
v Nonreentrant programs (NORENT) compiled with RMODE(ANY) must be link-edited
with RMODE 24. The data areas for NORENT programs are above the 16-MB line or
| below the 16-MB line depending on where the program is loaded, even if the
| program was compiled with DATA(24). The DATA option does not affect programs
compiled with NORENT.
When you specify the run-time option HEAP(,,BELOW), the DATA compiler option has
no effect; the storage for LOCAL-STORAGE SECTION data areas is allocated from below
the 16-MB line. However, with HEAP(,,ANYWHERE) as the run-time option, storage
for data areas is allocated from below the 16-MB line if you compiled the program
with the DATA(24) compiler option, or from unrestricted storage if you compiled
with the DATA(31) compiler option.
In all other cases, the storage for EXTERNAL data will be obtained from below the
16-MB line. When you specify the ALL31(ON) run-time option, all the programs in
the run unit must be capable of running in 31-bit addressing mode.
RELATED CONCEPTS
AMODE considerations for heap storage (Language Environment Programming Guide)
RELATED REFERENCES
“Allocation of buffers for QSAM files” on page 140
“DATA” on page 296
“RENT” on page 316
“RMODE” on page 317
“Performance-related compiler options” on page 563
HEAP (Language Environment Programming Reference)
STACK (Language Environment Programming Reference)
ALL31 (Language Environment Programming Reference)
z/OS DFSMS: Program Management
36 Programming Guide
Chapter 3. Working with numbers and arithmetic
In general, you can view COBOL numeric data as a series of decimal digit
positions. However, numeric items can also have special properties such as an
arithmetic sign or a currency sign.
This section describes how 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 38
“Controlling how numeric data is stored” on page 39
“Checking for incompatible data (numeric class test)” on page 46
“Performing arithmetic” on page 47
“Using currency signs” on page 55
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
However, if you plan to port your program or data to a different machine, you
might want to code the sign as a separate position in storage. In this 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 data items that will be printed or displayed.
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 a
floating-point literal:
05 Compute-result Usage Comp-2 Value 06.23E-24.
RELATED CONCEPTS
Appendix A, “Intermediate results and arithmetic precision” on page 577
RELATED TASKS
“Displaying numeric data”
“Controlling how numeric data is stored” on page 39
“Performing arithmetic” on page 47
RELATED REFERENCES
“Sign representation and processing” on page 45
“ARITH” on page 291
“NUMPROC” on page 310
If the contents of Price are 0150099 (representing the value 1,500.99), then
$ 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.
38 Programming Guide
You can move numeric-edited items to numeric or numeric-edited items. In the
following example, the value of the numeric-edited item is moved to the numeric
item:
Move Edited-price to Price
Display Price
RELATED TASKS
“Controlling how numeric data is stored”
“Defining numeric data” on page 37
“Performing arithmetic” on page 47
RELATED REFERENCES
MOVE statement (Enterprise COBOL Language Reference)
The numeric data you use in your program will have one of the following formats
available with COBOL:
v External decimal (USAGE DISPLAY)
v External floating point (USAGE DISPLAY)
v Internal decimal (USAGE PACKED-DECIMAL)
v Binary (USAGE BINARY)
v Native binary (USAGE COMP-5)
v Internal floating point (USAGE COMP-1, USAGE COMP-2)
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 floating-point data, for which you cannot use a PICTURE
clause).
RELATED CONCEPTS
“Formats for numeric data”
“Data format conversions” on page 43
Appendix A, “Intermediate results and arithmetic precision” on page 577
RELATED TASKS
“Defining numeric data” on page 37
“Displaying numeric data” on page 38
“Performing arithmetic” on page 47
RELATED REFERENCES
“Conversions and precision” on page 44
“Sign representation and processing” on page 45
External decimal (also known as zoned decimal) items are primarily intended for
receiving and sending numbers between your program and files, terminals, or
printers. You can also use external decimal items as operands and receivers in
arithmetic processing. However, if your program performs a lot of intensive
arithmetic and efficiency is a high priority, COBOL’s computational numeric types
might be a better choice for the data items used in the arithmetic.
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.
40 Programming Guide
As with external decimal numbers, external floating-point numbers have to be
converted (by the compiler) to an internal representation of their numeric value
before they can be used in arithmetic operations. If you compile with the default
option ARITH (COMPAT), external floating-point numbers are converted to long
(64-bit) floating-point format. If you compile with ARITH (EXTEND), they are instead
converted to extended-precision (128-bit) floating-point format.
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.
Data items that you declare as USAGE COMP-5 are represented in storage as binary
data. However, unlike USAGE COMP items, they 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.
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 originating in non-COBOL
programs where the data might not conform to a COBOL PICTURE clause.
The table below shows the ranges of values possible for COMP-5 data items.
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).
Packed-decimal items occupy 1 byte of storage for every two decimal digits you
code in the PICTURE description, except that the rightmost byte contains only one
digit and the sign. This format is most efficient when you code an odd number of
digits in the PICTURE description, so that the leftmost byte is fully used.
Packed-decimal items are handled as fixed-point numbers for arithmetic purposes.
COMP-1 and COMP-2 data items are stored in z900 hexadecimal format.
RELATED CONCEPTS
Appendix A, “Intermediate results and arithmetic precision” on page 577
RELATED REFERENCE
VALUE clause (Enterprise COBOL Language Reference)
“TRUNC” on page 326
42 Programming Guide
PICTURE and USAGE and
Numeric type optional SIGN clause Value Internal representation
Binary PIC S9999 BINARY + 1234 04 D2
COMP - 1234 FB 2E
COMP-4
COMP-5 + 123451 30 39
- 123451 CF C7
PIC 9999 BINARY 1234 04 D2
COMP
COMP-4
COMP-5 600001 EA 60
Internal PIC S9999 PACKED-DECIMAL + 1234 01 23 4C
decimal COMP-3 - 1234 01 23 4D
PIC 9999 PACKED-DECIMAL + 1234 01 23 4F
COMP-3 - 1234 01 23 4F
Internal COMP-1 + 1234 43 4D 20 00
floating
point
Internal COMP-2 + 1234 43 4D 20 00 00 00 00 00
floating - 1234 C3 4D 20 00 00 00 00 00
point
External PIC +9(2).9(2)E+99 DISPLAY + 1234 4E F1 F2 4B F3
floating F4 C5 4E F0 F2
point
- 1234 60 F1 F2 4B F3
F4 C5 4E F0 F2
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 with the same rules that are used for MOVE and COMPUTE
statements.
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 and processing” on page 45
When the compiler converts short form to long form for comparisons, zeros are
used for padding the shorter number.
When a USAGE COMP-1 data item is moved to a fixed-point data item with more
than nine digits, the fixed-point data item will receive only nine significant digits,
and the remaining digits will be zero.
When a USAGE COMP-2 data item is moved to a fixed-point data item with 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 with 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.
44 Programming Guide
RELATED CONCEPTS
Appendix A, “Intermediate results and arithmetic precision” on page 577
Given X’sd’, where s is the sign representation and d represents the digit, the valid
sign representations for external decimal (USAGE DISPLAY without the SIGN IS
SEPARATE clause) are:
Positive:
C, A, E, and F
Negative:
D and B
The COBOL NUMPROC compiler option affects sign processing for external decimal
and internal decimal data. NUMPROC has no effect on binary data or floating-point
data.
NUMPROC(PFD)
Given X’sd’, where s is the sign representation and d represents the digit, when you
use NUMPROC(PFD), the compiler assumes that the sign in your data is one of three
preferred signs:
Signed positive or 0:
X’C’
Signed negative:
X’D’
Unsigned or alphanumeric:
X’F’
Based on this assumption, the compiler uses whatever sign it is given to process
data. The preferred sign is generated only where necessary (for example, when
unsigned data is moved to signed data). Using the NUMPROC(PFD) option can save
processing time, but you must use preferred signs with your data for correct
processing.
NUMPROC(NOPFD)
When the NUMPROC(NOPFD) compiler option is in effect, the compiler accepts any
valid sign configuration. The preferred sign is always generated in the receiver.
NUMPROC(NOPFD) is less efficient than NUMPROC(PFD), but you should use it whenever
data that does not use preferred signs might exist.
NUMPROC(MIG)
When NUMPROC(MIG) is in effect, the compiler generates code that is similar to that
produced by OS/VS COBOL. This option can be especially useful if you migrate
OS/VS COBOL programs to IBM Enterprise COBOL for z/OS and OS/390.
RELATED REFERENCES
“NUMPROC” on page 310
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 both cases, the
receiving fields contain invalid data. Ensure that the contents of a data item
conform to its PICTURE and USAGE clauses before using the data item in any further
processing steps.
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”
The numeric class test checks the contents of a data item against a set of values
that are valid for the particular PICTURE and USAGE of the data item. For example, a
packed-decimal item is checked for hexadecimal values X’0’ through X’9’ in the
digit positions, and for a valid sign value in the sign position (whether separate or
nonseparate).
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.
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.
46 Programming Guide
RELATED REFERENCES
“NUMPROC” on page 310
Performing arithmetic
You can use any of several COBOL language features to perform arithmetic:
v “COMPUTE and other arithmetic statements”
v “Arithmetic expressions”
v “Numeric intrinsic functions” on page 48
v “Math and date Language Environment services” on page 49
Some arithmetic might be more intuitive using arithmetic statements other than
COMPUTE. For example:
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.
RELATED CONCEPTS
“Fixed-point versus floating-point arithmetic” on page 53
Appendix A, “Intermediate results and arithmetic precision” on page 577
Arithmetic expressions
You can use arithmetic expressions in many (but not all) places in statements
where numeric data items are allowed. For example, you can use arithmetic
expressions as comparands in relation conditions:
If (a + b) > (c - d + 5) Then. . .
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, necessary or not, make your program easier to read.
RELATED CONCEPTS
“Fixed-point versus floating-point arithmetic” on page 53
Appendix A, “Intermediate results and arithmetic precision” on page 577
Numeric intrinsic functions return a signed numeric value. They are treated as
temporary numeric data items.
You can use intrinsic functions to perform several different arithmetic operations,
as outlined in the following table.
48 Programming Guide
Number handling Date and time Finance Mathematics Statistics
LENGTH CURRENT-DATE ANNUITY ACOS MEAN
MAX DATE-OF-INTEGER PRESENT-VALUE ASIN MEDIAN
MIN DATE-TO-YYYYMMDD ATAN MIDRANGE
NUMVAL DATEVAL COS RANDOM
NUMVAL-C DAY-OF-INTEGER FACTORIAL RANGE
ORD-MAX DAY-TO-YYYYDDD INTEGER STANDARD-DEVIATION
ORD-MIN INTEGER-OF-DATE INTEGER-PART VARIANCE
INTEGER-OF-DAY LOG
UNDATE LOG10
WHEN-COMPILED MOD
YEAR-TO-YYYY REM
YEARWINDOW SIN
SQRT
SUM
TAN
In this example, there are only three function arguments: a, b, and the arithmetic
expression (c / d).
You can use the integer special registers as arguments wherever integer arguments
are allowed.
RELATED CONCEPTS
“Fixed-point versus floating-point arithmetic” on page 53
Appendix A, “Intermediate results and arithmetic precision” on page 577
RELATED REFERENCES
“ARITH” on page 291
So for example (considering the first row of the table), 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.
1. RANDOM returns a long (64-bit) floating-point result even if you pass it a 31-digit argument and compile using
option 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 required by
that service (generally COMP-1 or COMP-2).
50 Programming Guide
This means that if you use INTDATE(LILIAN), you get equivalent results from
COBOL intrinsic functions and Language Environment callable date services.
RELATED CONCEPTS
“Fixed-point versus floating-point arithmetic” on page 53
Appendix A, “Intermediate results and arithmetic precision” on page 577
RELATED TASKS
“Using Language Environment callable services” on page 571
RELATED REFERENCES
“ARITH” on page 291
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.
You can use the ANNUITY function in business problems that require you to
determine the amount of an installment payment (annuity) necessary to repay the
principal and interest of a loan. The series of payments is characterized by an
equal amount each period, periods of equal length, and an equal interest rate each
period. The following example shows how you can calculate the monthly payment
required to repay a $15,000 loan in three years at a 12% annual interest rate (36
monthly payments, interest per month = .12/12):
01 Loan Pic 9(9)V99.
01 Payment Pic 9(9)V99.
01 Interest Pic 9(9)V99.
01 Number-Periods Pic 99.
. . .
Compute Loan = 15000
Compute Interest = .12
Compute Number-Periods = 36
Compute Payment =
Loan * Function Annuity((Interest / 12) Number-Periods)
52 Programming Guide
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)
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 data item defined as USAGE COMP-1, USAGE COMP-2, or external floating
point (USAGE DISPLAY 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
is true:
– An argument in an arithmetic expression results in floating point.
Fixed-point evaluations
In general, if an arithmetic operation contains neither of the characteristics listed
above for floating point, the compiler will cause 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
54 Programming Guide
RELATED REFERENCES
“Arithmetic expressions in nonarithmetic statements” on page 586
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 the 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.
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 X’9F’ or X’5A’ depending on the code
page in use, as shown in the following table.
Modified
Code page Applicable countries from Euro sign
IBM-1140 USA, Canada, Netherlands, Portugal, IBM-037 X’9F’
Australia, New Zealand
IBM-1141 Austria, Germany IBM-273 X’9F’
IBM-1142 Denmark, Norway IBM-277 X’5A’
IBM-1143 Finland, Sweden IBM-278 X’5A’
IBM-1144 Italy IBM-280 X’9F’
IBM-1145 Spain, Latin America - Spanish IBM-284 X’9F’
IBM-1146 UK IBM-285 X’9F’
IBM-1147 France IBM-297 X’9F’
IBM-1148 Belgium, Canada, Switzerland IBM-500 X’9F’
IBM-1149 Iceland IBM-871 X’9F’
56 Programming Guide
On Size Error
Perform Conversion-Error
Not On Size Error
Move Deposit-in-FRF to Report-in-Franc
Display “Deposit in Euro = ” Report-in-Euro
Display “Deposit in Franc = ” Report-in-Franc
End-Compute
. . .
Goback.
Conversion-Error.
Display “Conversion error from EUR to FRF”
Display “Euro value: ” Report-in-Euro.
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 define repetitious items as separate, consecutive entries in the DATA
DIVISION, you can 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 one that
looks up records.
RELATED TASKS
“Defining a table (OCCURS)”
“Referring to an item in a table” on page 61
“Putting values into a table” on page 64
“Nesting tables” on page 60
“Creating variable-length tables (DEPENDING ON)” on page 68
“Searching a table” on page 71
“Processing table items using intrinsic functions” on page 73
“Handling tables efficiently” on page 557
The table element definition (which includes the OCCURS clause) is subordinate to
the group item that contains the table. The OCCURS clause cannot appear in a
level-01 description.
RELATED TASKS
“Creating variable-length tables (DEPENDING ON)” on page 68
“Nesting tables”
“Putting values into a table” on page 64
“Referring to an item in a table” on page 61
“Searching a table” on page 71
RELATED REFERENCES
OCCURS clause (Enterprise COBOL Language Reference)
Nesting tables
To create a two-dimensional table, define a one-dimensional table in each
occurrence of another one-dimensional table. For example:
Subscripting
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.
60 Programming Guide
The following valid references to SAMPLE-TABLE-THREE 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.
Indexing
Consider the following three-dimensional table, SAMPLE-TABLE-FOUR:
01 SAMPLE-TABLE-FOUR
05 TABLE-DEPTH OCCURS 3 TIMES INDEXED BY INX-A.
10 TABLE-ROW OCCURS 4 TIMES INDEXED BY INX-B.
15 TABLE-COLUMN OCCURS 8 TIMES INDEXED BY INX-C PIC X(8).
RELATED TASKS
“Defining a table (OCCURS)” on page 59
“Referring to an item in a table”
“Putting values into a table” on page 64
“Creating variable-length tables (DEPENDING ON)” on page 68
“Searching a table” on page 71
“Processing table items using intrinsic functions” on page 73
“Handling tables efficiently” on page 557
RELATED REFERENCES
OCCURS clause (Enterprise COBOL Language Reference)
RELATED TASKS
“Indexing” on page 63
“Subscripting”
Subscripting
The lowest possible subscript value is 1, which points to the first occurrence of the
table element. In a one-dimensional table, the subscript corresponds to the row
number.
If a data item with 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 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. Simply refer
to the character position and length of the substring to be changed within the
subscripted element. 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 moves the value ?? into table element number 1, beginning at
character position 3, for a length of 2:
RELATED TASKS
“Indexing” on page 63
62 Programming Guide
“Putting values into a table” on page 64
“Searching a table” on page 71
“Handling tables efficiently” on page 557
Indexing
You can create an index either with a particular table (using OCCURS INDEXED BY) or
separately (using USAGE IS INDEX).
For example:
05 TABLE-ITEM PIC X(8)
OCCURS 10 INDEXED BY INX-A.
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 this index to index another table only if both table descriptions have
the same number of table elements, and the table elements are the same length.
If you use USAGE IS INDEX to create an index, you can use the index data item with
any table. For example:
77 INX-B USAGE IS INDEX.
. . .
PERFORM VARYING INX-B FROM 1 BY 1 UNTIL INX-B > 10
DISPLAY TABLE-ITEM (INX-B)
. . .
END-PERFORM.
INX-B is used to traverse table TABLE-ITEM above, but could be used to traverse
other tables also.
Initialize the index-name with a SET, PERFORM VARYING, or SEARCH ALL statement.
You can then also use it in SEARCH or relational condition statements. To change the
value, use a PERFORM, SEARCH, or SET statement.
Use the SET statement to assign to an index the value that you stored in the index
data item defined by USAGE IS INDEX. For example, when you load records into a
variable-length table, you can store the index value of the last record read in 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 the table.
Because you are comparing a physical displacement, you can use index data items
only in SEARCH and SET statements or for comparisons with indexes or other index
data items. You cannot use index data items as subscripts or indexes.
RELATED TASKS
“Subscripting” on page 62
“Putting values into a table” on page 64
RELATED REFERENCES
INDEXED BY phrase (Enterprise COBOL Language Reference)
INDEX phrase (Enterprise COBOL Language Reference)
RELATED TASKS
“Loading a table dynamically”
“Loading a variable-length table” on page 69
“Initializing a table (INITIALIZE)”
“Assigning values when you define a table (VALUE)” on page 65
“Assigning values to a variable-length table” on page 70
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 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 with VARYING phrase (Enterprise COBOL Language Reference)
The INITIALIZE statement cannot load a variable-length table (one that was defined
using OCCURS DEPENDING ON).
RELATED REFERENCES
INITIALIZE statement (Enterprise COBOL Language Reference)
64 Programming Guide
Assigning values when you define a table (VALUE)
If your table contains stable values (such as days and months), set the specific
values your table holds when you define it.
For example:
***********************************************************
*** 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 this example, the items could all be initialized with one VALUE clause at the 01
level, because each item was being initialized to the same value.)
For example:
01 TABLE-ONE VALUE “1234”.
05 TABLE-TWO OCCURS 4 TIMES PIC X.
RELATED REFERENCES
REDEFINES clause (Enterprise COBOL Language Reference)
PERFORM statement (Enterprise COBOL Language Reference)
INITIALIZE statement (Enterprise COBOL Language Reference)
OCCURS clause (Enterprise COBOL Language Reference)
66 Programming Guide
Move Error-Message (Sub) To Print-Message
Perform 260-Print-Report
End-If
End-Perform
. . .
In this example, X is called the ODO subject, and Y is the ODO object.
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 (that is, if FIELD-1
contains an external 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, that
would be five occurrences of FIELD-2, plus FIELD-1, for a length of 26 bytes.
In this case, you need not 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. 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.
68 Programming Guide
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).
When you do a MOVE to REC-1 in this case, the actual length of REC-1 is calculated
immediately before the move using the current value of the ODO object (FIELD-1).
The compiler issues a message letting 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 (here LOCATION-TABLE-LENGTH) is outside the group.
DATA DIVISION.
FILE SECTION.
FD LOCATION-FILE
RECORDING MODE F
BLOCK 0 RECORDS
RECORD 80 CHARACTERS
LABEL RECORD STANDARD.
01 LOCATION-RECORD.
05 LOC-CODE PIC XX.
05 LOC-DESCRIPTION PIC X(20).
05 FILLER PIC X(58).
. . .
WORKING-STORAGE SECTION.
01 FLAGS.
05 LOCATION-EOF-FLAG PIC X(5) VALUE SPACE.
88 LOCATION-EOF VALUE “FALSE”.
01 MISC-VALUES.
05 LOCATION-TABLE-LENGTH PIC 9(3) VALUE ZERO.
05 LOCATION-TABLE-MAX PIC 9(3) VALUE 100.
*****************************************************************
*** L O C A T I O N T A B L E ***
*** FILE CONTAINS LOCATION CODES. ***
*****************************************************************
01 LOCATION-TABLE.
05 LOCATION-CODE OCCURS 1 TO 100 TIMES
DEPENDING ON LOCATION-TABLE-LENGTH PIC X(80).
RELATED CONCEPTS
Appendix B, “Complex OCCURS DEPENDING ON” on page 587
RELATED TASKS
“Assigning values to a variable-length table” on page 70
“Loading a variable-length table”
Enterprise COBOL Compiler and Run-Time Migration Guide
RELATED REFERENCES
OCCURS DEPENDING ON clause (Enterprise COBOL Language Reference)
If the ODO object has a VALUE clause, it is logically initialized after the ODO subject
has been initialized. For example, in the following code
01 TABLE-THREE VALUE “3ABCDE”.
05 X PIC 9.
05 Y OCCURS 5 TIMES
DEPENDING ON X PIC X.
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 the first three elements, Y(1) through Y(3).
RELATED TASKS
Enterprise COBOL Compiler and Run-Time Migration Guide
RELATED REFERENCES
OCCURS DEPENDING ON clause (Enterprise COBOL Language Reference)
70 Programming Guide
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
the table. For a binary search, the number of comparisons is only of the order of
the logarithm (base 2) of n. A binary search, however, requires that the table items
already be sorted.
RELATED TASKS
“Doing a serial search (SEARCH)”
“Doing a binary search (SEARCH ALL)” on page 72
The conditions in the WHEN option 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 do not use AT END,
control passes to the next statement in your 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.
If the found condition comes after some intermediate point in the table, you can
speed up the search. Use 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 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)
To use the SEARCH ALL statement, your table must already be ordered on the key or
keys coded in the OCCURS clause. You can use any key in the WHEN condition, but
you must test all preceding data-names in the KEY option, if any. The test must be
an equal-to condition, and the KEY data-name must be either the subject of the
condition or the name of a conditional variable with which the tested
condition-name is associated. The WHEN condition can also be a compound
condition, formed from simple conditions with AND as the only logical connective.
The key and its object of comparison must be compatible.
RELATED REFERENCES
SEARCH statement (Enterprise COBOL Language Reference)
72 Programming Guide
DESCENDING KEY-3
INDEXED BY INDX-1.
10 PART-1 PIC 99.
10 KEY-1 PIC 9(5).
10 PART-2 PIC 9(6).
10 KEY-2 PIC 9(4).
10 PART-3 PIC 9(18).
10 KEY-3 PIC 9(5).
If an entry is found in which the three keys are equal to the given values (VALUE-1,
VALUE-2, and VALUE-3), PART-1 of that entry will be moved to OUTPUT-AREA. If
matching keys are not found in any of the entries in TABLE-A, the NOENTRY routine
is performed.
You might often need to process the data in tables iteratively. For intrinsic
functions that accept multiple arguments, you can use the ALL subscript to
reference all the items in the table or a single dimension of the table. The iteration
is handled automatically, making 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 32
RELATED REFERENCES
Intrinsic functions (Enterprise COBOL Language Reference)
74 Programming Guide
Chapter 5. Selecting and repeating program actions
Use COBOL control language to choose program actions based on the outcome of
logical tests, to iterate over selected parts of your program and data, and to
identify statements to be performed as a group. These controls include:
v IF statement
v EVALUATE statement
v Switches and flags
v PERFORM statement
RELATED TASKS
“Selecting program actions”
“Repeating program actions” on page 82
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 79
RELATED REFERENCES
IF statement (Enterprise COBOL Language Reference)
EVALUATE statement (Enterprise COBOL Language Reference)
When one of the processing choices is no action, code the IF statement with or
without ELSE. Because the ELSE clause is optional, you can code the following:
IF condition-q
statement-1
END-IF
This coding is suitable for simple programming cases. For complex logic, you
probably need to use the ELSE clause. For example, suppose you have nested IF
statements with 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:
Use the EVALUATE statement to code a choice among three or more possible
conditions instead of just two. The EVALUATE statement is an expanded form of the
IF statement that allows you to avoid nesting IF statements for such coding, a
common source of logic errors and debugging problems.
With the EVALUATE statement, you can test any number of conditions in a single
statement and have separate actions for each. In structured programming terms,
this is a case structure. It can also be thought of as a decision table.
RELATED TASKS
“Coding conditional expressions” on page 79
“Using the EVALUATE statement” on page 77
“Using nested IF statements”
Use nested IF statements sparingly. The logic can be difficult to follow, although
explicit scope terminators and proper indentation help.
The following figure shows the logic structure for nested IF statements.
76 Programming Guide
RELATED TASKS
“Coding a choice of actions” on page 75
RELATED REFERENCES
Explicit scope terminators (Enterprise COBOL Language Reference)
You can code the EVALUATE statement to handle the case where multiple conditions
lead to the same processing by using the THRU phrase and by using multiple WHEN
statements.
When evaluated, each pair of selection subjects and selection objects must belong
to the same class (numeric, character, CONDITION TRUE or FALSE).
WHEN phrases are tested in the order they are coded. Therefore, you should order
these phrases for the best performance: code first the WHEN phrase containing
selection objects 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 75
Example: EVALUATE using multiple WHEN statements: You can use multiple
WHEN statements when several conditions lead to the same processing action. This
gives you more flexibility than using the THRU phrase, because the conditions do
not have to evaluate to values that fall in a range or evaluate to alphanumeric
values.
EVALUATE MARITAL-CODE
WHEN “M”
ADD 2 TO PEOPLE-COUNT
WHEN “S”
WHEN “D”
WHEN “W”
ADD 1 TO PEOPLE-COUNT
END-EVALUATE
78 Programming Guide
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”
Move “Adult Man” To Description
When Age > 19 Also Sex = “F”
Move “Adult Woman” To Description
When Other
Move “Invalid Data” To Description
End-Evaluate
Evaluate True Also True
When A + B < 10 Also C = 10
Move “Case 1” To Description
When A + B > 50 Also C = ( D + E ) / F
Move “Case 2” To Description
When Other
Move “Case Other” To Description
End-Evaluate
Stop Run.
All conditional expressions that involve a national operand are national conditions.
The PROGRAM COLLATING SEQUENCE clause has no effect on national conditional
expressions.
RELATED CONCEPTS
“Switches and flags” on page 80
RELATED REFERENCES
Rules for condition-name values (Enterprise COBOL Language Reference)
Switch-status condition (Enterprise COBOL Language Reference)
Sign condition (Enterprise COBOL Language Reference)
Comparing numeric and alphanumeric operands (Enterprise COBOL Language
Reference)
Combined conditions (Enterprise COBOL Language Reference)
Class condition (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 81
To test for more than two values, as 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 have some association with logical values.
“Example: switches”
“Example: flags” on page 81
Example: switches
To test for an end-of-file condition for an input file named Transaction-File, you
could use the following data definitions:
WORKING-STORAGE Section.
01 Switches.
05 Transaction-EOF-Switch Pic X value space.
88 Transaction-EOF value “y”.
80 Programming Guide
The level-88 description says a condition named Transaction-EOF is turned on
when Transaction-EOF-Switch has value ’y’. Referencing Transaction-EOF in your
PROCEDURE DIVISION expresses the same condition as testing for
Transaction-EOF-Switch = “y”. For example, the following statement causes the
report to be printed only if your program has read to the end of the
Transaction-File and if the Transaction-EOF-Switch has been set to ’y’:
If Transaction-EOF Then
Perform Print-Report-Summary-Lines
Example: flags
Consider a program that updates a master file. The updates are read from a
transaction file. The transaction file’s records contain a field for the function 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 might look
like this:
Evaluate True
When Add-Transaction
Perform Add-Master-Record-Paragraph
When Change-Transaction
Perform Update-Exisitng-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
back to the original value that was assigned in its data description.
For a level-88 item with multiple values, SET condition-name TO TRUE assigns the
first value (here, A):
88 Record-is-Active Value “A” “O” “S”
Using the SET statement and meaningful condition-names makes it easy for the
reader to follow your code.
The following example shows how to assign a value for 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
This code resets the switch to indicate that the end of the file has not been reached.
Use the PERFORM statement to loop (repeat the same code) a set number of times or
to loop based on the outcome of a decision.
RELATED TASKS
“Choosing inline or out-of-line PERFORM” on page 83
“Coding a loop” on page 84
“Coding a loop through a table” on page 85
“Executing multiple paragraphs or sections” on page 85
82 Programming Guide
RELATED REFERENCES
PERFORM statement (Enterprise COBOL Language Reference)
In the 1974 COBOL standard, the PERFORM statement is out-of-line and thus requires
an explicit branch to a separate paragraph and has an implicit return. If the
performed paragraph is in the subsequent sequential flow of your program, it is
also executed in that flow of the logic. To avoid this additional execution, you
must place the paragraph outside the normal sequential flow (for example, after
the GOBACK) or code a branch around it.
Coding a loop
Use the PERFORM . . . TIMES statement to execute a paragraph a certain number of
times:
PERFORM 010-PROCESS-ONE-MONTH 12 TIMES
INSPECT . . .
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 if you want to execute the
paragraph at least once and then test before any subsequent execution. This
statement is equivalent to the 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 EQUAL DECEMBER)
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.)
84 Programming Guide
Coding a loop through a table
You can use PERFORM . . . VARYING to initialize a table. In this form of the PERFORM
statement, a variable is increased or decreased and tested until a condition is
satisfied.
Thus you use the PERFORM statement to control a loop through a table. You can use
either of the following forms:
PERFORM . . . WITH TEST AFTER . . . VARYING . . . UNTIL . . .
PERFORM . . . [WITH TEST BEFORE] . . . VARYING . . . UNTIL .
The following code shows an example of looping through a table to check for
invalid data:
PERFORM TEST AFTER VARYING WS-DATA-IX
FROM 1 BY 1
UNTIL WS-DATA-IX = 12
IF WS-DATA (WS-DATA-IX) EQUALS SPACES
SET SERIOUS-ERROR TO TRUE
DISPLAY ELEMENT-NUM-MSG5
END-IF
END-PERFORM
INSPECT . . .
In the code above, when control reaches the PERFORM statement, 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 it 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.
In terms of the application, this loop controls input-checking for the 12 fields of
item WS-DATA. Empty fields are not allowed, and this section of code loops through
and issues error messages as appropriate.
Intrinsic functions can make the coding of the iterative processing of tables simpler
and easier.
RELATED TASKS
“Processing table items using intrinsic functions” on page 73
RELATED TASKS
“Joining data items (STRING)”
“Splitting data items (UNSTRING)” on page 89
“Manipulating null-terminated strings” on page 91
“Referring to substrings of data items” on page 92
“Tallying and replacing data items (INSPECT)” on page 95
“Converting data items (intrinsic functions)” on page 96
“Evaluating data items (intrinsic functions)” on page 99
Chapter 7, “Coding for run-time use of national languages” on page 103
The STRING statement transfers data items into the receiving item in the order that
you indicate. In the STRING statement you can also specify the following:
v Delimiters that cause a sending field to be ended and another to be started
v Actions to be taken when the single receiving field is filled before all of the
sending characters have been processed (ON OVERFLOW condition)
You can specify a national item for any literal or identifier operand except the
POINTER identifier. However, if you specify a national item, you must specify all of
the literal and identifier operands (except the POINTER identifier) as national.
RELATED TASKS
“Handling errors in joining and splitting strings” on page 222
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, the programmer initializes RPT-LINE to SPACES and sets
LINE-POS, the data item to be used as the POINTER field, to 4. (By coding the
POINTER phrase of the STRING statement, you can use the explicit pointer field to
control placement of data in the receiving field.) Then, the programmer codes this
STRING statement:
STRING
LINE-NO SPACE CUST-INFO INV-NO SPACE DATE-DUE SPACE
DELIMITED BY SIZE
BAL-DUE
DELIMITED BY DEC-POINT
INTO RPT-LINE
WITH POINTER LINE-POS.
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
88 Programming Guide
After the STRING statement is performed, the value of LINE-POS is 82, and RPT-LINE
appears as shown below.
You can specify national items as the sending field, receiving fields, and delimiters.
However, if you specify a national item, you must specify all of these operands as
national.
RELATED CONCEPTS
“Unicode and encoding of language characters” on page 105
RELATED TASKS
“Handling errors in joining and splitting strings” on page 222
Enterprise COBOL Compiler and Run-Time Migration Guide
RELATED REFERENCES
UNSTRING statement (Enterprise COBOL Language Reference)
Before issuing the UNSTRING statement, the programmer places the value 3 in
CHAR-CT (the POINTER field) to avoid working with the two control characters in
INV-RCD. A period (.) is placed in DBY-1 for use as a delimiter, and the value 0
(zero) is placed in FLDS-FILLED (the TALLYING field). The data is then read into
INV-RCD, as shown below.
90 Programming Guide
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,
/, is placed in DLTR-1, and the value 6 is placed in CTR-2.
4. Positions 31 through 33 are placed in INV-CLASS. The delimiter is a SPACE, but
because no field has been defined as a receiving area for delimiters, the SPACE
in position 34 is bypassed.
5. Positions 35 through 40 (475120) are examined and placed in M-UNITS. The
value 6 is placed in CTR-3. The delimiter is a SPACE, but because no field has
been defined as a receiving area for delimiters, the SPACE in position 41 is
bypassed.
6. Positions 42 through 46 (00122) are placed in FIELD-A and right-justified in the
area. The high-order digit position is filled with a 0 (zero). The delimiter is a
SPACE, but because no field has been defined as a receiving area for delimiters,
the SPACE in position 47 is bypassed.
7. Positions 48 through 53 (000379) are placed in DISPLAY-DOLS. The period (.)
delimiter character in DBY-1 is placed in DLTR-2, and the value 6 is placed in
CTR-4.
8. Because all receiving fields have been acted on and two characters of data in
INV-RCD have not been examined, the ON OVERFLOW exit is taken, and execution
of the UNSTRING statement is completed.
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 REFERENCES
Alphanumeric literals (Enterprise COBOL Language Reference)
As this example shows, you code two values separated by a colon, in parentheses,
immediately following the data item:
v Ordinal position (from the left) of the character that you want the substring to
start with
92 Programming Guide
v Length of the desired substring
The length is optional. If you omit the length, the substring extends to the end of
the item. Omit the length when possible as a simpler and less error-prone coding
technique.
You can code either of the two values as a variable or as an arithmetic expression.
You can also refer to substrings of table entries, including variable-length entries.
To refer to a substring of a table entry, you must code the subscript expression
before the reference modifier. For example, assuming that PRODUCT-TABLE is a
properly coded table of character strings, to move D to the fourth character in the
second string in the table, you could code this statement:
MOVE ’D’ to PRODUCT-TABLE (2), (4:1)
Both numbers in the reference modifier must have a value of at least 1. Their sum
should not exceed the total length of the data item by more than 1 so that you do
not reference beyond the end of the desired substring.
The following options detect out-of-range reference modifiers, and flag violations
with a run-time message:
v SSRANGE compiler option
v CHECK run-time option
You can reference-modify national data items. The reference modifier position and
length for a national item are expressed in terms of national characters.
RELATED CONCEPTS
“Reference modifiers”
“Unicode and encoding of language characters” on page 105
RELATED TASKS
“Referring to an item in a table” on page 61
RELATED REFERENCES
“SSRANGE” on page 321
Reference modification (Enterprise COBOL Language Reference)
Function definitions (Enterprise COBOL Language Reference)
Reference modifiers
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:
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 TASKS
“Referring to substrings of data items” on page 92
“Using national data (Unicode) in COBOL” on page 105
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
94 Programming Guide
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-PART (Enterprise COBOL Language Reference)
INTEGER (Enterprise COBOL Language Reference)
RELATED CONCEPTS
“Unicode and encoding of language characters” on page 105
RELATED REFERENCES
INSPECT statement (Enterprise COBOL Language Reference)
In the following example, the INSPECT statement is used to examine and replace
characters in data item DATA-2. The number of times a leading 0 occurs in the data
item is accumulated in COUNTR. Every instance of the character A following 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 is used to examine and replace
characters in data item DATA-3. Every character in the data item preceding the first
instance of a quote (“) 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 in the data item following the first instance of the character / but
preceding 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”?“
96 Programming Guide
You can use the NATIONAL-OF and DISPLAY-OF intrinsic functions to convert to and
from national (Unicode) strings.
RELATED CONCEPTS
“Unicode and encoding of language characters” on page 105
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 be moved to the actual contents of Item-2.
For example, if the starting value is JOHNSONbbb, the value after the statement is
performed is bbbNOSNHOJ, where b represents a blank space.
When you reverse the order of a national string, the result is a national string.
Use NUMVAL-C when the argument includes a currency symbol or comma, or both,
as shown in the example. You can also place an algebraic sign before or after the
character string, and the sign will be processed. The arguments must not exceed 18
digits when you compile with the default option ARITH(COMPAT) (compatibility mode)
nor 31 digits when you compile with ARITH(EXTEND) (extended mode), not including
the editing symbols.
When you use NUMVAL or NUMVAL-C, you do not need to statically declare 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 40
RELATED TASKS
“Assigning input from a screen or file (ACCEPT)” on page 29
“Displaying values on a screen or in a file (DISPLAY)” on page 30
“Converting national data” on page 107
RELATED REFERENCES
NUMVAL (Enterprise COBOL Language Reference)
NUMVAL-C (Enterprise COBOL Language Reference)
“ARITH” on page 291
98 Programming Guide
Evaluating data items (intrinsic functions)
You can use several intrinsic functions in evaluating data items:
v CHAR and ORD for evaluating integers and single alphanumeric characters with
respect to the collating sequence used in your program
v MAX, MIN, ORD-MAX, and ORD-MIN for finding the largest and smallest items in a
series of data items, including national data items
v LENGTH for finding the length of data items, including national data items
v WHEN-COMPILED for finding the date and time the program was compiled
RELATED CONCEPTS
“Unicode and encoding of language characters” on page 105
RELATED TASKS
“Evaluating single characters for collating sequence”
“Finding the largest or smallest data item”
“Finding the length of data items” on page 101
“Finding the date of compilation” on page 101
If you know the ordinal position in the collating sequence of a character, and want
to know the character that it corresponds to, use the CHAR function with the integer
ordinal position as the argument. CHAR returns the desired character:
INITIALIZE Customer-Name REPLACING ALPHABETIC BY Function Char(65)
RELATED REFERENCES
CHAR (Enterprise COBOL Language Reference)
ORD (Enterprise COBOL Language Reference)
If you specify a national item for any argument, you must specify all arguments as
national.
If you used the ORD-MAX function in the example above, you would receive a syntax
error message at compile time; the reference to a numeric function is in an invalid
place. The following is a valid use of the ORD-MAX function:
Compute x = Function Ord-max(Arg1 Arg2 Arg3)
This code assigns the integer 3 to x if the same arguments are used as in the
previous example. If you use ORD-MIN instead, the integer 2 is returned. The above
examples would probably be more realistic if Arg1, Arg2, and Arg3 were instead
successive elements of an array (table).
If you specify a national item for any argument, you must specify all arguments as
national.
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’, then R1 would evaluate as larger than R2, and:
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.
RELATED TASKS
“Performing arithmetic” on page 47
“Processing table items using intrinsic functions” on page 73
RELATED REFERENCES
ORD-MAX (Enterprise COBOL Language Reference)
ORD-MIN (Enterprise COBOL Language Reference)
The following COBOL statement demonstrates moving a data item into that field
in a record that holds customer names:
Move Customer-name To Customer-record(1:Function Length(Customer-name))
The LENGTH function returns the length of a national item in national characters.
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 allows 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 47
“Processing table items using intrinsic functions” on page 73
RELATED REFERENCES
LENGTH (Enterprise COBOL Language Reference)
These characters show the four-digit year, month, day, and time (in hours, minutes,
seconds, and hundredths of seconds) of compilation.
The WHEN-COMPILED special register is another means you can use to find the date
and time of compilation. It has the following format:
The WHEN-COMPILED special register supports only a two-digit year, and carries the
time out only to seconds. This special register be used 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 for run-time use of
national languages:
v National data type and national literals
v Two intrinsic functions:
– NATIONAL-OF to return a character string in UTF-16 representation
– DISPLAY-OF to convert a national string to a selected code page (EBCDIC,
ASCII, EUC, or UTF-8)
v Two compiler options:
– CODEPAGE to specify the code page to use for alphanumeric and double-byte
character set (DBCS) data in your program
– NSYMBOL to control whether national or DBCS processing is used for the N
symbol in literals and PICTURE clauses
Enterprise
COBOL
statement Can be national Comment For more information
ACCEPT identifier-1 Converted from EBCDIC “Assigning input from a screen or file
only if the CONSOLE option (ACCEPT)” on page 29
is specified directly or
indirectly
CALL identifier-2, identifier-3, “Passing data” on page 423
identifier-4, identifier-5;
literal-2, literal-3
COPY . . . operand-1, operand-2 “Compiler-directing statements” on
REPLACING page 332
DISPLAY identifier-1 Converted to EBCDIC only “Displaying values on a screen or in a
if the CONSOLE option is file (DISPLAY)” on page 30
specified directly or
indirectly
INITIALIZE REPLACING If you specify REPLACING “Examples: initializing variables” on
NATIONAL, identifier-2 and page 25
literal-1 must be of class
national, and vice versa.
INSPECT Identifiers and literals other If any of these is of class “Tallying and replacing data items
than identifier-3 (the national, all must be. (INSPECT)” on page 95
TALLYING identifier)
INVOKE method-name as identifier-2 “Invoking methods (INVOKE)” on
or literal-1; identifier-3 or page 480
literal-2 in the BY VALUE
phrase
RELATED CONCEPTS
“Unicode and encoding of language characters” on page 105
RELATED TASKS
“Using national data (Unicode) in COBOL” on page 105
“Converting national data” on page 107
“Processing UTF-8 data” on page 109
“Processing Chinese GB 18030 data” on page 110
“Comparing national data items” on page 110
RELATED REFERENCES
“CODEPAGE” on page 294
“NSYMBOL” on page 309
Each character set is a defined set of characters, but is not associated with a coded
representation. A coded character set (also referred to here as a code page) is a set of
unambiguous rules that relate the characters of the set to their coded
representation. Each code page is like a table that sets up the symbols for
representing a character set; each symbol is a unique bit pattern, or code point. Each
| code page has a unique coded character set identifier (CCSID), which is a value from
| 1 to 65,536.
UTF-8 represents ASCII invariant characters a-z, A-Z, 0-9, and certain special
characters such as ’ @ , . + - = / * ( ) identically as in ASCII. UTF-16 represents
such characters as X’00nn’ where X’nn’ is the representation of the character in
ASCII.
One or more encoding units are used to represent a character in a coded character
set. For UTF-16, an encoding unit takes 2 bytes of storage. Any character defined
in any EBCDIC code page is represented in one UTF-16 encoding unit when
converted to the national data representation.
RELATED TASKS
Chapter 7, “Coding for run-time use of national languages” on page 103
National literals
To specify national literals, use the prefix character N and compile with the option
NSYMBOL(NATIONAL). For example, you can use either of the following notations:
N“character-data”
N’character-data’
When you use 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 character NX. For
example:
NX“hexadecimal-digits”
Each of the following MOVE statements sets the data item X to the Unicode value
AB:
01 X pic NN usage national.
. . .
Move NX“00410042” to X
Move N“AB” to X
Move “AB” to X
Do not use alphanumeric hex literals in contexts that call for a national literal,
because such usage is easily misunderstood. For example, the statement:
Move X“C1C2C3C4” to X
When you use the figurative constant QUOTE, SPACE, or ZERO in a context that
requires national characters, the figurative constant represents a national character
value. However, you cannot use the figurative constants HIGH-VALUE and LOW-VALUE
in a context that requires national characters, such as a MOVE statement, an implicit
MOVE, or a relation condition with national operands.
1. Use the CODEPAGE compiler option to specify the code page for the EBCDIC code page
applicable to alphanumeric or DBCS data. National literals in your source program are
converted to UTF-16 for use at run time.
2. Most characters are represented in UTF-16 using one encoding unit. In particular, the
following cases are represented using a single UTF-16 encoding unit per character:
v COBOL characters A-Z, a-z, 0-9, space character, + -*/= $,;.“()><:’
v All characters that are converted from an EBCDIC code page
RELATED CONCEPTS
“Unicode and encoding of language characters” on page 105
RELATED TASKS
“Converting national data”
“Comparing national data items” on page 110
“Processing UTF-8 data” on page 109
RELATED REFERENCES
“CODEPAGE” on page 294
“NSYMBOL” on page 309
If the number of characters of the converted data is less than the size of the
national data item that you specify, the data is padded with default Unicode
UTF-16 space characters (NX’0020’). If the number of characters of the converted
data is more than the size of the national item, the trailing characters are truncated.
If you specify a code page as an argument to DISPLAY-OF and it differs from the
code page that you specify with the CODEPAGE compiler option, do not use the
DISPLAY-OF 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.
Conversion exceptions
Implicit or explicit conversion between national and alphanumeric data could fail
and generate a severity-3 Language Environment condition. Failures could occur if
any of the follow occur:
v Unicode Conversion Services was not installed on your system.
v The code page that you specified (implicitly or explicitly) is not a valid code
page.
v The combination of the CCSID that you specified explicitly or implicitly (such as
by using the CODEPAGE compiler option) and the UTF-16 Unicode CCSID (01200)
was not configured on your system as a valid conversion pair for the Unicode
Conversion Services on the system.
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 of
the target code page.
RELATED TASKS
Customizing Unicode support for COBOL (Enterprise COBOL Customization Guide)
RELATED REFERENCES
“CODEPAGE” on page 294
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
The following example illustrates these steps, converting Greek EBCDIC data to
UTF-8:
GB 18030 characters are encoded through the existing Chinese EBCDIC code page,
CCSID 1388, which has been expanded to include the GB 18030 characters that do
not require UTF-16 surrogate values. Surrogate values in UTF-16 are those characters
that require two 2-byte encoding units (4 bytes) for each character.
You can compare national data items explicitly or implicitly with certain
nonnational items in relation conditions in the following statements:
v EVALUATE
v IF
v PERFORM
v SEARCH
When you compare operands of unequal lengths, the shorter operand is treated as
if it were padded on the right with default Unicode UTF-16 space characters
(NX’0020’) to the length of the longer operand.
RELATED TASKS
“Using national data (Unicode) in COBOL” on page 105
“Coding a choice of actions” on page 75
“Tallying and replacing data items (INSPECT)” on page 95
“Coding a loop” on page 84
“Doing a serial search (SEARCH)” on page 71
“Joining data items (STRING)” on page 87
“Splitting data items (UNSTRING)” on page 89
RELATED REFERENCES
Relation condition (Enterprise COBOL Language Reference)
Comparison of numeric and alphanumeric operands (Enterprise COBOL Language
Reference)
The source of the information and the target for the results can be one or more of
the following:
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 115
“Allocating files” on page 117
“Checking for input or output errors” on page 118
With IBM Enterprise COBOL for z/OS and OS/390, 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 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. The
rate of data transfer is faster than it is for cards.
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)
RELATED TASKS
“Allocating files” on page 117
Chapter 9, “Processing QSAM files” on page 119
Chapter 10, “Processing VSAM files” on page 147
Chapter 11, “Processing line-sequential files” on page 173
“Choosing file organization and access mode”
The following table shows the possible file organizations, access modes, and record
formats for COBOL files.
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 116
“Allowable control characters” on page 174
RELATED TASKS
Chapter 9, “Processing QSAM files” on page 119
Chapter 10, “Processing VSAM files” on page 147
Chapter 11, “Processing line-sequential files” on page 173
Allocating files
For any type of file (sequential, line sequential, indexed, or relative) in your z/OS
or 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 HFS, 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:
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 checks the contents of the environment variable at each
OPEN statement. If a file with the same external name was dynamically allocated
by a previous OPEN statement and the contents of the environment variable
have changed since that OPEN, the run time dynamically deallocates the
previous allocation and reallocates the file using the options currently set in the
The COBOL run time deallocates all dynamic allocations at run unit termination,
except “implicit” CBLQDA allocations.
RELATED TASKS
“Setting and accessing environment variables” on page 398
“Defining and allocating QSAM files” on page 134
“Dynamically creating QSAM files with CBLQDA” on page 130
“Allocating VSAM files” on page 168
With VSAM files, you can use a second data-name in the FILE STATUS clause to get
additional VSAM return code information.
Another way of handling errors in input and output operations is to code ERROR
(synonymous with EXCEPTION) declaratives, as explained in the references below.
RELATED TASKS
“Handling errors in input and output operations” on page 223
“Coding ERROR declaratives” on page 227
“Using file status keys” on page 228
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 HFS.
You can also access byte-stream files in the HFS 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
“Labels for QSAM files” on page 141
Using access methods (z/OS DFSMS: Using Data Sets)
RELATED TASKS
“Defining QSAM files and records in COBOL”
“Coding input and output statements for QSAM files” on page 129
“Handling errors in QSAM files” on page 133
“Working with QSAM files” on page 133
“Processing QSAM ASCII files on tape” on page 143
“Processing ASCII file labels” on page 145
In the following example, COMMUTER-FILE-MST is your program’s name for the file;
COMMUTR is the external name.
Your ASSIGN clause name can include an S- before the external name (ddname or
environment variable name) to document that the file is a QSAM file.
RELATED TASKS
“Establishing record formats”
“Setting block sizes” on page 127
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 your FD entry for the file. If you want the records to
be blocked, code the BLOCK CONTAINS clause in your FD entry.
The following example shows how the FD entry might look for a file with
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 HFS. The above example is
appropriate for such a file.
RELATED CONCEPTS
“Logical records”
RELATED TASKS
“Requesting fixed-length format” on page 121
“Requesting variable-length format” on page 122
“Requesting spanned format” on page 124
“Requesting undefined format” on page 126
“Defining QSAM files and records in COBOL” on page 119
Logical records
The term logical record is used in a slightly different way in the COBOL language
and in z/OS QSAM. For format-V and format-S files, the 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 HFS byte-stream files, the definitions of QSAM logical record and
COBOL logical record are identical.
RELATED REFERENCES
“Layout of format-F records”
“Layout of format-V records” on page 123
“Layout of format-S records” on page 125
“Layout of format-U records” on page 126
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 (RECORD clause format 1).
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. Files in the HFS are never blocked.
RELATED CONCEPTS
“Logical records” on page 120
RELATED TASKS
“Requesting variable-length format” on page 122
“Requesting spanned format” on page 124
“Requesting undefined format” on page 126
“Establishing record formats” on page 120
RELATED REFERENCES
“Layout of format-F records”
RELATED TASKS
“Requesting fixed-length format” on page 121
Fixed-length record formats (z/OS DFSMS: Using Data Sets)
RELATED REFERENCES
“Layout of format-V records” on page 123
“Layout of format-S records” on page 125
“Layout of format-U records” on page 126
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 (RECORD clause format 3).
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.
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 (RECORD clause format 2).
Make integer-1 and integer-2 match the minimum length and the maximum
length 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 INTO statement for a format-V file, the record size 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 just read 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 moved corresponds to its level-01 record
description.
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 01-level 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 REFERENCES
“Layout of format-V records”
Moving from the VS COBOL II run time (Enterprise COBOL Compiler and Run-Time
Migration Guide)
Layout of format-V records: Format-V QSAM records have control fields (shown
below) preceding 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, but you must not include these 4 bytes in the description of the record
and record length.
The operating system provides the control bytes when the file is written; the
control byte fields do not appear in your description of the logical record in the
DATA DIVISION of your program. COBOL allocates input and output buffers 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, they’ll
be moved without the control bytes.
RELATED TASKS
“Requesting variable-length format” on page 122
RELATED REFERENCES
“Layout of format-F records” on page 121
“Layout of format-S records” on page 125
“Layout of format-U records” on page 126
You can omit the RECORDING MODE clause. The compiler determines the recording
mode to be S if the maximum record length 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 used for format V. The length is based on your
usage of the RECORD clause.
When creating files containing 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 long.
When retrieving files with format-S records, your 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:
v You can set block lengths to efficiently use track capacities on direct access
devices.
v You are not required to adjust the logical record lengths to device-dependent
physical block lengths. One logical record can span two or more physical blocks.
v You have greater flexibility when you want to transfer logical records between
direct access storage types.
Format-S files and READ INTO: By specifying a READ INTO statement for a
format-S file, the record size just 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 just read does not correspond to the level-01 record description. All
other rules of the MOVE statement apply.
RELATED CONCEPTS
“Logical records” on page 120
“Spanned blocked and unblocked files” on page 125
RELATED REFERENCES
“Layout of format-S records”
Spanned blocked and unblocked files: A spanned blocked QSAM file is made
up of blocks, each containing one or more logical records or segments of logical
records. The logical records can be either fixed or variable in length and their 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.
RELATED CONCEPTS
“Logical records” on page 120
RELATED TASKS
“Requesting spanned format” on page 124
Each block is preceded by a block descriptor field. There is only one block
descriptor field at the beginning of each physical block.
Each segment of a record in a block, even if the segment is the entire record, is
preceded by a segment descriptor field. There is one segment descriptor field for
each record segment in the block. The segment descriptor field also indicates
whether the segment is the first, the last, or an intermediate segment.
You do not describe these fields in the DATA DIVISION of your COBOL program,
and the fields are not available for you to use in your program.
RELATED TASKS
“Requesting spanned format” on page 124
RELATED REFERENCES
“Layout of format-F records” on page 121
“Layout of format-V records” on page 123
“Layout of format-U records” on page 126
| 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, and 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 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 (RECORD clause format 1), the record
length is the integer value, regardless of the lengths of the level-01 record
description entries associated with the file.
v If you use the RECORD IS VARYING clause (RECORD clause format 3), 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.
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 If you use the RECORD CONTAINS integer-1 TO integer-2 clause (RECORD clause
format 2), with integer-1 and integer-2 matching the minimum length and the
maximum length of the level-01 record description entries associated with the
file, the maximum record length is the integer-2 value.
v If you omit the RECORD clause, the maximum record length is determined to be
the size of the largest level-01 record description entry associated with the file.
Format-U files and READ INTO: When you specify a READ INTO statement for a
format-U file, the size of the record just 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 just read does not correspond to the level-01 record
description. All other rules of the MOVE statement apply.
RELATED TASKS
“Requesting fixed-length format” on page 121
“Requesting variable-length format” on page 122
“Requesting spanned format” on page 124
“Establishing record formats” on page 120
RELATED REFERENCES
“Layout of format-U records”
RELATED TASKS
“Requesting undefined format” on page 126
RELATED REFERENCES
“Layout of format-F records” on page 121
“Layout of format-V records” on page 123
“Layout of format-S records” on page 125
If you set the block size explicitly in the BLOCK CONTAINS clause, it must not be
greater than the maximum block size for the device. The block size 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
while doing one of the following:
v Reading a block of records of fewer than 12 bytes
v Writing a block of records of fewer than 18 bytes
Generally larger blocks 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.
If you specify a block size larger than 32760 directly on your BLOCK CONTAINS
clause or indirectly with the use of BLOCK CONTAINS n RECORDS, and you do not
meet both the following conditions, the OPEN of the data set fails with file status
code 90:
v You use OS/390 V2R10.0 DFSMS or later.
v You define the data set to be 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 an MVS system that uses OS/390 V2R10.0 DFSMS or
later and 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 run-time message is issued.
BLKSZLIM is device-independent.
RELATED TASKS
“Defining QSAM files and records in COBOL” on page 119
z/OS DFSMS: Using Data Sets
RELATED REFERENCE
BLOCK CONTAINS clause (Enterprise COBOL Language Reference)
RELATED TASKS
“Opening QSAM files” on page 130
“Adding records to QSAM files” on page 131
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)
Status key (Common processing facilities) (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.
Execution of the OPEN statement will then position the file at its end. Subsequent
READ statements read the data records in reverse order, starting with the last record.
The REVERSED option is supported only for files with fixed-length records.
RELATED TASKS
“Dynamically creating QSAM files with CBLQDA”
RELATED REFERENCES
OPEN statement (Enterprise COBOL Language Reference)
Sometimes a QSAM file is unavailable on the operating system, but the COBOL
language defines that the file be created. The file is implicitly created for you if
you use the run-time option CBLQDA and one of the following circumstances exists:
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 and FD statements in your
program.
Do not confuse this implicit allocation mechanism with the dynamic allocation of
files through the use of environment variables. That explicit dynamic allocation
requires a valid environment variable to be set. This CBLQDA support is used only
when the QSAM file is unavailable as defined above, which includes no valid
environment variable being set.
Under z/OS, files created using the CBLQDA option are temporary data sets and do
not exist after the program has run.
RELATED TASKS
“Opening QSAM files” on page 130
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 in the file. (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 the
| compressed format.
RELATED REFERENCES
REWRITE statement (Enterprise COBOL Language Reference)
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 clause,
COBOL first calculates the sum of LINAGE-COUNTER plus nn. Subsequent actions
depend on the size of nn. The END-OF-PAGE imperative statement 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 statement is performed.
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 option from
your WRITE statement, you get the equivalent of:
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, except for files defined in any OS/VS COBOL programs in
the run unit:
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 you have set the TRAP(ON) run-time option,
the run time closes all open files that are defined in any COBOL programs in the
run unit.
v When Language Environment condition handling is 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 HLL language constructs
such as a C longjmp.
File status key data items that you define in the WORKING-STORAGE SECTION are set
when these implicit CLOSE operations are performed, but your EXCEPTION/ERROR
and LABEL declaratives are not invoked.
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 run-time 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 223
RELATED REFERENCES
“Allocation of buffers for QSAM files” on page 140
You can optionally specify the following attributes in any order following the 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
HFS. To do this, define one of the following with a name that matches the external
name on your 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 HFS files, but this use is not recommended. To process text files in the HFS, use
LINE SEQUENTIAL organization. If you do use QSAM to process text files in the HFS,
you cannot use environment variables to define the files.
When you define a QSAM file, use the specified parameters to do the following:
Some of the information about the QSAM file must always be coded in the
FILE-CONTROL entry, 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 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:
v Block size (BLKSIZE=), if BLOCK CONTAINS 0 RECORDS was coded at compile time
(which is 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 127
“Defining QSAM files and records in COBOL” on page 119
“Allocating files” on page 117
RELATED REFERENCES
“Parameters for creating QSAM files”
MVS JCL Reference
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”
To prevent common file status 39 problems, follow the guidelines listed below for
processing files that are existing, new, or dynamically created by COBOL.
If the existing file is an ASCII data set (DCB=(OPTCD=Q)), you must use the CODE-SET
clause in the program’s FD entry for the file.
When you do need to explicitly set a length attribute for the data set (for example,
you are using an ISPF allocation panel or if your DD statement is for a batch job in
which the program uses RECORD CONTAINS 0):
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 your 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 COBOL language used in your
program. In such a case, take the added byte into account when coding the
LRECL.
For example, suppose your program contains the following code for a file with
variable-length records:
RELATED TASKS
“Requesting fixed-length format” on page 121
“Requesting variable-length format” on page 122
“Requesting undefined format” on page 126
“Dynamically creating QSAM files with CBLQDA” on page 130
Striped extended-format QSAM data sets can benefit an application with these
characteristics:
v The application processes files that contain large volumes of data.
v The time for the input and output operations to the files significantly affects
overall performance.
For you to gain the maximum benefit from using QSAM striped data sets, 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:
v Avoid using a QSAM striped data set for a file that cannot have buffers
allocated above the 16-MB line.
v Omit the RESERVE clause in the FILE-CONTROL paragraph entry for the file.
Omitting the RESERVE clause allows DFSMS to determine the optimum number
of buffers for the data set.
v Compile your program with the DATA(31) and RENT compiler options, and make
the load module AMODE 31.
v Specify the ALL31(ON) run-time option if the file is an EXTERNAL file with
format-F, format-V, or format-U records.
Notice 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 (performance considerations)
RELATED REFERENCES
“Allocation of buffers for QSAM files” on page 140
RELATED CONCEPTS
“Storage and its addressability” on page 33
RELATED TASKS
“Using striped extended-format QSAM data sets” on page 139
Usage notes
v File status 39 (fixed file attribute conflict) is not enforced for either of the
following:
– Record-length conflict
– Record-type conflict (fixed versus variable)
v A READ returns the number of bytes equal to that of the maximum logical record
size for the file except for the last record, which might be shorter.
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 HFS files, but this use is not recommended. To process text files in the HFS, use
the LINE SEQUENTIAL organization. If you use QSAM to process text files in the
HFS, you cannot use environment variables to define the files.
RELATED TASKS
“Allocating files” on page 117
“Defining and allocating QSAM files” on page 134
Accessing HFS files via BSAM and QSAM (z/OS DFSMS: Using Data Sets)
There are two kinds of labels: standard and nonstandard. IBM Enterprise COBOL
for z/OS and OS/390 does not support nonstandard user labels. In addition,
standard user labels contain user-specified information about the associated data
set.
Standard labels consist of volume labels and groups of data set labels. Volume
labels precede or follow data on the volume, and identify and describe the volume.
The data set labels precede or follow each data set on the volume, and identify and
describe the data set.
v The data set labels that precede the data set are called header labels.
v The data set labels that follow the data set are called trailer labels.
They are similar to the header labels, except that they also contain a count of
blocks in the data set.
v The data set label groups can optionally include standard user labels.
v The volume label groups can optionally include standard user labels.
RELATED TASKS
“Using trailer and header labels”
RELATED REFERENCES
“Format of standard labels” on page 143
You can create, examine, or update up to eight header labels and eight trailer
labels on each volume of the data set. (QSAM EXTEND works in a manner identical
to OUTPUT except that the beginning-of-file label is not processed.) Labels reside on
the initial volume of a multivolume data set. This volume must be mounted as
If you code a header or trailer with the wrong position number, the result is
unpredictable. (Data management might force the label to the correct relative
position.)
When you use standard label processing, code the label type of the standard and
user labels (SUL) on the DD statement that describes the data set.
List the labels as data-names in the LABEL RECORDS clause in the FD entry for the file.
You can specify a special exit by using the statement GO TO MORE-LABELS. When
this statement results in an exit from a label DECLARATIVE SECTION, the system does
one of the following:
v Writes the current beginning or ending label and then reenters the USE section at
its beginning to create more labels. After creating the last label, the system exits
by performing the last statement of the section.
v Reads an additional beginning or ending label, and then reenters the USE section
at its beginning to check more labels. When processing user labels, the system
reenters the section only if there is another user label to check. Hence, a program
path that flows through the last statement in the section is not needed.
RELATED CONCEPTS
“Labels for QSAM files” on page 141
Identifier Description
VOL1 Volume label
HDR1 or HDR2 Data set header labels
EOV1 or EOV2 Data set trailer labels (end-of-volume)
EOF1 or EOF2 Data set trailer labels (end-of-data-set)
UHL1 to UHL8 User header labels
UTL1 to UTL8 User trailer labels
The format of the label for a direct-access volume is the almost the same as the
format of the label group for a tape volume label group. The difference is that a
data set label of the initial DASTO volume label consists of the data set control
block (DSCB). The DSCB appears in the volume table of contents (VTOC) and
contains the equivalent of the tape data set header and trailer, in addition to
control information such as space allocation.
The format used for user header labels (UHL1-8) and user trailer labels (UTL1-8)
consists of a label 80 characters in length recorded in either:
v EBCDIC on DASD or on IBM standard labeled tapes, or
v ASCII on ISO/ANSI labeled tapes
The first 3 bytes consist of the characters that identify the label as either:
v UHL for a user header label (at the beginning of a data set), or
v UTL for a user trailer label (at the end-of-volume or end-of-data set)
The next byte contains the relative position of this label within a set of labels of the
same type. One through eight labels are permitted.
Standard user labels are not supported for QSAM striped data sets.
RELATED CONCEPTS
“Labels for QSAM files” on page 141
In addition, if your program processes numeric data items from ASCII files, use the
separately signed numeric data type (SIGN IS LEADING SEPARATE).
If you are using 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.
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.
All ANS user labels are optional. ASCII files can have user header labels (UHLn)
and user trailer labels (UTLn). There is no limit to the number of user labels at the
beginning and the end of a file; you can write as many labels as you need. All user
labels must be 80 bytes in length.
To create or verify user labels (user label exit), code a USE AFTER STANDARD LABEL
procedure. You cannot use USE BEFORE STANDARD LABEL procedures.
Any labels on an ASCII tape must be in ASCII code only. Tapes containing a
combination of ASCII and EBCDIC cannot be read.
RELATED TASKS
“Processing QSAM ASCII files on tape” on page 143
The lists below show how VSAM terms differ from COBOL terms and other terms
that you might be familiar with.
The term file in this VSAM information refers to either a COBOL file or a VSAM
data set.
If you have complex requirements or frequently use VSAM, review the VSAM
publications for your operating system.
RELATED TASKS
“Defining VSAM file organization and records” on page 149
“Coding input and output statements for VSAM files” on page 155
“Protecting VSAM files with a password” on page 164
“Handling errors in VSAM files” on page 163
“Working with VSAM data sets under z/OS and UNIX” on page 165
“Improving VSAM performance” on page 171
RELATED REFERENCES
z/OS DFSMS: Using Data Sets
VSAM files
The physical organization of VSAM data sets differs considerably from those used
by other access methods. VSAM data sets are held in control intervals and control
areas (CA). The size of these 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 different types of VSAM data sets in terms of
several characteristics.
RELATED TASKS
“Specifying sequential organization for VSAM files” on page 150
“Specifying indexed organization for VSAM files” on page 150
“Specifying relative organization for VSAM files” on page 151
“Defining VSAM files” on page 165
In the FILE SECTION of the DATA DIVISION, code a file description (FD) entry for the
file. In the associated record description entry or entries, define the record-name and
record length. Code the logical size of the records with the RECORD clause.
Important: You can process VSAM data sets in Enterprise COBOL programs only
after you define them with access method services.
The following table summarizes VSAM file organization, access modes, and record
formats (fixed or variable length).
RELATED TASKS
“Specifying sequential organization for VSAM files”
“Specifying indexed organization for VSAM files”
“Specifying relative organization for VSAM files” on page 151
“Using file status keys” on page 228
“Using VSAM return codes (VSAM files only)” on page 229
“Defining VSAM files” on page 165
“Specifying access modes for VSAM files” on page 153
You can access (read or write) records in sequential files only sequentially.
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 148
Here data-name is the name of the key field as you defined it in the record
description entry in the DATA DIVISION. The collation of index record keys is based
on the binary value of the key, regardless of the class or the category of the key.
The following example shows the statements for a VSAM indexed file (KSDS) that
is accessed dynamically. In addition to the primary key, COMMUTER-NO, there is an
alternate key, LOCATION-NO:
Alternate keys
In addition to the primary key, you can also code one or more alternate keys to use
for retrieving records. Using alternate keys, you can access the indexed file to read
records in some sequence other than the prime key sequence. For example, you
could access the file through employee department rather than through employee
number. Alternate keys need not be unique. More than one record will be accessed,
given a department number as a key. This is permitted if alternate keys are coded
to allow duplicates.
You define the alternate key in your COBOL program with the ALTERNATE RECORD
KEY clause:
ALTERNATE RECORD KEY IS data-name
Here data-name is the name of the key field as you defined it in the record
description entry in the DATA DIVISION. The collation of alternate keys is based on
the binary value of the key, regardless of the class or the category of the key.
Alternate index
To use an alternate index, you need to define a data set (using access method
services) called the alternate index (AIX). 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.
RELATED CONCEPTS
“VSAM files” on page 148
RELATED TASKS
“Creating alternate indexes” on page 166
Use the RELATIVE KEY IS clause to associate each logical record with its relative
record number.
The following example shows a relative-record data set (RRDS) that is accessed
randomly by the value in the relative key ITEM-NO:
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
randomizing algorithm is the division/remainder technique. With this technique,
When you load an RRDS with variable-length records, you can skip over relative
record numbers. Unlike fixed-length RRDS, a variable-length RRDS does not have
slots. Instead, the free space that you define allows for more efficient record
insertions.
The coding that you use in your COBOL program to identify and describe VSAM
variable-length RRDS and COBOL simulated variable-length RRDS is similar. How
you use the SIMVRD run-time option and whether you define the VSAM file as a
RRDS or KSDS differs, however.
When you define the cluster in step 4 for simulated variable-length RRDS, observe
these restrictions:
v Do not define an alternate index.
v Do not specify a KEYRANGE.
v Do not specify SPANNED.
Also, use the REUSE parameter when you open for output a file that contains
records.
Errors: When you work with simulated variable-length relative data sets and true
VSAM RRDS data sets, you get an OPEN file status 39 if your COBOL file definition
and the VSAM data set attributes do not match.
RELATED CONCEPTS
“VSAM files” on page 148
RELATED TASKS
“Defining VSAM files” on page 165
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 159
RELATED TASKS
“Reading records from a VSAM file” on page 159
Because the concept of blocking has no meaning for VSAM files, you can omit the
BLOCK CONTAINS clause. The clause is syntax-checked, but it has no effect on how
the program runs.
Clause
RECORD clause format Record length Comments
Code RECORD CONTAINS 1 Fixed in size with a The lengths of the
integer. length of integer-2 level-01 record
description entries
associated with the file
do not matter.
Omit the RECORD clause, The fixed size that you
but code all level-01 coded
records (associated with
the file) as the same size
and none with an OCCURS
DEPENDING ON clause.
Clause
RECORD clause format Maximum record length Comments
Code RECORD IS VARYING 3 integer-2 value The lengths of the
FROM integer-1 TO integer-2. level-01 record
description entries
associated with the file
do not matter.
When you specify a READ INTO statement for a format-V file, the record size 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 TASKS
Enterprise COBOL Compiler and Run-Time Migration Guide
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 with sequential files (ESDS).
The X indicates that you can use the statement with the open mode at the top of
the column.
The following table shows the possible combinations you can use with indexed
(KSDS) files and relative (RRDS) files. The X indicates that you can use the
statement with the open mode at the top of the column.
The fields 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 CONCEPTS
“File position indicator” on page 157
RELATED REFERENCES
Status key (Common processing facilities) (Enterprise COBOL Language Reference)
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 159
For example, if you OPEN EXTEND, OPEN I-O, or OPEN INPUT a file that is neither
optional nor available, you get file status 35 and the OPEN statement fails. If the file
is OPTIONAL, the OPEN EXTEND, OPEN I-O, or OPEN INPUT creates the file and returns
file status 05.
An OPEN operation works successfully only when you set fixed file attributes in the
DD statement or data set label for a file and specify consistent attributes for that file
in the SELECT and FD statements of your COBOL program. Mismatches in the
following items result in a file status code 39, and the OPEN statement fails:
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 in your COBOL program 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 159
Optional files are files that are not necessarily present each time the program is
run. You can define files opened in INPUT, I-O, or OUTPUT mode as optional by
defining them with the SELECT OPTIONAL phrase in the FILE-CONTROL section of
your program.
Initially loading records sequentially into a file: Initially loading a file means
writing records into the file for the first time. This is not the same as writing
records into a file from which all previous records have been deleted.
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 impact 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.
In addition to extra overhead for preparing files for use, random processing does
not consider any user-defined free space. As a result, any future insertions might
be inefficient. Sequential processing maintains user-defined free space.
RELATED TASKS
“Opening a loaded file (a file with records)”
RELATED REFERENCES
“Statements to load records into a VSAM file”
REPRO (z/OS DFSMS: Access Method Services for Catalogs)
RELATED TASKS
“Opening an empty file” on page 158
“Updating records in a VSAM file” on page 160
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 TASKS
“Opening an empty file” on page 158
“Working with VSAM data sets under z/OS and UNIX” on page 165
RELATED REFERENCES
“Statements to load records into a VSAM file”
z/OS DFSMS: Access Method Services for Catalogs
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 157
RELATED TASKS
“Specifying access modes for VSAM files” on page 153
RELATED REFERENCES
“Statements to load records into a VSAM file” on page 159
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 relative files, the records must be in sequence. If you include a RELATIVE KEY
data item in the SELECT clause, the relative record number of the record to be
written is placed in that data item.
To replace records randomly or dynamically, your program need not read the
record to be rewritten. Instead, to position the record that you want to update, do
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 need not
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, except for files defined in any OS/VS COBOL programs in
the run unit:
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) run-time option has been
set, all open files defined in any COBOL programs in the run unit are closed.
File status key data items that you define in the WORKING-STORAGE SECTION are set
when these implicit CLOSE operations are performed, but your EXCEPTION/ERROR
and LABEL declaratives are not invoked.
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 when you have 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 input/output error occurs.
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 return 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 every 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 run-time option
ABTERMENC(ABEND).
RELATED REFERENCES
VSAM macro return and reason codes (z/OS DFSMS Macro Instructions for Data
Sets)
To use explicit passwords, code the PASSWORD clause in the SELECT statement of
your program. Use this clause only if the catalog entry for the files includes a read
or an update password.
v If the catalog entry includes a read password, you cannot open and access the
file in a COBOL program unless you use the password clause in the
FILE-CONTROL paragraph and describe it in the DATA DIVISION. The data-name
referred to must contain a valid password when the file is opened.
v If the catalog entry includes an update password, you can open and access it,
but not update it, unless you code the password clause in the FILE-CONTROL
paragraph and describe it in the DATA DIVISION.
v If the catalog entry includes both a read password and an update password,
specify the update password to both read and update the file in your program.
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.
A VSAM file is unavailable if it has never contained a record, even if you have
defined it.
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 10
“Defining VSAM files”
“Creating alternate indexes” on page 166
“Allocating VSAM files” on page 168
“Sharing VSAM files through RLS” on page 170
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 access method services DEFINE CLUSTER command to define your VSAM
data sets (clusters). This process includes creating an entry in an integrated catalog
without any data transfer.
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:
DEFINE CLUSTER NUMBERED
RECORDSIZE(n,n)
When you define a data set in this way, all records will be padded to the fixed
slot size n. If you use the RECORD IS VARYING ON data-name form of the RECORD
clause, a WRITE or REWRITE will use the length specified in the DEPENDING ON
data-name as the length of the record to be transferred by VSAM. This data is
then padded to the fixed slot size. READ statements always return the fixed slot
size in the DEPENDING ON data-name.
v For VSAM variable-length relative-record data sets (RRDS), specify the average
size COBOL record expected and the maximum size COBOL record expected:
DEFINE CLUSTER NUMBERED
RECORDSIZE(avg,m)
The average size COBOL record expected must be less than the maximum size
COBOL record expected.
v For COBOL simulated variable-length relative-record data sets, specify the
average size of the COBOL records and a size that is greater than or equal to the
maximum size COBOL record plus 4:
DEFINE CLUSTER INDEXED
KEYS(4,0)
RECORDSIZE(avg,m)
The average size COBOL record expected must be less than the maximum size
COBOL record expected.
RELATED TASKS
“Creating alternate indexes”
“Allocating VSAM files” on page 168
“Specifying relative organization for VSAM files” on page 151
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.
The base cluster and alternate index are described by entries in the same
catalog.
3. Load the VSAM indexed data set.
4. Build the alternate index by using (typically) the BLDINDEX command. Identify
the input file as the indexed data set (base cluster) and the output file as the
alternate index or its path. This command BLDINDEX reads all the records in
your VSAM indexed data set (or base cluster) and extracts the data needed to
build the alternate index.
Alternatively, you can use the run-time option AIXBLD to build the alternate
index at run time. However, this option might adversely affect run-time
performance.
RELATED REFERENCES
AIXBLD (COBOL only) (Language Environment Programming Reference)
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 166
Allocation of VSAM files (indexed, relative, and sequential) follows the general
rules for the allocation of COBOL files. If you use an environment variable to
allocate a VSAM file, you must specify these options in the order shown, but no
others:
v DSN(dsname), where dsname is the name of the base cluster
v OLD or SHR
The basic DD statement that you need for your VSAM files is:
//ddname DD DSN=dsname,DISP=SHR,AMP=AMORG
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 used to supplement 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 not required except 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 your 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 of the SELECT statement in
your COBOL program.
When you use alternate indexes in your COBOL program, you must specify not
only a system-name (using a DD statement or environment variable) for the base
cluster, but also one for each alternate index path. No language mechanism exists
to explicitly declare system-names for alternate index paths within the program.
Therefore, you must adhere to the following guidelines for forming the
system-name (ddname or environment variable name) for each alternate index
path:
v Concatenate the base cluster name with an integer.
v Begin with 1 for the path associated with the first alternate record defined for
the file in your program (ALTERNATE RECORD KEY clause of the SELECT statement).
v Increment by 1 for the path associated with each successive alternate record
definition for that file.
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 and 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 117
You cannot specify RLS if you allocate your VSAM data set with an environment
variable.
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 issued and another user might update the record.
The locking rules for RLS=CR can cause the application to wait for availability of a
record lock, and this wait might slow down the READ for input.
You might need to modify your application logic to use the RLS=CR capability. Do
not use the RLS JCL 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 a
good idea to issue an OPEN or START immediately before a READ. If there is a delay
between the OPEN or START and the actual 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.
The COBOL run time generates message IGZ0205W and automatically closes the
file if the error occurs during OPEN processing.
All other RLS mode errors return a VSAM return code of 4, 8, or 12.
RELATED TASKS
“Specifying access modes for VSAM files” on page 153
Deciding how big a virtual resource pool to provide (z/OS DFSMS: Using Data Sets)
Selecting the optimal percentage of free space (z/OS DFSMS: Using Data Sets)
RELATED REFERENCES
z/OS DFSMS: Access Method Services for Catalogs
After you have created a record, you cannot change its length or its position in the
file, and you cannot delete it.
RELATED CONCEPTS
UNIX System Services User’s Guide
RELATED TASKS
“Defining line-sequential files and records in COBOL”
“Describing the structure of a line-sequential file” on page 174
“Coding input-output statements for line-sequential files” on page 175
“Handling errors in line-sequential files” on page 178
“Defining and allocating line-sequential files” on page 175
RELATED REFERENCES
“Allowable control characters” on page 174
In the following example, COMMUTER-FILE is the name that your program uses for
the file; COMMUTR is the external name.
FILE-CONTROL.
SELECT COMMUTER-FILE
ASSIGN TO COMMUTR
ORGANIZATION IS LINE SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS ECODE.
Your ASSIGN assignment-name clause must not include an organization field (S- or
AS-) before the external name. The ACCESS phrase and the FILE STATUS phrase are
optional.
RELATED REFERENCES
“Allowable control characters”
The new-line character is treated as a record delimiter. The other control characters
are treated as data and are part of the record.
RELATED TASKS
“Defining line-sequential files and records in COBOL” on page 173
Code the logical size of the records with 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
“Defining line-sequential files and records in COBOL” on page 173
“Coding input-output statements for line-sequential files”
“Defining and allocating line-sequential files”
RELATED REFERENCES
Data Division—file description entries (Enterprise COBOL Language Reference)
To define a line-sequential file, define one of the following with a name that
matches the external name on your ASSIGN clause:
v A DD allocation:
– A DD statement that specifies PATH=’absolute-path-name’
– A TSO allocation that specifies PATH(’absolute-path-name’)
RELATED TASKS
“Allocating files” on page 117
“Defining line-sequential files and records in COBOL” on page 173
RELATED REFERENCES
MVS JCL Reference
RELATED TASKS
“Defining line-sequential files and records in COBOL” on page 173
“Describing the structure of a line-sequential file” on page 174
“Opening line-sequential files”
“Reading records from line-sequential files”
“Adding records to line-sequential files” on page 177
“Closing line-sequential files” on page 177
“Handling errors in line-sequential files” on page 178
RELATED REFERENCES
OPEN statement (Enterprise COBOL Language Reference)
READ statement (Enterprise COBOL Language Reference)
WRITE statement (Enterprise COBOL Language Reference)
CLOSE statement (Enterprise COBOL Language Reference)
An OPEN statement works if the file is available or has been dynamically allocated.
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 177
“Closing line-sequential files” on page 177
“Defining and allocating line-sequential files” on page 175
RELATED REFERENCES
OPEN statement (Enterprise COBOL Language Reference)
CLOSE statement (Enterprise COBOL Language Reference)
With sequential processing, your program reads one record after another in the
same order in which the records were entered when the file was created.
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 new-line 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.)
RELATED TASKS
“Opening line-sequential files” on page 176
“Adding records to line-sequential files”
“Closing line-sequential files”
“Defining and allocating line-sequential files” on page 175
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. External decimal data items must be unsigned or declared with
the SEPARATE CHARACTER phrase if signed.
RELATED TASKS
“Opening line-sequential files” on page 176
“Reading records from line-sequential files” on page 176
“Closing line-sequential files”
“Defining and allocating line-sequential files” on page 175
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) run-time 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.
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 176
“Reading records from line-sequential files” on page 176
“Adding records to line-sequential files” on page 177
“Defining and allocating line-sequential files” on page 175
RELATED REFERENCES
CLOSE statement (Enterprise COBOL Language Reference)
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, it is possible that your
program could continue; but the results will probably not be what you expected.
RELATED TASKS
“Coding input-output statements for line-sequential files” on page 175
“Handling errors in input and output operations” on page 223
You can mix SORT and MERGE statements in the same COBOL program. 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
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 180
RELATED TASKS
“Describing the sort or merge file” on page 180
“Describing the input to sorting or merging” on page 181
“Describing the output from sorting or merging” on page 183
“Requesting the sort or merge” on page 186
“Determining whether the sort or merge was successful” on page 190
RELATED REFERENCES
“CICS SORT application restrictions” on page 197
SORT statement (Enterprise COBOL Language Reference)
MERGE statement (Enterprise COBOL Language Reference)
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. 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. You
can order the records in either ascending or descending order of each key.
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 REFERENCES
SORT statement (Enterprise COBOL Language Reference)
MERGE statement (Enterprise COBOL Language Reference)
Sort-Work-1 is the name of the file in your program. Use this name to refer to
the file.
2. Describe the sort file in an SD entry in the FILE SECTION of the DATA DIVISION.
Every SD entry must contain a record description. For example:
DATA DIVISION.
FILE SECTION.
SD Sort-Work-1
RECORD CONTAINS 100 CHARACTERS.
01 SORT-WORK-1-AREA.
05 SORT-KEY-1 PIC X(10).
05 SORT-KEY-2 PIC X(10).
05 FILLER PIC X(80).
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. You do
not need to provide a ddname definition for the file.
RELATED REFERENCES
“FILE SECTION entries” on page 13
Input-File is the name of the file in your program. Use this name to refer to the
file.
2. Describe the input file (or files when merging) in an FD entry in the FILE
SECTION of the DATA DIVISION. For example:
DATA DIVISION.
FILE SECTION.
FD Input-File
LABEL RECORDS ARE STANDARD
BLOCK CONTAINS 0 CHARACTERS
RECORDING MODE IS F
RECORD CONTAINS 100 CHARACTERS.
01 Input-Record PIC X(100).
RELATED TASKS
“Coding the input procedure” on page 182
“Requesting the sort or merge” on page 186
RELATED REFERENCES
“FILE SECTION entries” on page 13
RELATED TASKS
“Requesting the sort or merge” on page 186
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 185
RELEASE statement (Enterprise COBOL Language Reference)
Output-File is the name of the file in your program. Use this name to refer to
the file.
2. Describe the output file (or files when merging) in an FD entry in the FILE
SECTION of the DATA DIVISION. For example:
DATA DIVISION.
FILE SECTION.
FD Output-File
LABEL RECORDS ARE STANDARD
BLOCK CONTAINS 0 CHARACTERS
RECORDING MODE IS F
RECORD CONTAINS 100 CHARACTERS.
01 Output-Record PIC X(100).
RELATED TASKS
“Coding the output procedure”
“Requesting the sort or merge” on page 186
RELATED REFERENCES
“FILE SECTION entries” on page 13
You can use the AT END and END-RETURN phrases with the RETURN statement. The
imperative statements on 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 the RETURN INTO statement instead of RETURN, your records will be
returned to WORKING-STORAGE or to an output area.
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 185
RETURN statement (Enterprise COBOL Language Reference)
RELATED TASKS
“Coding the input procedure” on page 182
“Coding the output procedure” on page 183
Planning to link-edit and run (Language Environment Programming Guide)
RELATED TASKS
“Controlling sort behavior” on page 193
“Using checkpoint/restart with DFSORT” on page 196
The compiler will determine that the sort work file is variable length if you code
one of the following in its SD entry:
v A RECORD IS VARYING clause
v Two or more record descriptions that define records with different sizes, or
records that contain an OCCURS DEPENDING ON clause
You cannot code 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 195
“Controlling sort behavior” on page 193
To transfer sorted or merged records from the sort or merge program directly to
another file without any further processing, use SORT . . . GIVING or MERGE . . .
GIVING and the name of the output file that you have declared in a SELECT
statement. The compiler generates an output procedure to open the output file,
return the records, write the records, and close the file. The output file must not be
open when the SORT or MERGE statement begins execution. For example:
SORT Sort-Work-1
ON ASCENDING KEY Sort-Key-1
USING Input-File
GIVING Output-File.
The USING or GIVING files on a SORT or MERGE statement can be sequential files
residing in the HFS.
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.
You must define Merge-Work in an SD statement in the FILE SECTION of the DATA
DIVISION, and the input files in FD statements in the FILE SECTION.
You can specify national data items as keys for sorting and merging. The binary
collating sequence is applied to such keys. If you specify a national data item as a
sort or merge key, any COLLATING SEQUENCE phrase on 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 CONCEPTS
Appendix B, “Complex OCCURS DEPENDING ON” on page 587 (variably located
items)
RELATED TASKS
“Defining sort and merge data sets” on page 185
RELATED TASKS
“Requesting the sort or merge” on page 186
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, where you define the alphabet-name as STANDARD-1 in the SPECIAL-NAMES
paragraph.
RELATED TASKS
“Specifying the collating sequence” on page 8
RELATED REFERENCES
SORT statement (Enterprise COBOL Language Reference)
To sort on a windowed date field, use the DATE FORMAT clause to define a
windowed date field; then use the field as the sort key. DFSORT will use the same
century window as that used by the compilation unit. Specify the century window
with the YEARWINDOW compiler option.
DFSORT supports year-last windowed date fields, although the compiler itself
does not provide automatic windowing for year-last windowed date fields in
statements other than MERGE or SORT.
RELATED TASKS
“Sorting and merging by date” on page 541
RELATED REFERENCES
“YEARWINDOW” on page 331
DATE FORMAT clause (Enterprise COBOL Language Reference)
OPTION control statement (Y2PAST option) (DFSORT Application Programming
Guide)
RELATED REFERENCES
OPTION control statement (DFSORT Application Programming Guide)
The completion code is stored in the SORT-RETURN special register. The contents of
this register change after each SORT or MERGE statement is performed.
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 return code. If the return code is 16, COBOL issues a run-time
diagnostic message.
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 return code.
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.
RELATED TASKS
“Checking for sort errors with NOFASTSRT” on page 193
“Controlling sort behavior” on page 193
RELATED REFERENCES
DFSORT messages and return codes (DFSORT Application Programming Guide)
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 302
“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 in the JCL
must match the FD description.
To use FASTSRT, you must describe and process the input files to the sort, and the
output files from the sort, in these ways:
v You can mention only one input file in the USING phrase. You can mention only
one output file in the GIVING phrase.
v You cannot use an input procedure on an input file, nor an output procedure on
an output file.
Instead of using input or output procedures, you might be able to use DFSORT
control statements:
– INREC
– OUTREC
– INCLUDE
– OMIT
– STOPAFT
– SKIPREC
Many DFSORT functions perform the same operations that are common in input
or output procedures. Code the appropriate DFSORT control statements instead,
and place them either in the IGZSRTCD data set or the SORTCNTL data set.
v Do not code the LINAGE clause for the output FD entry.
v Do not code any INPUT declarative (for input files), OUTPUT declarative (for
output files), or file-specific declaratives (for either input or output files) to
apply to any FDs used in the sort.
v Do not use a variable relative file as the input or output file.
v Do not use a line-sequential file as the input or output file.
v For either an input or an output file, the record descriptions of the SD and FD
entry must define the same format (fixed or variable), and the largest records of
the SD and FD entry must define the same record length.
Note that 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 the following:
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
On the other hand, if you code the same file name in the USING and GIVING
phrases, or assign the input and output files the same ddname, then the file can
be accepted for FASTSRT either for input or output, but not both. If no other
conditions disqualify the file from being eligible for FASTSRT on input, then the
file will be accepted for FASTSRT on input, but not on output. If the file was
found to be ineligible for FASTSRT on input, it might be eligible for FASTSRT on
output.
A QSAM file that qualifies for FASTSRT can be accessed by the COBOL program
while the SORT statement is being performed. For example, if the file is used for
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 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 will fail.)
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.
RELATED TASKS
“Determining whether the sort or merge was successful” on page 190
“Using file status keys” on page 228
“Coding ERROR declaratives” on page 227
“Stopping a sort or merge operation prematurely” on page 190
The table below lists those aspects of sort behavior that you can affect using
special registers or compiler options, and the equivalent sort control statement
keywords if any.
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 TASKS
“Determining whether the sort or merge was successful” on page 190
“Stopping a sort or merge operation prematurely” on page 190
“Changing DFSORT defaults with control statements” on page 195
RELATED REFERENCES
“Default characteristics of the IGZSRTCD data set”
The control statements that you can include in the IGZSRTCD data set (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. No labels or comments are allowed on a record, and a record itself
cannot be a DFSORT comment statement.
RELATED TASKS
“Controlling sort behavior” on page 193
Using DFSORT program control statements (DFSORT Application Programming
Guide)
RELATED REFERENCES
“Default characteristics of the IGZSRTCD data set”
The IGZSRTCD data set is optional. 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 193
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 the following:
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 in your COBOL program.
RELATED TASKS
“Controlling sort behavior” on page 193
DFSORT Installation and Customization
RELATED REFERENCES
OPTION control statement (DFSORT Application Programming Guide)
RELATED TASKS
“Controlling sort behavior” on page 193
“Coding the input procedure” on page 182
DFSORT Application Programming Guide
RELATED CONCEPTS
Chapter 30, “Interrupts and checkpoint/restart” on page 519
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 182
“Coding the output procedure” on page 183
RELATED REFERENCES
“CICS SORT application restrictions”
RELATED CONCEPTS
“XML parser in COBOL”
RELATED TASKS
“Accessing XML documents” on page 201
“Parsing XML documents” on page 201
“Processing XML events” on page 202
“Handling errors in XML documents” on page 215
“Understanding XML document encoding” on page 213
RELATED REFERENCE
Appendix D, “XML reference material” on page 599
XML specification (www.w3c.org/XML/)
You start this exchange with the parser by using the XML PARSE statement, in which
you designate your processing procedure. Execution of this XML PARSE statement
begins the parse and establishes your processing procedure with the parser. Each
execution of your procedure causes the XML parser to continue analyzing the XML
document and report the next event, passing back to your procedure the fragment
This figure gives a high-level overview of the basic exchange of control between
the parser and your program:
Normally, parsing continues until the entire XML document has been parsed.
When the XML parser parses XML documents, it checks them for most aspects of
well formedness as defined in the XML specification. A document is well formed if
it adheres to the XML syntax and follows some additional rules such as proper use
of end tags and uniqueness of attribute names.
RELATED TASKS
“Accessing XML documents” on page 201
“Parsing XML documents” on page 201
“Writing procedures to process XML” on page 208
“Handling errors in XML documents” on page 215
“Understanding XML document encoding” on page 213
RELATED REFERENCE
XML specification (www.w3c.org/XML/)
“XML conformance” on page 606
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 The OPEN statement to open the file
v The READ statement to read all the records from the file into an alphanumeric or
national data item that is defined in the WORKING-STORAGE SECTION or
LOCAL-STORAGE SECTION of your program
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
RELATED TASKS
“Coding COBOL programs to run under CICS” on page 375
Chapter 22, “Developing COBOL programs for IMS” on page 391
In the XML PARSE statement you first identify the data item (XMLDOCUMENT in the
example) that contains the XML document character stream. In the DATA DIVISION,
you can declare the identifier as an alphanumeric data item or as a national data
item. If it is alphanumeric, its contents must be encoded with one of the supported
single-byte EBCDIC or ASCII character sets. If it is a national data item, its
contents must be encoded with Unicode UTF-16 CCSID 1200. Alphanumeric XML
documents that do not contain an encoding declaration are parsed with the code
page that you specify in the CODEPAGE compiler option.
Next you specify the name of the procedure (XMLEVENT-HANDLER in the example)
that is to handle the XML events from the document.
In addition, you can specify either or both of the following imperative statements
to receive control at the end of the parse:
v ON EXCEPTION, to receive control when an unhandled exception occurs
v NOT ON EXCEPTION, to receive control otherwise
You can end the XML PARSE statement with END-XML. Use this scope terminator to
nest your XML PARSE statement in a conditional statement or in another XML PARSE
statement.
RELATED TASKS
“Understanding XML document encoding” on page 213
RELATED REFERENCES
XML PARSE statement (Enterprise COBOL Language Reference)
Control flow (Enterprise COBOL Language Reference)
The events are shown in basically the order that they would occur for this sample
XML document. The text shown under “Sample XML text” comes from this
sample; exact text is shown between these delimiters: <<>>:
<?xml version=“1.0” encoding=“ibm-1140” standalone=“yes” ?>
<!--This document is just an example-->
<sandwich>
<bread type=“baker's best” />
<?spread please use real mayonnaise ?>
<meat>Ham & turkey</meat>
<filling>Cheese, lettuce, tomato, etc.</filling>
<![CDATA[We should add a <relish> element in future!]]>
</sandwich>junk
START-OF-DOCUMENT
Description
Occurs once, at the beginning of parsing the document. XML text
is the entire document, including any line-control characters, such
as LF (Line Feed) or NL (New Line).
Sample XML text
The text for this sample is 336 characters in length.
VERSION-INFORMATION
Description
Occurs within the optional XML declaration for the version
information. XML text contains the version value. An XML
declaration is XML text that specifies the version of XML being used
and the encoding of the document.
Sample XML text
<<1.0>>
STANDALONE-DECLARATION
Description
Occurs within the XML declaration for the optional standalone
declaration. XML text contains the standalone value.
Sample XML text
<<yes>>
DOCUMENT-TYPE-DECLARATION
Description
Occurs when the parser finds a document type declaration (DTD).
Document type declarations begin with the character sequence
’<!DOCTYPE’ and end with a ’>’ character, with some fairly
complicated grammar rules describing the content in between. (See
the XML specification for details.) For this event, XML text contains
the entire declaration, including the opening and closing character
sequences. This is the only event where XML text includes the
delimiters.
Sample XML text
The sample does not have a document type declaration.
COMMENT
Description
Occurs for any comments in the XML document. XML text contains
the data between the opening and closing comment delimiters,
’<!--’ and ’-->’, respectively.
Sample XML text
<<This document is just an example>>
START-OF-ELEMENT
Description
Occurs once for each element start tag or empty element tag. XML
text is set to the element name.
Sample XML text
In the order that they occur as START-OF-ELEMENT events:
1. <<sandwich>>
2. <<bread>>
3. <<meat>>
ATTRIBUTE-NAME
Description
Occurs for each attribute in an element start tag or empty element
tag, after recognizing a valid name. XML text contains the attribute
name.
Sample XML text
<<type>>
ATTRIBUTE-CHARACTERS
Description
Occurs for each fragment of an attribute value. XML text contains
the fragment. An attribute value normally consists of a single
string only, even if it is split across lines. The attribute value might
consist of multiple events, however.
Sample XML text
In the order that they occur as ATTRIBUTE-CHARACTERS events:
1. <<baker>>
2. <<s best>>
Notice that the value of the ’type’ attribute in the sample consists
of three fragments: the string ’baker’, the single character ’’’, and
the string ’s best’. The single character ’’’ fragment is passed
separately as an ATTRIBUTE-CHARACTER event.
ATTRIBUTE-CHARACTER
Description
Occurs in attribute values for the predefined entity references
’&’, ’'’, ’>’, ’<’, and ’"’. See the XML
specification for details of predefined entities.
Sample XML text
<<’>>
ATTRIBUTE-NATIONAL-CHARACTER
Description
Occurs in attribute values for numeric character references
(Unicode code points or “scalar values”) of the form ’&#dd..;’ or
’&#hh..;’, where ’d’ and ’h’ represent decimal and hexadecimal
digits, respectively. If the scalar value of the national character is
greater than 65,535 (NX’FFFF’), XML-NTEXT contains two encoding
units (a surrogate pair) and has a length of 4 bytes. This pair of
encoding units together represents a single character. Do not create
characters that are not valid by splitting this pair.
Sample XML text
The sample does not contain a numeric character reference.
PROCESSING-INSTRUCTION-TARGET
Description
Occurs when the parser recognizes the name following the
processing instruction (PI) opening character sequence, ’<?’. PIs
allow XML documents to contain special instructions for
applications.
Sample XML text
<<spread>>
PROCESSING-INSTRUCTION-DATA
Description
Occurs for the data following the PI target, up to but not including
the PI closing character sequence, ’?>’. XML text contains the PI
data, which includes trailing, but not leading white space
characters.
Sample XML text
<<please use real mayonnaise >>
CONTENT-CHARACTERS
Description
This event represents the principal part of an XML document: the
character data between element start and end tags. XML text
contains this data, which usually consists of a single string only,
even if it is split across lines. If the content of an element includes
any references or other elements, the complete content might
consist of several events. The parser also uses the
CONTENT-CHARACTERS event to pass the text of CDATA sections to
your program.
Sample XML text
In the order that they occur as CONTENT-CHARACTERS events:
1. <<Ham >>
2. << turkey>>
3. <<Cheese, lettuce, tomato, etc.>>
4. <<We should add a <relish> element in future!>>
Notice that the content of the ’meat’ element in the sample consists
of the string ’Ham ’, the character ’&’ and the string ’ turkey’. The
single character ’&’ fragment is passed separately as a
CONTENT-CHARACTER event. Also notice the trailing and leading
spaces, respectively, in these two string fragments.
CONTENT-NATIONAL-CHARACTER
Description
Occurs in element content for numeric character references
(Unicode code points or “scalar values”) of the form ’&#dd..;’ or
’&#hh..;’, where ’d’ and ’h’ represent decimal and hexadecimal
digits, respectively. If the scalar value of the national character is
greater than 65,535 (NX’FFFF’), XML-NTEXT contains two encoding
units (a surrogate pair) and has a length of 4 bytes. This pair of
encoding units together represents a single character. Do not create
characters that are not valid by splitting this pair.
Sample XML text
The sample does not contain a numeric character reference.
END-OF-ELEMENT
Description
Occurs once for each element end tag or empty element tag when
the parser recognizes the closing angle bracket of the tag. XML text
contains the element name.
Sample XML text
In the order that they occur as END-OF-ELEMENT events:
1. <<bread>>
2. <<meat>>
3. <<filling>>
4. <<sandwich>>
START-OF-CDATA-SECTION
Description
Occurs at the start of a CDATA section. CDATA sections begin with
the string ’<![CDATA[’ and end with the string ’]]>’. Such sections
are used to “escape” blocks of text containing characters that
would otherwise be recognized as XML markup. XML text always
contains the opening character sequence ’<![CDATA[’. The parser
passes the content of a CDATA section between these delimiters as
a single CONTENT-CHARACTERS event.
Sample XML text
<<<![CDATA[>>
UNKNOWN-REFERENCE-IN-ATTRIBUTE
Description
Occurs within attribute values for entity references other than the
five predefined entity references, as shown for
ATTRIBUTE-CHARACTER above.
Sample XML text
The sample does not have any unknown entity references.
UNKNOWN-REFERENCE-IN-CONTENT
Description
Occurs within element content for entity references other than the
predefined entity references, as shown for CONTENT-CHARACTER
above.
Sample XML text
The sample does not have any unknown entity references.
END-OF-DOCUMENT
Description
Occurs when document parsing has completed
Sample XML text
XML text is empty for the END-OF-DOCUMENT event.
EXCEPTION
Description
Occurs when an error in processing the XML document is detected.
For encoding conflict exceptions, which are signaled before parsing
begins, XML-TEXT is either zero-length or contains just the encoding
declaration value from the document.
Sample XML text
The part of the document that was parsed up to and including the
point where the exception (the superfluous ’junk’ after the
<sandwich> element end tag) was detected.
RELATED REFERENCE
XML-EVENT (Enterprise COBOL Language Reference)
4.6 Predefined entities (XML specification at www.w3.org/TR/REC-xml#sec-
predefined-ent)
2.8 Prolog and document type declaration (XML specification at
www.w3.org/TR/REC-xml#sec-prolog-dtd)
For each event that the parser encounters, it passes information to your processing
procedure in several special registers, as shown in the following table. Use these
registers to populate your data structures and to control your processing.
Special
register Contents Implicit definition and usage
XML-EVENT 1
The name of the XML event PICTURE X(30) USAGE DISPLAY
VALUE SPACE
XML-CODE An exception code or zero for each PICTURE S9(9) USAGE BINARY
XML event VALUE ZERO
XML-TEXT1 Text (corresponding to the event that Variable-length alphanumeric data
the parser encountered) from the XML item; 16-MB size limit
document if you specify an
alphanumeric data item for the XML
PARSE identifier
XML-NTEXT1 Text (corresponding to the event that Variable-length national data item;
the parser encountered) from the XML 16-MB size limit
document if you specify a national data
item for the XML PARSE identifier
When used in nested programs, these special registers are implicitly defined as
GLOBAL in the outermost program.
For all events except the EXCEPTION event, the value of the XML-CODE special register
is zero. If you set the XML-CODE special register to -1 before you return control to
the XML parser for an event other than EXCEPTION, processing stops with a
user-initiated exception indicated by the returned XML-CODE value of -1. The result
of changing the XML-CODE to any other nonzero value before returning from any
event is undefined.
For the EXCEPTION event, special register XML-CODE contains the exception code. The
following figure shows the flow of control between the parser and your processing
procedure and how XML-CODE is used to pass information between the two. The
off-page connectors, such as , connect the multiple charts in this chapter. In
particular, in the following figure connects to the chart Control flow for XML
exceptions (page 215), and connects from XML CCSID exception flow control
(page 218).
Control flow between XML parser and program, showing XML-CODE usage
When the parser sets XML-TEXT, XML-NTEXT is undefined (length of 0). When the
parser sets XML-NTEXT, XML-TEXT is undefined (length of 0).
To determine how many national characters XML-NTEXT contains, use the LENGTH
function. LENGTH OF XML-NTEXT contains the number of bytes, rather than
characters, used by XML-NTEXT.
For alphanumeric items, decide whether the XML data should go at the left
(default) end of your COBOL item, or at the right end. If it should go at the right
end, specify the JUSTIFIED RIGHT clause in the declaration of the COBOL item.
RELATED TASKS
“Using national data (Unicode) in COBOL” on page 105
RELATED REFERENCES
“XML exceptions that allow continuation” on page 599
“XML exceptions that do not allow continuation” on page 603
XML-CODE (Enterprise COBOL Language Reference)
XML-EVENT (Enterprise COBOL Language Reference)
XML-NTEXT (Enterprise COBOL Language Reference)
XML-TEXT (Enterprise COBOL Language Reference)
Data division.
Working-storage section.
******************************************************************
* XML document, encoded as initial values of data items. *
******************************************************************
1 xml-document.
2 pic x(39) value ’<?xml version=“1.0” encoding=“ibm-1140”’.
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(35) value ’ <bread type=“baker's best”/>’.
2 pic x(41) value ’ <?spread please use real mayonnaise ?>’.
2 pic x(31) value ’ <meat>Ham & turkey</meat>’.
2 pic x(40) value ’ <filling>Cheese, lettuce, tomato, etc.’.
2 pic x(10) value ’</filling>’.
2 pic x(35) value ’ <![CDATA[We should add a <relish>’.
2 pic x(22) value ’ element in future!]]>’.
2 pic x(31) value ’ <listprice>$4.99 </listprice>’.
2 pic x(27) value ’ <discount>0.10</discount>’.
2 pic x(11) value ’</sandwich>’.
1 xml-document-length computational pic 999.
******************************************************************
* Sample data definitions for processing numeric XML content. *
******************************************************************
1 current-element pic x(30).
1 xfr-ed pic x(9) justified.
1 xfr-ed-1 redefines xfr-ed pic 999999.99.
1 list-price computational pic 9v99 value 0.
1 discount computational pic 9v99 value 0.
1 display-price pic $$9.99.
Procedure division.
mainline section.
******************************************************************
* Process the transformed content and calculate promo price. *
******************************************************************
display ’ ’
display ’-----+++++***** Using information from XML ’
’*****+++++-----’
display ’ ’
move list-price to display-price
display ’ Sandwich list price: ’ display-price
compute display-price = list-price * (1 - discount)
display ’ Promotional price: ’ display-price
display ’ Get one today!’
goback.
Output from parse example: From the following output you can see which events
of the parse came from which fragments of the document:
Thus if the XML document begins with an XML declaration that includes an
encoding declaration specifying one of the supported code pages, the parser
honors the encoding declaration if it does not conflict with either the basic
document encoding or the encoding information from the XML PARSE statement.
If the XML document does not have an XML declaration, or if the XML declaration
omits the encoding declaration, the parser uses the encoding information from
your XML PARSE statement to process the document, as long as it does not conflict
with the basic document encoding.
The parser signals an XML exception event if it finds a conflict among these
sources.
RELATED REFERENCES
Coded character sets for XML documents (Enterprise COBOL Language Reference)
When the XML parser detects an error in an XML document, it generates an XML
exception event. The parser returns this exception event by passing control to your
processing procedure along with the following information:
v The special register XML-EVENT contains ’EXCEPTION’.
v The special register XML-CODE contains the numeric exception code.
v XML-TEXT contains the document text up to and including the point where the
exception was detected.
If the value of the error code is within one of the following ranges:
v 1-99
v 100,001-165,535
v 200,001-265,535
you might be able to handle the exception in your processing procedure and
continue the parse. If the error code has any other nonzero value, the parse cannot
continue. The exceptions for encoding conflicts (50-99 and 300-499) are signaled
before the parse of the document is started. For these exceptions, XML-TEXT is either
zero length or contains just the encoding declaration value from the document.
Exceptions in the range 1-49 are fatal errors according to the XML specification,
therefore the parser does not continue normal parsing even if you handle the
exception. However the parser does continue scanning for further errors until it
reaches the end of the document or encounters an error that does not allow
continuation. For these exceptions, the parser does not signal any further normal
events, except for the END-OF-DOCUMENT event.
Use the following figure to understand the flow of control between the parser and
your processing procedure. It illustrates how you can handle certain exceptions
and how you use XML-CODE to identify the exception. The off-page connectors, such
as ,connect the multiple charts in this chapter. In particular, in the following
figure connects to the chart XML CCSID exception flow control (page 218). Within
this figure / serves both as an off-page and an on-page connector.
Handling exceptions
To handle the exception event in your processing procedure, do these steps:
1. Use the contents of XML-CODE to guide your actions.
2. Set XML-CODE to zero to indicate that you have handled the exception.
3. Return control to the parser. The exception condition then no longer exists.
You can handle exceptions in this way only if the exception code passed in
XML-CODE is within one of the following ranges:
v 1-99
v 100,001-165,535
v 200,001-265,535
Otherwise, the parser signals no further events, and passes control to the statement
that you specify on your ON EXCEPTION phrase. In this case, XML-CODE contains the
original exception number, even if you set XML-CODE to zero in your processing
procedure before returning control to the parser.
If you return control to the parser with XML-CODE set to a nonzero value different
from the original exception code, the results are undefined.
In this case, the parser does not signal any further events, although an exception
condition exists. Therefore control returns to your ON EXCEPTION phrase, if you
have specified it. There you can test if XML-CODE is -1, which indicates that you
terminated the parse deliberately. If you do not specify an ON EXCEPTION phrase,
control returns to the end of the XML PARSE statement.
You can also terminate parsing after any exception XML event by returning to the
parser without changing XML-CODE. The result is similar to the result of deliberate
termination, except that the parser returns to the XML PARSE statement with
XML-CODE containing the exception number.
In this case you can determine the CCSID of the document by subtracting 100,000
or 200,000 from the value of XML-CODE (depending on whether it is an EBCDIC
CCSID or ASCII CCSID, respectively). For instance, if XML-CODE contains 101,140,
the CCSID of the document is 1140.
The CCSID for your XML PARSE statement depends on the type of the XML PARSE
identifier. If the identifier is a national data item, the CCSID is 1200, indicating
Unicode. If the XML PARSE identifier is alphanumeric, the CCSID is that specified by
the CODEPAGE compiler option value.
The following figure illustrates these actions. The off-page connectors, such as ,
connect the multiple charts in this chapter. In particular, in the following figure
connects to Control flow between XML parser and program, showing XML-CODE
usage (page 208) and connects from Control flow for XML exceptions (page
215).
Your error-handling code can take actions such as handling the situation, issuing a
message, or halting the program. In any event, coding a warning message is a
good idea.
You might create error-detection routines for data-entry errors or for errors as your
installation defines them.
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 Technique handling for 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 222
“Handling errors in arithmetic operations” on page 223
“Handling errors in input and output operations” on page 223
“Handling errors when calling programs” on page 233
“Writing routines for handling errors” on page 233
Requesting dumps
You can obtain a formatted dump of the run-time environment by calling the
Language Environment service CEE3DMP. To obtain a system dump, you can
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
Language Environment Debugging Guide
CEE3DMP—generate dump (Language Environment Programming Reference)
These are the data values before and after the statement is performed:
Because String-ptr has a value of zero that falls short of the receiving field, an
overflow condition occurs and the STRING operation is not completed. (The same
result would occur if String-ptr were greater than nine.) If ON OVERFLOW had not
been specified, you would not be notified that the contents of Item-4 remain
unchanged.
For ON SIZE ERROR to work correctly for fixed-point overflow and decimal
overflow, you must specify the TRAP(ON) run-time 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
v Zero raised to a negative number
v Negative number raised to a fractional power
You can use any of the following techniques for intercepting and handling certain
input or output errors:
v End-of-file condition (AT END)
v ERROR declarative
v File status key
For VSAM files, if you specify a FILE STATUS clause, you can also test the VSAM
return code to direct your program to error-handling logic.
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 figures show the flow of logic after the indicated errors:
v VSAM input or output error
v QSAM and line-sequential input or output error
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 227
“Using file status keys” on page 228
“Handling errors in QSAM files” on page 133
“Using VSAM return codes (VSAM files only)” on page 229
“Coding INVALID KEY phrases” on page 231
RELATED REFERENCES
Status key (Common processing facilities) (Enterprise COBOL Language Reference)
Any NOT AT END phrase you code 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 performing any associated
declarative procedure.
You might choose to code neither an AT END phrase nor an EXCEPTION declarative
procedure, but a status key clause for the file. In that case, control passes to the
next sequential instruction after the input or output statement that detected the
end-of-file conditions. Here presumably you have some code to take appropriate
action.
RELATED REFERENCES
AT END phrases (Enterprise COBOL Language Reference)
Place each such procedure in the declaratives section of your PROCEDURE DIVISION.
In your procedure, you can choose to try corrective action, retry the operation,
continue, or end execution. You can use the ERROR declaratives procedure in
combination with the file status key if you want a further analysis of the error.
If you continue processing a blocked file, you might lose the remaining records in
a block after the record that caused the error.
Write an ERROR declarative procedure if you want the system to return control to
your program after an error occurs. If you do not write an ERROR declarative
procedure, your job could be canceled or abnormally terminated after an error
occurs.
When this program is running on two threads, the following sequence of events
might 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)
The variable data-name-1 specifies the two-character COBOL file status key that
should be defined in the WORKING-STORAGE SECTION. This data-name cannot be
variably located.
Your program can check the COBOL file status key to discover whether an error
has been made and, if so, what type of error it is. For example, suppose a FILE
STATUS clause is coded like this:
FILE STATUS IS FS-CODE
For VSAM files, in addition to the file status key, you can code a second identifier
in the FILE STATUS clause to get more detailed information about VSAM input or
output requests.
You can use the status key alone, or in conjunction with the INVALID KEY option, or
to supplement the EXCEPTION or ERROR declarative. Using the status key in this way
gives you precise information about the results of each input or output operation.
RELATED REFERENCES
Status key (Common processing facilities) (Enterprise COBOL Language Reference)
The variable data-name-1 specifies the two-character COBOL file status key. The
variable data-name-8 specifies a 6-byte data item that contains the VSAM return
code when the COBOL file status key is not 0.
RELATED REFERENCES
VSAM macro return and reason codes (z/OS DFSMS Macro Instructions for Data
Sets)
This example also illustrates how output from this program might look if the file
being processed contains six records.
IDENTIFICATION DIVISION
PROGRAM-ID. EXAMPLE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT VSAMFILE ASSIGN TO VSAMFILE
ORGANIZATION IS INDEXED
ACCESS DYNAMIC
RECORD KEY IS VSAMFILE-KEY
FILE STATUS IS FS-CODE VSAM-CODE.
DATA DIVISION.
FILE SECTION.
FD VSAMFILE
RECORD 30.
01 VSAMFILE-REC.
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
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 INVALID KEY on WRITE requests for QSAM files, but the
INVALID KEY phrase has limited meaning here. It is used only if you try to write to
a disk that is full.
If you code INVALID KEY in a statement that causes an INVALID KEY condition,
control is transferred to the INVALID KEY imperative statement. Here, any ERROR
declaratives you have coded are not performed.
The FILE-CONTROL entry for the master file of customer records includes statements
defining indexed organization, random access, MASTER-CUSTOMER-NUMBER as the
prime record key, and CUSTOMER-FILE-STATUS as the file status key. The following
example shows how you can use FILE STATUS with the INVALID KEY to more
specifically determine why an input or output statement failed.
.
. (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
DISPLAY “MASTER CUSTOMER RECORD NOT FOUND”
DISPLAY “FILE STATUS CODE IS: ” CUSTOMER-FILE-STATUS
MOVE “FALSE” TO TRANSACTION-MATCH
END-READ
Use the ON EXCEPTION phrase to perform a series of statements and to perform your
own error handling. For example:
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. If
an error occurs while the called program is running, the ON EXCEPTION phrase will
not be performed.
RELATED TASKS
Enterprise COBOL Compiler and Run-Time Migration Guide
RELATED TASKS
“Using procedure and function pointers” on page 420
| 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
desired 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 249
Chapter 16, “Compiling under UNIX” on page 269
“Starting the compiler from an assembler program” on page 251
“Defining compiler input and output” on page 252
“Specifying compiler options under z/OS” on page 258
“Compiling multiple programs (batch compilation)” on page 261
“Correcting errors in your source program” on page 265
RELATED REFERENCES
“Compiler-directing statements” on page 332
“Data sets used by the compiler under z/OS” on page 253
“Compiler options and compiler output under z/OS” on page 259
The simplest way to compile your program under z/OS is to code JCL that uses a
cataloged procedure. A cataloged procedure is a set of job control statements placed
in a partitioned data set called the procedure library (SYS1.PROCLIB).
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 248
“Specifying compiler options under z/OS” on page 258
“Specifying compiler options in a batch compilation” on page 262
“Compiling programs to create DLLs” on page 438
RELATED REFERENCES
“Data sets used by the compiler under z/OS” on page 253
The following JCL calls the IBM-supplied cataloged procedure (IGYWC) for
compiling an Enterprise COBOL program and defining the required data sets:
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 desired options.
RELATED TASKS
Language Environment Programming Guide
RELATED REFERENCES
“Compile procedure (IGYWC)”
“Compile and link-edit procedure (IGYWCL)” on page 240
“Compile, link-edit, and run procedure (IGYWCLG)” on page 241
“Compile, load, and run procedure (IGYWCG)” on page 242
“Compile, prelink, and link-edit procedure (IGYWCPL)” on page 243
“Compile, prelink, link-edit, and run procedure (IGYWCPLG)” on page 245
“Prelink and link-edit procedure (IGYWPL)” on page 246
“Compile, prelink, load, and run procedure (IGYWCPG)” on page 247
z/OS DFSMS: Program Management
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
Example: JCL for compiling using HFS: The following job uses procedure
IGYWC to compile a COBOL program demo.cbl that is located in the hierarchical
file system (HFS). It writes the generated compiler listing demo.lst, object file
demo.o, and SYSADATA file demo.adt to the HFS.
//HFSDEMO 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 for an HFS file.
(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 binary.
You can use a mixture of HFS (PATH=’hfs-directory-path’) and MVS data sets
(DSN=traditional-data-set-name) on 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
UNIX System Services Command Reference
MVS JCL Reference
“Data sets used by the compiler under z/OS” on page 253
You must supply the following DD statement, indicating the location of the source
program, in the input stream.
//COBOL.SYSIN DD * (or appropriate parameters)
The COBOL job step produces an object module that is input to the linkage editor
or binder. Other object modules can be added. If the COBOL program refers to any
data sets, DD statements that define these data sets must also be supplied.
You must supply the following DD statement, indicating the location of the source
program, in the input stream.
//COBOL.SYSIN DD * (or appropriate parameters)
The following shows the statements that make up the IGYWCLG cataloged
procedure.
//IGYWCLG PROC LNGPRFX=’IGY.V3R2M0’,SYSLBLK=3200,
// LIBPRFX=’CEE’,GOPGM=GO
//*
//* COMPILE, LINK EDIT AND RUN A COBOL PROGRAM
//*
//* PARAMETER DEFAULT VALUE USAGE
//* LNGPRFX IGY.V3R2M0 PREFIX FOR LANGUAGE DATA SET NAMES
//* SYSLBLK 3200 BLKSIZE FOR OBJECT DATA SET
//* LIBPRFX CEE PREFIX FOR LIBRARY DATA SET NAMES
//* GOPGM GO MEMBER NAME FOR LOAD MODULE
//*
//* CALLER MUST SUPPLY //COBOL.SYSIN DD . . .
//*
//COBOL EXEC PGM=IGYCRCTL,REGION=2048K
//STEPLIB DD DSNAME=&LNGPRFX..SIGYCOMP, (1)
// DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSLIN DD DSNAME=&&LOADSET,UNIT=SYSDA,
// DISP=(MOD,PASS),SPACE=(TRK,(3,3)),
// DCB=(BLKSIZE=&SYSLBLK)
//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT2 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT3 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT4 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT5 DD UNIT=SYSDA,SPACE=(CYL,(1,1)) (2)
//SYSUT6 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT7 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//LKED EXEC PGM=HEWL,COND=(8,LT,COBOL),REGION=1024K
//SYSLIB DD DSNAME=&LIBPRFX..SCEELKED, (3)
// DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSLIN DD DSNAME=&&LOADSET,DISP=(OLD,DELETE)
// DD DDNAME=SYSIN
//SYSLMOD DD DSNAME=&&GOSET(&GOPGM),SPACE=(TRK,(10,10,1)),
// UNIT=SYSDA,DISP=(MOD,PASS)
//SYSUT1 DD UNIT=SYSDA,SPACE=(TRK,(10,10))
//GO EXEC PGM=*.LKED.SYSLMOD,COND=((8,LT,COBOL),(4,LT,LKED)),
// REGION=2048K
//STEPLIB DD DSNAME=&LIBPRFX..SCEERUN, (1)
// DISP=SHR
//SYSPRINT DD SYSOUT=*
//CEEDUMP DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
You must supply the following DD statement, indicating the location of the source
program, in the input stream.
| 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
The following shows the statements that make up the IGYWCG cataloged
procedure.
//IGYWCG PROC LNGPRFX=’IGY.V3R2M0’,SYSLBLK=3200,
// LIBPRFX=’CEE’
//*
//* COMPILE, LOAD AND RUN A COBOL PROGRAM
//*
//* PARAMETER DEFAULT VALUE USAGE
//* LNGPRFX IGY.V3R2M0 PREFIX FOR LANGUAGE DATA SET NAMES
//* SYSLBLK 3200 BLKSIZE FOR OBJECT DATA SET
//* LIBPRFX CEE PREFIX FOR LIBRARY DATA SET NAMES
//*
//* CALLER MUST SUPPLY //COBOL.SYSIN DD . . .
//*
//COBOL EXEC PGM=IGYCRCTL,REGION=2048K
//STEPLIB DD DSNAME=&LNGPRFX..SIGYCOMP, (1)
// DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSLIN DD DSNAME=&&LOADSET,UNIT=SYSDA, (2)
// DISP=(MOD,PASS),SPACE=(TRK,(3,3)),
// DCB=(BLKSIZE=&SYSLBLK)
//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT2 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT3 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT4 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT5 DD UNIT=SYSDA,SPACE=(CYL,(1,1)) (3)
//SYSUT6 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT7 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//GO EXEC PGM=LOADER,COND=(8,LT,COBOL),REGION=2048K
//SYSLIB DD DSNAME=&LIBPRFX..SCEELKED, (4)
// DISP=SHR
//SYSLOUT DD SYSOUT=*
//SYSLIN DD DSNAME=&&LOADSET,DISP=(OLD,DELETE)
//STEPLIB DD DSNAME=&LIBPRFX..SCEERUN, (1)
// DISP=SHR
//SYSPRINT DD SYSOUT=*
//CEEDUMP DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
You must supply the following DD statement, indicating the location of the source
program, in the input stream.
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:
The following shows the statements that make up the IGYWCPL cataloged
procedure.
//IGYWCPL PROC LNGPRFX=’IGY.V3R2M0’,SYSLBLK=3200,
// LIBPRFX=’CEE’,PLANG=EDCPMSGE,
// PGMLIB=’&&GOSET’,GOPGM=GO
//*
//* COMPILE, PRELINK AND LINK EDIT A COBOL PROGRAM
//*
//* PARAMETER DEFAULT VALUE USAGE
//* LNGPRFX IGY.V3R2M0 PREFIX FOR LANGUAGE DATA SET NAMES
//* SYSLBLK 3200 BLOCK SIZE FOR OBJECT DATA SET
//* LIBPRFX CEE PREFIX FOR LIBRARY DATA SET NAMES
//* PLANG EDCPMSGE PRELINKER MESSAGES MODULE
//* PGMLIB &&GOSET DATA SET NAME FOR LOAD MODULE
//* GOPGM GO MEMBER NAME FOR LOAD MODULE
//*
//* CALLER MUST SUPPLY //COBOL.SYSIN DD . . .
//*
//COBOL EXEC PGM=IGYCRCTL,REGION=2048K
//STEPLIB DD DSNAME=&LNGPRFX..SIGYCOMP, (1)
// DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSLIN DD DSNAME=&&LOADSET,UNIT=SYSDA,
// DISP=(MOD,PASS),SPACE=(TRK,(3,3)),
// DCB=(BLKSIZE=&SYSLBLK)
//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT2 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT3 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT4 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT5 DD UNIT=SYSDA,SPACE=(CYL,(1,1)) (2)
//SYSUT6 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT7 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//PLKED EXEC PGM=EDCPRLK,PARM=’’,COND=(8,LT,COBOL),
// REGION=2048K
//STEPLIB DD DSNAME=&LIBPRFX..SCEERUN,
// DISP=SHR
//SYSMSGS DD DSNAME=&LIBPRFX..SCEEMSGP(&PLANG),
// DISP=SHR
//SYSLIB DD DUMMY
//SYSIN DD DSN=&&LOADSET,DISP=(OLD,DELETE)
//SYSMOD DD DSNAME=&&PLKSET,UNIT=SYSDA,DISP=(NEW,PASS),
// SPACE=(32000,(100,50)),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=3200)
//SYSDEFSD DD DUMMY
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//*
//LKED EXEC PGM=HEWL,COND=(8,LT,COBOL),REGION=1024K
//SYSLIB DD DSNAME=&LIBPRFX..SCEELKED, (3)
// DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSLIN DD DSNAME=&&PLKSET,DISP=(OLD,DELETE)
// DD DDNAME=SYSIN
//SYSLMOD DD DSNAME=&PGMLIB(&GOPGM),
// SPACE=(TRK,(10,10,1)),
// UNIT=SYSDA,DISP=(MOD,PASS)
//SYSUT1 DD UNIT=SYSDA,SPACE=(TRK,(10,10))
You must supply the following DD statement, indicating the location of the source
program, in the input stream.
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
The following shows the statements that make up the IGYWCPLG cataloged
procedure.
//IGYWCPLG PROC LNGPRFX=’IGY.V3R2M0’,SYSLBLK=3200,
// PLANG=EDCPMSGE,
// LIBPRFX=’CEE’,GOPGM=GO
//*
//* COMPILE, PRELINK, LINK EDIT, AND RUN A COBOL PROGRAM
//*
//* PARAMETER DEFAULT VALUE USAGE
//* LNGPRFX IGY.V3R2M0 PREFIX FOR LANGUAGE DATA SET NAMES
//* SYSLBLK 3200 BLKSIZE FOR OBJECT DATA SET
//* PLANG EDCPMSGE PRELINKER MESSAGES MODULE
//* LIBPRFX CEE PREFIX FOR LIBRARY DATA SET NAMES
//* GOPGM GO MEMBER NAME FOR LOAD MODULE
//*
//* CALLER MUST SUPPLY //COBOL.SYSIN DD . . .
//*
//COBOL EXEC PGM=IGYCRCTL,REGION=2048K
//STEPLIB DD DSNAME=&LNGPRFX..SIGYCOMP, (1)
// DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSLIN DD DSNAME=&&LOADSET,UNIT=SYSDA,
// DISP=(MOD,PASS),SPACE=(TRK,(3,3)),
// DCB=(BLKSIZE=&SYSLBLK)
//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT2 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT3 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT4 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT5 DD UNIT=SYSDA,SPACE=(CYL,(1,1)) (2)
//SYSUT6 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT7 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//PLKED EXEC PGM=EDCPRLK,PARM=’’,COND=(8,LT,COBOL),
// REGION=2048K
//STEPLIB DD DSNAME=&LIBPRFX..SCEERUN,
// DISP=SHR
//SYSMSGS DD DSNAME=&LIBPRFX..SCEEMSGP(&PLANG),
// DISP=SHR
//SYSLIB DD DUMMY
//SYSIN DD DSN=&&LOADSET,DISP=(OLD,DELETE)
//SYSMOD DD DSNAME=&&PLKSET,UNIT=SYSDA,DISP=(NEW,PASS),
// SPACE=(32000,(100,50)),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=3200)
//SYSDEFSD DD DUMMY
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//*
//LKED EXEC PGM=HEWL,COND=(8,LT,COBOL),REGION=1024K
//SYSLIB DD DSNAME=&LIBPRFX..SCEELKED, (3)
// DISP=SHR
//SYSPRINT DD SYSOUT=*
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
You can use a mixture of HFS (PATH=’hfs-directory-path’) and MVS data sets
(DSN=traditional-data-set-name) on the compilation DD statements for the following
data sets:
v Sources files
v Object files
v Listings
v ADATA files
v Debug files
However, the compiler utility files (DD statements SYSUTx) and COPY libraries (DD
statement SYSLIB) must be MVS data sets.
RELATED REFERENCES
MVS JCL Reference
You can allocate data sets in any order. However, you must allocate all needed
data sets before you start to compile.
2. Use the CALL command at the READY prompt to request compilation:
CALL ’IGY.V3R2M0.SIGYCOMP(IGYCRCTL)’
You can specify the ALLOCATE and CALL commands on the TSO command line, or, if
you are not using HFS files, include them in a CLIST.
You can allocate HFS files for all the compiler data sets except the SYSUTx utility
data sets and the SYSLIB libraries. Your ALLOCATE statements have the following
form:
Allocate File(SYSIN) Path(’/u/myu/myap/std/prog2.cbl’)
Pathopts(ORDONLY) Filedata(TEXT)
Format
symbol {LINK|ATTACH} EP=IGYCRCTL,
PARAM=(optionlist[,ddnamelist]),VL=1
VL Specifies that the sign bit is to be set to 1 in the last fullword of the
address parameter list.
When the Enterprise COBOL compiler completes processing, it puts a return code
in register 15.
RELATED TASKS
“Defining the source code data set (SYSIN)” on page 255
“Specifying source libraries (SYSLIB)” on page 255
“Defining the output data set (SYSPRINT)” on page 256
RELATED REFERENCES
“Data sets used by the compiler under z/OS”
Allowable
Device device Reside
Type ddname Function Required? requirements classes in HFS?
Input SYSIN1 Reads source Yes Card reader; Any Yes
program intermediate
storage
SYSLIB or Reads user source If program has COPY or BASIS Direct access SYSDA No
other copy libraries (PDSs) statements (LIB is required)
libraries1
Utility SYSUT1, Work data set used Yes Direct access SYSDA No
SYSUT2, by compiler during
SYSUT3, compilation
SYSUT4,
SYSUT62
SYSUT52 Work data set used If program has COPY, Direct access SYSDA No
by compiler during REPLACE, or BASIS statements
compilation (LIB is required)
SYSUT72 Work data set used Yes Direct access SYSDA No
by compiler to create
listing
1. You can use the EXIT option to provide user exits from these data sets.
2. These data sets must be single volume.
RELATED REFERENCES
“Logical record length and block size”
“EXIT” on page 301
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:
v SYSDEBUG: You can specify any LRECL in the listed range, with 1024
recommended.
v SYSPRINT, SYSDEBUG: 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 will determine the block size.
For variable-length records (RECFM=V), LRECL is the logical record length, and
BLKSIZE equals LRECL plus 4.
You can place your source code or BASIS statement directly in the input stream. If
you do, use this SYSIN DD statement:
//SYSIN DD *
When you use the DD * convention, the source code or BASIS statement must
follow the statement. If another job step follows the compilation, the EXEC
statement for that step follows the /* statement or the last source statement.
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. The listing includes the results of the default or
requested options of the PARM parameter (that is, diagnostic messages, the object
code listing).
Specify the following for the data set that you define:
v The name of a sequential data set, the name of a PDS or PDSE member, or an
HFS path.
v A data set LRECL of 133.
v A data set RECFM of F or B.
v A block size, using the BLKSIZE subparameter of the DCB parameter, or let the
system set the system-determined default block size.
You can define SYSTERM in various ways, including as a SYSOUT data set, a data
set on disk, a file in the HFS, 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 linkage editor or binder
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
linkage editor or binder job step.
Your installation might use the DECK option and the SYSPUNCH DD statement.
//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.
The file defined in the SYSADATA DD statement will be a sequential file containing
specific record types that have information about the program collected during
compilation. The file can be a traditional MVS data set or an HFS file.
RELATED REFERENCES
“ADATA” on page 290
RELATED TASKS
“Compiling OO applications using JCL or TSO/E” on page 281
Specify the following for the data set that you define:
v The name of a sequential data set, the name of a PDS or PDSE member, or an
HFS path.
v A data set LRECL greater than or equal to 80 and less than or equal to 1024. The
default LRECL for SYSDEBUG is 1024.
v A data set RECFM of F or FB.
v A block size, using the BLKSIZE subparameter of the DCB parameter, or let the
system set the system-determined default block size.
| The data set name that you provide on SYSDEBUG is used by Language Environment
| dump services. You cannot change the name of the data set at run time. If you
| want to have a name for this data set that follows the naming conventions for your
| production data sets, use that name when you compile your program. You can
| direct Debug Tool to a renamed data set.
RELATED REFERENCES
“TEST” on page 322
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, LIB, OUTDD, SIZE, and SQL 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
This order of precedence also determines which options are in effect when
conflicting or mutually exclusive options are specified.
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 want one, specify NOXREF.
Some options have subparameters. For example, if you want 44 lines per page on
your listings, specify LINECOUNT(44).
RELATED TASKS
“Specifying compiler options with the PROCESS (CBL) statement”
“Specifying compiler options in a batch compilation” on page 262
RELATED REFERENCES
“Compiler options and compiler output under z/OS” on page 259
“Conflicting compiler options” on page 289
Chapter 18, “Compiler options” on page 287
You can start PROCESS in columns 1 through 66. A sequence field is allowed in
columns 1 through 6. When used with a sequence field, PROCESS can start in
columns 8 through 66. If used, the sequence field must contain six characters, and
the first character must be numeric.
You can use CBL as a synonym for PROCESS. CBL can start in columns 1 through 70.
When used with a sequence field, CBL can start in columns 8 through 70.
Use one or more blanks to separate PROCESS from the first option in options-list.
Separate options with a comma or a blank. Do not insert spaces between
individual options and their suboptions.
You can use more than one PROCESS statement. If multiple PROCESS statements are
used, they must follow one another with no intervening statement of any other
type. You cannot continue options across multiple PROCESS statements.
Your programming organization can inhibit the use of PROCESS statements with the
default options module of the COBOL compiler. When PROCESS statements are
found in a COBOL program where not allowed by the organization, the COBOL
compiler generates error diagnostics.
READY
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 as well as included in the SYSPRINT data set.
Associated data file records will be in the data set defined by SYSADATA. The
database request module (DBRM) will be the data set defined in DBRMLIB. The
debug information side file will be the data set defined in SYSDEBUG.
Save the listings you produced during compilation. You can use them during the
testing of your work if you need to debug or tune.
After compilation, your next step will be to fix any errors that the compiler found
in your program.
If no errors are detected, you can go to the next step in the process: link-editing, or
binding, your program. (If you used compiler options to suppress object code
generation, you must recompile to obtain object code.)
RELATED REFERENCES
“Messages and listings for compiler-detected errors” on page 266
Chapter 18, “Compiler options” on page 287
RELATED TASKS
Preparing to link-edit and run under Language Environment (Language
Environment Programming Guide)
When you compile several programs as part of a batch job, you need to:
v Determine whether you want to create one or more load modules.
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.
To create separate load modules, precede each set of modules with the NAME option.
When the compiler encounters a NAME compiler option, the first program in the
sequence and all subsequent programs are link-edited into a single load module,
until the next NAME compiler option is encountered. Then, each successive program
that is compiled with the NAME option is included in a separate load module.
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 262
RELATED REFERENCES
“NAME” on page 308
RELATED REFERENCES
IBM-supplied cataloged procedures (Language Environment Programming Guide)
You should be aware of the effect of certain compiler options on the precedence of
compiler option settings for each program in the sequence:
1. Installation defaults that are fixed at your site
If any program in the sequence requires the BUF, LIB, OUTDD, SIZE, or SQL 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 you specify the LIB option for the batch, you cannot change the NUMBER and
SEQUENCE options during the batch compilation. The compiler treats all programs in
the batch as a single input file during NUMBER and SEQUENCE processing under the
LIB option; therefore, the sequence numbers of the entire input file must be in
ascending order.
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.
INVOCATION PARAMETERS:
NOTERM
PROCESS(CBL) statements:
CBL CURRENCY,FLAG(I,I)
Options in effect: All options are installation defaults unless otherwise noted:
NOADATA
ADV
QUOTE
NOAWO
BUFSIZE(4096)
CURRENCY Process option PROGRAM 1
.
.
FLAG(I,I) Process option PROGRAM 1
.
.
NOTERM INVOCATION option
.
.
End of compilation for program 1
.
.
PP 5655-G53 IBM Enterprise COBOL for z/OS and OS/390 3.2.0 Date 08/21/2002. . .
PROCESS(CBL) statements:
CBL APOST
Options in effect:
NOADATA
ADV
Source Language in
effect
------------------------------------------------------------------------
CBL LANG(JP),FLAG(I,I),APOST,SIZE(MAX) |EN| Installation default -- EN
IDENTIFICATION DIVISION. |JP| Invocation -- XX
PROGRAM-ID. COMPILE1. |: |
. . . |: |
END PROGRAM COMPILE1. |: |
CBL LANGUAGE(YY) |EN| CBL resets language
CBL SIZE(2048K),LANGUAGE(JP),LANG(!!) |: | to EN. LANGUAGE(YY)
IDENTIFICATION DIVISION. |JP| is ignored because it
PROGRAM-ID. COMPILE2. |: | is superseded by (JP).
. . . |: | (!!) is not alpha-
END PROGRAM COMPILE2. |: | numeric and is
IDENTIFICATION DIVISION. |: | discarded.
PROGRAM-ID. COMPILE3. |: |
. . . |: |
END PROGRAM COMPILE3. |: |
CBL LANGUAGE(JP),LANGUAGE(YY) |EN| CBL resets language
. . . |: | to EN. LANGUAGE(YY)
. . . |: | supersedes (JP) but
. . . |: | is nonexistent.
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).
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, which is
YY. Because YY is nonexistent, the language in effect remains English.
Although you should try to correct errors, it is not necessary to fix all of them. A
warning-level or informational-level message can be left in a program without
much risk, and you might decide that the recoding and compilation needed to
remove the error are not worth the effort. Severe-level and error-level errors,
however, indicate probable program failure and should be corrected.
After correcting the errors in your source program, recompile the program. If this
second compilation is successful, go on 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 error messages”
RELATED REFERENCES
“Messages and listings for compiler-detected errors” on page 266
Wherever possible, the message provides specific instructions for correcting the
error.
The messages for errors found during processing of compiler options, CBL and
PROCESS statements, or BASIS, COPY, and REPLACE statements are displayed near the
top of your listing.
The messages for compilation errors found in your program (ordered by line
number) are displayed near the end of the listing for each program.
A summary of all errors found during compilation is displayed near the bottom of
your listing.
RELATED TASKS
“Correcting errors in your source program” on page 265
“Generating a list of compiler error messages” on page 265
RELATED REFERENCES
“Format of compiler error messages”
“Severity codes for compiler error messages” on page 267
“FLAG” on page 302
Tip: If you used the FLAG option to suppress messages, there might be additional
errors in your program.
RELATED REFERENCES
“Severity codes for compiler error messages”
“FLAG” on page 302
As part of the compilation step, you need to define the files needed for the
compilation and specify any compiler options necessary for your program and for
the output that you want.
The main job of the compiler is to translate 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.
RELATED TASKS
“Setting environment variables under UNIX”
“Specifying compiler options under UNIX” on page 270
“Compiling and linking with the cob2 command” on page 271
“Compiling using scripts” on page 275
“Compiling, linking, and running OO applications under UNIX” on page 277
RELATED REFERENCES
“Data sets used by the compiler under z/OS” on page 253
“Compiler options and compiler output under z/OS” on page 259
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 significant to the UNIX shell. For
example:
export COBOPT=“TRUNC(OPT) XREF”
RELATED TASKS
“Specifying compiler options under UNIX”
“Compiling and linking with the cob2 command” on page 271
“Setting and accessing environment variables” on page 398
RELATED REFERENCES
“Compiler-directing statements” on page 332
Chapter 18, “Compiler options” on page 287
COPY statement (Enterprise COBOL Language Reference)
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
RELATED TASKS
“Specifying compiler options with the PROCESS (CBL) statement” on page 258
“Setting environment variables under UNIX” on page 269
“Compiling and linking with the cob2 command”
RELATED REFERENCES
“Conflicting compiler options” on page 289
Chapter 18, “Compiler options” on page 287
To compile multiple files (batch compilation), specify multiple source file names.
When you compile COBOL programs for 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 the compiler PDS that you want to use in the STEPLIB environment
variable. For example:
export STEPLIB=IGY.V3R2M0.SIGYCOMP
The cob2 command implicitly uses the UNIX shell command c89 for the link step.
c89 is the shell interface to the linker (the DFSMS program management binder).
Only files with the .cbl extension are passed to the compiler; cob2 passes all other
files to the linker.
Listing output that you request from the compilation of a COBOL source program
file.cbl is written to file.lst. Listing output that you request from the linker is
written to stdout.
When you specify cob2 -bdll, the link step produces a DLL definition side file.
This file contains IMPORT control statements for each of the names exported by the
DLL. The name of the DLL definition side file is based on the output file name. If
the output name has an extension, that extension 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 files later when you create a module that calls the
DLL, specify the side files with any other object files (file.o) that you specify for the
linking. For example:
cob2 -o myappl -qdll myappl.cbl mydll.x
RELATED TASKS
“Compiling programs to create DLLs” on page 438
“Preparing OO applications under UNIX” on page 278
Language Environment Programming Guide
UNIX System Services User’s Guide
RELATED REFERENCES
“cob2” on page 273
“cob2 input and output files” on page 274
“Data sets used by the compiler under z/OS” on page 253
“Compiler options and compiler output under z/OS” on page 259
UNIX System Services Command Reference
This command creates alpha.o and beta.o, then links alpha.o, beta.o, and the
COBOL libraries. If the link step is successful, it produces an executable program
named gamma.
v To compile alpha.cbl with the LIST and NODATA options, enter:
cob2 -qlist,noadata alpha.cbl
One special value for xxx is dll, which specifies that the executable
module is to be a DLL. It 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
module. If you do not specify -e, the default entry point is the first
program (file.cbl) or object file (file.o) that you specify as a file name on the
cob2 command invocation.
-g Prepares the program for debugging. Equivalent to specifying the TEST
option with no suboptions.
-Ixxx Adds a path xxx to the directories to be searched for copybooks for which
you do not specify a library-name.
To specify multiple paths, either use multiple -I options, or use a colon to
separate multiple path names within a single -I option value.
For COPY statements where you have not coded an explicit library-name,
the compiler searches for copybooks in this order:
1. In the current directory
2. In the paths you specify with the -I cob2 option
3. In the paths you specify in the SYSLIB environment variable
RELATED TASKS
“Compiling and linking with the cob2 command” on page 271
“Setting environment variables under UNIX” on page 269
When you use the cob2 command, the following files are created in the current
directory:
RELATED TASKS
“Compiling and linking with the cob2 command” on page 271
RELATED REFERENCES
“ADATA” on page 290
“TEST” on page 322
UNIX System Services Command Reference
RELATED TASKS
“Compiling, linking, and running OO applications under UNIX”
“Compiling, linking, and running OO applications using JCL or TSO/E” on
page 281
RELATED TASKS
“Compiling OO applications under UNIX”
“Preparing OO applications under UNIX” on page 278
“Running OO applications under UNIX” on page 279
| 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 options: RENT,
DLL, THREAD, and DBCS. (The RENT and DBCS compiler 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 JNI.cpy file using a COPY
statement, specify the include subdirectory of the cobol directory (typically
/usr/lpp/cobol/include) in the search order for copybooks. You can do this by
using the -I option of the cob2 command or by setting the SYSLIB environment
variable.
RELATED REFERENCES
“cob2” on page 273
“DBCS” on page 298
“DLL” on page 299
“RENT” on page 316
“THREAD” on page 325
| 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 the IBM Developer Kit for OS/390, Java 2
Technology Edition.
v igzcjava.x, which is provided in the lib subdirectory of the cobol directory in
the HFS. The typical complete path name 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).
To prepare a COBOL class definition for execution, process the following files:
| 1. Link the object file using the two DLL side files discussed above to create an
executable DLL module.
You must name the resulting DLL module libClassname.so, where Classname is
the external class-name. If the class is part of a package and thus there are
periods in the external class-name, you must change the periods to underscores
in the DLL module name. For example, if class Account is part of the com.acme
package, the external class-name (as defined in the REPOSITORY paragraph entry
for the class) must be com.acme.Account, and the DLL module for the class
must be libcom_acme_Account.so.
2. Compile the generated Java source with the Java compiler to create a class file
(.class).
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:
All files from these commands are generated in the current working directory.
RELATED TASKS
Chapter 16, “Compiling under UNIX” on page 269
“REPOSITORY paragraph for defining a class” on page 464
RELATED REFERENCES
“cob2” on page 273
| 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.
| To customize the initialization of the JVM, specify options on the java command as
| in the following examples:
| 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
| See the output from the java -h command or the related references for details
| about the options that the JVM supports.
| Running J2EE COBOL clients: You can use OO syntax in a COBOL program to
| implement a Java 2 Platform, Enterprise Edition (J2EE) client. You can, for
| example, invoke methods on enterprise beans that run in the WebSphere for z/OS
| or OS/390 environment.
RELATED TASKS
Chapter 23, “Running COBOL programs under UNIX” on page 397
“Setting and accessing environment variables” on page 398
Chapter 28, “Writing object-oriented programs” on page 459
“Structuring OO applications” on page 498
RELATED REFERENCES
JVM options (New IBM Technology featuring Persistent Reusable Java Virtual Machines)
Java Naming and Directory Interface (JNDI) (WebSphere for z/OS: Assembling J2EE
Applications)
| For example, you might follow this approach for applications that consist of a
| COBOL main program and subprograms that:
| v Access objects that are all implemented in Java
| v Access enterprise beans that run in a WebSphere server
RELATED TASKS
“Compiling OO applications using JCL or TSO/E”
“Preparing and running OO applications using JCL or TSO/E” on page 282
“Compiling, linking, and running OO applications under UNIX” on page 277
| If the COBOL program or class definition uses the JNI environment structure to
| access JNI callable services, copy the file JNI.cpy from the HFS 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 program.
| 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, 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 HFS. For example:
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 UNIX shell
| command prompt, or by using the BPXBATCH utility.
RELATED TASKS
“Compiling with JCL” on page 237
“Compiling under TSO” on page 249
“Specifying source libraries (SYSLIB)” on page 255
“Defining the output Java data set (SYSJAVA)” on page 257
“Accessing JNI services” on page 501
“Compiling OO applications under UNIX” on page 277
“Preparing OO applications under UNIX” on page 278
RELATED REFERENCES
“DBCS” on page 298
“DLL” on page 299
“RENT” on page 316
“THREAD” on page 325
Appendix F, “JNI.cpy” on page 625
The BPXBATCH utility (UNIX System Services User’s Guide)
| To customize the initialization of the JVM that will be used by the application,
| you can set the COBJVMINITOPTIONS environment variable in the same file.
| For example, to access enterprise beans that run in a WebSphere server, you
| must set the Java system property java.naming.factory.initial. For details, see the
| related task on running OO applications under UNIX.
| 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 run-time option.
| v Specify the POSIX(ON) run-time option.
| v Use DD statements to specify files in the HFS 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 UNIX” on page 278
“Running OO applications under UNIX” on page 279
“Structuring OO applications” on page 498
The BPXBATCH utility (UNIX System Services User’s Guide)
Program library definition and search order (Language Environment Programming
Guide)
RELATED REFERENCES
_CEE_ENVFILE (C/C++ Programming Guide)
ENVAR (Language Environment Programming Reference)
| HelloJ.java is compiled with the javac command. The resulting .class file resides in
| the HFS directory u/userid/ootest/tsthello, which is specified in the CLASSPATH
| environment variable in the environment variable settings file.
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.
Aspect of your
program Compiler option Default Abbreviations
Source language “ARITH” on page 291 ARITH(COMPAT) AR(C), AR(E)
“QUOTE/APOST” on page 316 QUOTE Q|APOST
“CICS” on page 293 NOCICS None
“CURRENCY” on page 295 NOCURRENCY CURR|NOCURR
“CODEPAGE” on page 294 CODEPAGE(01140) CP(ccsid)
“DBCS” on page 298 DBCS None
“LIB” on page 306 LIB None
“NSYMBOL” on page 309 NSYMBOL(NATIONAL) NS(DBCS|NAT)
“NUMBER” on page 309 NONUMBER NUM|NONUM
“SEQUENCE” on page 318 SEQUENCE SEQ|NOSEQ
“SQL” on page 320 NOSQL None
“WORD” on page 329 NOWORD WD|NOWD
Date processing “DATEPROC” on page 297 NODATEPROC, or DP|NODP
DATEPROC(FLAG,NOTRIG) if only
DATEPROC is specified
“INTDATE” on page 304 INTDATE(ANSI) None
“YEARWINDOW” on page 331 YEARWINDOW(1900) YW
Maps and listings “LANGUAGE” on page 305 LANGUAGE(ENGLISH) LANG(EN|UE|JA|JP)
“LINECOUNT” on page 306 LINECOUNT(60) LC
“LIST” on page 306 NOLIST None
“MAP” on page 307 NOMAP None
“OFFSET” on page 312 NOOFFSET OFF|NOOFF
“SOURCE” on page 319 SOURCE S|NOS
“SPACE” on page 319 SPACE(1) None
“TERMINAL” on page 321 NOTERMINAL TERM|NOTERM
“VBREF” on page 329 NOVBREF None
“XREF” on page 330 XREF X|NOX
Installation defaults: The default options that were set up when your compiler
was installed are in effect for your program unless you override them with other
options. (In some installations, certain compiler options are set up as fixed so that
you cannot override them. If you have problems, see your system administrator.)
To find out the default compiler options in effect, run a test compilation without
specifying any options. The output listing lists the default options specified by
your installation.
RELATED REFERENCES
“Conflicting compiler options”
“Compiler-directing statements” on page 332
“Option settings for COBOL 85 Standard conformance”
RELATED TASKS
Chapter 15, “Compiling under z/OS” on page 237
“Compiling under TSO” on page 249
Chapter 16, “Compiling under UNIX” on page 269
Chapter 32, “Tuning your program” on page 553
RELATED REFERENCES
Language Environment Programming Reference
RELATED TASKS
“Specifying compiler options under z/OS” on page 258
“Specifying compiler options in a batch compilation” on page 262
“Specifying compiler options under UNIX” on page 270
ADATA
Use ADATA when you want the compiler to create a SYSADATA file, which contains
records of additional compilation information. It is required for remote compile
using IBM VisualAge COBOL. On z/OS, this file is written to ddname SYSADATA.
The size of this file generally grows with the size of the associated program.
You cannot specify ADATA in a PROCESS (CBL) statement; it can be specified only in
one of the following ways:
v On invocation of the compiler using an option list
RELATED REFERENCES
Appendix G, “COBOL SYSADATA file contents” on page 631
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.
Use NOADV if you have already adjusted your record length to include 1 byte for the
printer control character.
ARITH
RELATED CONCEPTS
Appendix A, “Intermediate results and arithmetic precision” on page 577
AWO
With AWO specified, an implicit APPLY WRITE-ONLY clause is activated for all files in
the program that are eligible for this clause. To be eligible, a file must have
physical sequential organization and blocked variable-length records.
RELATED TASKS
“Optimizing buffer and device space” on page 12
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.
If you use both BUFSIZE and SIZE, the amount allocated to buffers is included in
the amount of main storage available for compilation via the SIZE option.
BUFSIZE cannot exceed the track capacity for the device used, nor can it exceed the
maximum allowed by data management services.
The CICS compiler option enables the integrated CICS translator capability and
allows specification of CICS options. You must specify the CICS option if your
COBOL source program contains EXEC CICS or EXEC DLI statements, and it has not
been processed by the separate CICS translator.
Use the CICS option to compile CICS programs only. Programs compiled with the
CICS option will not run in a non-CICS environment.
Note that the compiler needs access to CICS Transaction Server Version 2 or later.
If you specify the NOCICS option, any CICS statements found in the source program
are diagnosed and discarded.
You can partition a long suboption string into multiple suboption strings on
multiple CBL statements. The CICS suboptions are concatenated in the order of
their appearance. For example:
//STEP1 EXEC IGYWC, . . .
// PARM.COBOL=’CICS(“string1”)’
//COBOL.SYSIN DD *
CBL CICS(’string2’)
CBL CICS(“string3”)
IDENTIFICATION DIVISION.
PROGRAM-ID. DRIVER1.
. . .
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 option are found, the last specification of each option
prevails. The compiler limits the length of the concatenated CICS suboptions string
to 4 KB.
RELATED CONCEPTS
“Integrated CICS translator” on page 380
RELATED TASKS
“Compiling with the CICS option” on page 378
RELATED REFERENCES
“Conflicting compiler options” on page 289
The CODEPAGE option specifies the code page used for encoding:
v The contents of alphanumeric and DBCS data items at run time
v Alphanumeric, national, and DBCS literals in the COBOL source program
The CODEPAGE option also specifies the default code page for parsing alphanumeric
XML documents.
ccsid must be an integer representing a valid coded character set identifier (CCSID)
| number for an EBCDIC code page.
The default CCSID 1140 is an equivalent of CCSID 37 (EBCDIC Latin-1, USA) but
includes the Euro symbol.
Important: The conversion image that was configured as part of the Unicode
Conversion Services installation must include support for conversions of the
specified CCSID to and from CCSID 1200. For applications that use object-oriented
syntax, conversions from the specified CCSID to CCSID 1208 must also be
included.
RELATED TASKS
Customizing Unicode support for COBOL (Enterprise COBOL Customization Guide)
COMPILE
Use the COMPILE option only if you want to force full compilation even in the
presence of serious errors. All diagnostics and object code will be generated. Do
not try to run the object code if the compilation resulted in serious errors: the
results could be unpredictable or an abnormal termination could occur.
Use NOCOMPILE without any suboption to request a syntax check (only diagnostics
produced, no object code).
RELATED REFERENCES
“Messages and listings for compiler-detected errors” on page 266
CURRENCY
The default currency symbol is the dollar sign ($). You can use the CURRENCY option
to provide an alternate default currency symbol to be used for the COBOL
program.
To change the default currency symbol, use the CURRENCY(literal) option where
literal is a valid COBOL alphanumeric literal (including a hex literal) representing a
single character that must not be any of the following:
v Digits zero (0) through nine (9)
v Uppercase alphabetic characters A B C D E G N P R S V X Z, or their lowercase
equivalents
v The space
v Special characters * + - / , . ; ( ) “ = ’
v A figurative constant
v A null-terminated literal
v A DBCS literal
v A national literal
If your program processes only one currency type, you can use the CURRENCY
option as an alternative to the CURRENCY SIGN clause for selecting 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.
Delimiter note: You can delimit the CURRENCY option literal by either the quote or
the apostrophe, regardless of the QUOTE|APOST compiler option setting.
DATA
Affects the location of storage for dynamic data areas and other dynamic run-time
storage: either above (DATA(31)) or below (DATA(24)) the 16-MB line. For reentrant
programs, the DATA(24|31) compiler option and the HEAP run-time option control
whether storage for dynamic data areas (such as WORKING-STORAGE and FD record
areas) is obtained from below the 16-MB line or from unrestricted storage. (The
DATA option does not affect the location of LOCAL-STORAGE data; the STACK run-time
option controls that location instead, along with the AMODE of the program. It does
affect the location of local WORKING-STORAGE data.)
When you specify the run-time option HEAP(,,BELOW), the DATA(24|31) compiler
option has no effect; the storage for all dynamic data areas is allocated from below
the 16-MB line. However, with HEAP(,,ANYWHERE) as the run-time option, storage
for dynamic data areas is allocated from below the line if you compiled the
program with the DATA(24) compiler option or from unrestricted storage if you
compiled with the DATA(31) compiler option.
Specify the DATA(24) compiler option for programs running in 31-bit addressing
mode that are passing data arguments to programs in 24-bit addressing mode. This
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 run-time options that affect storage and its addressability. See the
related information for details.
RELATED CONCEPTS
“Storage and its addressability” on page 33
RELATED TASKS
Using run-time options (Language Environment Programming Guide)
RELATED REFERENCES
“Allocation of buffers for QSAM files” on page 140
Use the DATEPROC option to enable the millennium language extensions of the
COBOL compiler.
DATEPROC(FLAG)
With DATEPROC(FLAG), the millennium language extensions are enabled, and
the compiler produces a diagnostic message wherever a language element
uses or is affected by the extensions. The message is usually an
information-level or warning-level message that identifies statements that
involve date-sensitive processing. Additional messages that identify errors
or possible inconsistencies in the date constructs might be generated.
Production of diagnostic messages, and their appearance in or after the
source listing, is subject to the setting of the FLAG compiler option.
DATEPROC(NOFLAG)
With DATEPROC(NOFLAG), the millennium language extensions are in effect,
but the compiler does not produce any related messages unless there are
errors or inconsistencies in the COBOL source.
DATEPROC(TRIG)
With DATEPROC(TRIG), the millennium language extensions are enabled, and
the automatic windowing that the compiler applies to operations on
windowed date fields is sensitive to specific trigger or limit values in the
date fields and in other nondate fields that are stored into or compared
with the windowed date fields. These special values represent invalid dates
that can be tested for or used as upper or lower limits.
Performance: The DATEPROC(TRIG) option results in slower-performing code
for windowed date comparisons.
DATEPROC(NOTRIG)
With DATEPROC(NOTRIG), the millennium language extensions are enabled,
and the automatic windowing that the compiler applies to operations on
windowed dates does not recognize any special trigger values in the
operands. Only the value of the year part of dates is relevant to automatic
windowing.
Performance: The DATEPROC(NOTRIG) option is a performance option that
assumes valid date values in windowed date fields.
NODATEPROC
NODATEPROC indicates that the extensions are not enabled for this
compilation unit. This affects date-related program constructs as follows:
v The DATE FORMAT clause is syntax-checked, but has no effect on the
execution of the program.
Usage note: You can specify the FLAG|NOFLAG and TRIG|NOTRIG suboptions in any
order. If you omit either suboption, it defaults to the current setting.
RELATED REFERENCES
“FLAG” on page 302
DBCS
Using DBCS causes the compiler to recognize X’0E’ (SO) and X’0F’ (SI) as shift codes
for the double-byte portion of an alphanumeric literal.
With DBCS selected, the double-byte portion of the literal is syntax-checked and the
literal remains category alphanumeric.
RELATED REFERENCES
“Conflicting compiler options” on page 289
DECK
Use DECK to produce object code in the form of 80-column card images. If you use
the DECK option, be certain that SYSPUNCH is defined in your JCL for compilation.
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 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 for COMP-5 receivers, nor for binary receivers when you
specify the TRUNC(BIN) option.
RELATED CONCEPTS
“Formats for numeric data” on page 40
“Reference modifiers” on page 93
RELATED REFERENCES
“TRUNC” on page 326
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.
Specification of the DLL option requires that the RENT linkage-editor or binder
option also be used.
NODLL instructs the compiler to generate an object module that is not enabled for
DLL usage.
RELATED REFERENCES
“Conflicting compiler options” on page 289
Not for general use: The DUMP option should be used only at the request of an IBM
representative.
Use DUMP to produce a system dump at compile time for an internal compiler error.
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 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 is not a compiler error. Using the NODUMP option will allow the
compiler to issue message IGYOP3124-W and continue processing.
RELATED TASKS
Understanding abend codes (Language Environment Debugging Guide)
RELATED REFERENCES
“Conflicting compiler options” on page 289
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. CALL identifier statements always result in a run-time load of the target
program and are not impacted by this option. The DYNAM compiler option must not
be used by programs that are translated by the CICS translator.
If your COBOL program calls programs that have been linked as dynamic link
libraries (DLLs), then you must not use the DYNAM option. You must instead
compile the program with the NODYNAM and DLL options.
RELATED REFERENCES
“Making both static and dynamic calls” on page 414
“Conflicting compiler options” on page 289
EXIT
For information about the EXIT compiler option, see the first reference below.
RELATED REFERENCES
Appendix E, “EXIT compiler option” on page 611
“Conflicting compiler options” on page 289
EXPORTALL
With these symbols exported from the DLL, the exported program and entry-point
names can be called from programs in the root load module or in other DLL load
modules in the application, as well as from programs that are linked into the same
DLL.
Specification of the EXPORTALL option requires that the RENT linker option also be
used.
RELATED REFERENCES
“Conflicting compiler options” on page 289
FASTSRT
FASTSRT allows IBM DFSORT, or its equivalent, to perform the input and output
instead of COBOL.
RELATED TASKS
“Improving sort performance with FASTSRT” on page 191
FLAG
Error messages in the source listing are set off by embedding the statement
number in an arrow that points to the message code. The message code is then
followed by the message text. For example:
Use NOFLAG to suppress error flagging. NOFLAG will not suppress error messages for
compiler options.
Embedded messages:
v Specifying embedded level-U messages is accepted, but will not produce any
messages in the source. Embedding a level-U message is not recommended.
v The FLAG option does not affect diagnostic messages produced before the
compiler options are processed.
v Diagnostic messages produced during processing of compiler options, CBL and
PROCESS statements, or BASIS, COPY, and REPLACE statements are never embedded
in the source listing. All such messages appear at the beginning of the compiler
output.
v Messages produced during processing of the *CONTROL (*CBL) statement are not
embedded in the source listing.
RELATED REFERENCES
“Messages and listings for compiler-detected errors” on page 266
FLAGSTD
Use FLAGSTD to get informational messages about the COBOL 85 Standard elements
included in your program. You can specify any of the following items for flagging:
v A selected Federal Information Processing Standard (FIPS) COBOL subset
v Any of the optional modules
v Obsolete language elements
v Any combination of subset and optional modules
v Any combination of subset and obsolete elements
v IBM extensions (these are flagged any time FLAGSTD is specified, and identified
as “nonconforming nonstandard”)
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, as well as the message code and text. At
the bottom is a summary of the total of the flagged items and their type.
3 1 1 1
RELATED REFERENCES
“Conflicting compiler options” on page 289
INTDATE
With INTDATE(LILIAN), the date intrinsic functions return results compatible with
the Language Environment date callable services.
Usage note: When INTDATE(LILIAN) is in effect, CEECBLDY is not usable since you
have no way to turn an ANSI integer into a meaningful date using either intrinsic
functions or callable services. If you code a CALL literal statement with CEECBLDY
as the target of the call with INTDATE(LILIAN) in effect, the compiler diagnoses this
and converts the call target to CEEDAYS.
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).
name specifies the language for compiler output messages. Possible values for the
LANGUAGE option are shown in the table.
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 run-time option allows you to control the national language
to be used for the run-time environment, including error messages, month names,
LIB
If your program uses COPY, BASIS, or REPLACE statements, the LIB compiler option
must be in effect. In addition, for COPY and BASIS statements, you need to define
the library or libraries from which the compiler can take the copied code. Define
the libraries with DD statements, ALLOCATE commands, or environment variables, as
appropriate for your environment. When using JCL, also include a DD statement to
allocate SYSUT5.
RELATED REFERENCES
“Compiler-directing statements” on page 332
“Conflicting compiler options” on page 289
LINECOUNT
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.
LIST
If you want to limit the assembler listing output, use *CONTROL LIST or NOLIST
statements in your PROCEDURE DIVISION. Your source statements following a
*CONTROL NOLIST are not included in the listing until a *CONTROL LIST statement
switches the output back to normal LIST format.
RELATED TASKS
“Getting listings” on page 347
RELATED REFERENCES
“Conflicting compiler options” on page 289
*CONTROL (*CBL) statement (Enterprise COBOL Language Reference)
MAP
Use the MAP compiler option to produce a listing of the items you defined in the
DATA DIVISION. The output includes the following:
v DATA DIVISION map
v Global tables
v Literal pools
v Nested program structure map, and program attributes
v Size of the program’s working storage and its location in the object code if the
program is compiled with the NORENT option
If you want to limit the MAP output, use *CONTROL MAP or NOMAP statements in the
DATA DIVISION. Source statements following a *CONTROL NOMAP are not included in
the listing until a *CONTROL MAP statement switches the output back to normal MAP
format. For example:
By selecting the MAP option, you can also print an embedded MAP report in the
source code listing. The condensed MAP information is printed to the right of
data-name definitions in the FILE SECTION, WORKING-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 summary is printed first.
RELATED CONCEPTS
Chapter 19, “Debugging” on page 337
RELATED TASKS
“Getting listings” on page 347
RELATED REFERENCES
*CONTROL (*CBL) statement (Enterprise COBOL Language Reference)
NAME
Use NAME to generate a link-edit NAME card for each object module. You can also use
NAME to generate names for each load module when doing batch compilations.
When NAME is specified, a NAME card is appended to each object module that is
created. Load module names are formed using the rules for forming module names
from PROGRAM-ID statements.
The NAME or NAME(ALIAS) options cannot be used when compiling programs that
will be prelinked with the Language Environment prelinker.
RELATED REFERENCES
PROGRAM-ID paragraph (Enterprise COBOL Language Reference)
The NSYMBOL option controls the interpretation of the N symbol used in literals and
PICTURE clauses, indicating whether national or DBCS processing is assumed.
With NSYMBOL(NATIONAL):
v Data items defined with the PICTURE clause consisting only of the symbol N
without the USAGE clause are treated as if the USAGE NATIONAL clause were
specified.
v Literals of the form N“. . .” or N’. . .’ are treated as national literals.
With NSYMBOL(DBCS):
v Data items defined with the PICTURE clause consisting only of the symbol N
without the USAGE clause are treated as if the USAGE DISPLAY-1 clause were
specified.
v Literals of the form N“. . .” or N’. . .’ are treated as DBCS literals.
The NSYMBOL(DBCS) option provides compatibility with the previous releases of IBM
COBOL, and the NSYMBOL(NATIONAL) option makes the handling of the above
language elements consistent with the draft 200x COBOL standard in this regard.
RELATED REFERENCES
“Conflicting compiler options” on page 289
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.
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
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 LIB and NUMBER are 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 you want the compiler to perform invalid sign processing.
This option is not as efficient as NUMPROC(PFD); object code size will be increased,
and there could be an increase in run-time overhead to validate all signed data.
External decimal, unsigned: High-order 4 bits of the sign byte contain X’F’.
External decimal, signed overpunch: High-order 4 bits of the sign byte contain
X’C’ if the number is positive or 0, and X’D’ if it is not.
External decimal, separate sign: Separate sign contains the character ’+’ if the
number is positive or 0, and ’-’ if it is not.
Internal decimal, unsigned: Low-order 4 bits of the low-order byte contain X’F’.
Internal decimal, signed: Low-order 4 bits of the low-order byte contain X’C’ if the
number is positive or 0, and X’D’ if it is not.
Sign representation is affected not only by the NUMPROC option, but also by the
installation-time option NUMCLS.
RELATED TASKS
“Checking for incompatible data (numeric class test)” on page 46
RELATED REFERENCES
“Sign representation and processing” on page 45
OBJECT
Use OBJECT to place the generated object code on disk or tape to be later used as
input for the linkage editor or binder.
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 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 289
Use OFFSET to produce a condensed PROCEDURE DIVISION listing. 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 following are produced:
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 289
OPTIMIZE
Use OPTIMIZE to reduce the run time of your object program; optimization might
also reduce the amount of storage your object program uses. Because OPTIMIZE
increases compile time and can change the order of statements in your program,
you should not use it when debugging.
The OPTIMIZE option is turned off in the case of a severe-level error or higher.
RELATED CONCEPTS
“Optimization” on page 560
RELATED REFERENCES
“Conflicting compiler options” on page 289
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. Note that you can specify a file in
the hierarchical file system (HFS) with the ddname named in OUTDD. See the
discussion of the DISPLAY statement for defaults and for behavior when this
ddname is not allocated.
The MSGFILE run-time option allows you to specify the ddname of the file to which
all run-time diagnostics and reports generated by the RPTOPTS and RPTSTG run-time
options are written. The IBM-supplied default is MSGFILE(SYSOUT). If the OUTDD
compiler option and the MSGFILE run-time 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 TASKS
“Displaying values on a screen or in a file (DISPLAY)” on page 30
RELATED REFERENCES
MSGFILE (Language Environment Programming Reference)
The PGMNAME option controls the handling of names used in the following contexts:
v Program-names defined in the PROGRAM-ID paragraph
v Program entry point names on the ENTRY statement
v Program-name references in:
– Calls to nested programs
– Static calls to separately compiled programs
– Static SET procedure-pointer TO ENTRY literal statement
– Static SET function-pointer TO ENTRY literal statement
– CANCEL of a nested program
PGMNAME(COMPAT)
With PGMNAME(COMPAT), program-names are handled in a manner compatible with
older versions of COBOL compilers, namely:
v The program-name can be up to 30 characters in length.
v All the characters used in the name must be alphabetic, digits, or the hyphen,
except that if the program-name is entered in the literal format and is in the
outermost program, then the literal can also contain the extension characters @,
#, and $.
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, or the hyphen.
Nested-program names 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.
The literal used for a program-name (in any of the contexts listed above as affected
by the PGMNAME option) can contain any character in the range X’41’-X’FE’.
Usage notes
v The following are not affected by the PGMNAME option:
– Class-names and method-names.
– System-names (assignment-names in SELECT . . . ASSIGN, and text-names or
library-names on COPY statements).
– Dynamic calls. Dynamic calls are resolved with the target program-name
truncated to eight characters, folded to uppercase, and translation of
embedded hyphens or a leading digit.
– CANCEL of nonnested programs. Name resolution uses the same mechanism as
for a dynamic call.
v The PGMNAME option does affect nested-program calls and static calls to programs
that are linked together with the caller.
v Dynamic calls are not permitted to COBOL programs compiled with the
PGMNAME(LONGMIXED) or PGMNAME(LONGUPPER) options unless the program-name is
less than or equal to 8 bytes and all uppercase. In addition, the name of the
program must be identical to the name of the module that contains it.
v When using the extended character set supported by PGMNAME(LONGMIXED), be
sure to use names that conform to the linkage-editor, binder, prelinker, or system
conventions that apply, depending on the mechanism used to resolve the names.
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 apostrophe (’) characters.
RENT
DATA and RMODE settings: The RENT option interacts with other compiler options that
affect storage and its addressability. When a reentrant program is to be run with
extended addressing, you can use the DATA(24|31) option to control whether
dynamic data areas are allocated in unrestricted storage or in storage obtained
from below 16 MB. Compile programs with RENT or RMODE(ANY) if they will be run
with extended addressing in virtual storage addresses above 16 MB.
RENT also affects the RMODE (residency mode) of your generated object program. All
Enterprise COBOL programs are AMODE ANY.
DATA: The setting of the DATA option does not affect programs compiled with
NORENT.
CICS: You must use RENT for programs to be run under CICS.
UNIX: You must use RENT for programs to be run in the UNIX environment.
Link-edit considerations: If all programs in a load module are compiled with RENT,
it is recommended that the load module be link-edited with the RENT linkage-editor
or binder option. (Use the REUS linkage-editor or binder option instead if the load
module will also contain any non-COBOL programs that are serially reusable.)
If any program in a load module is compiled with NORENT, the load module must
not be link-edited with the RENT or REUS link-edit attributes. The NOREUS
linkage-editor or binder 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 33
RELATED TASKS
Using reentrant code (IBM DB2 Application Programming and SQL Guide)
RELATED REFERENCES
“Conflicting compiler options” on page 289
RMODE
The RMODE option setting influences the the RMODE (residency mode) of your
generated object program.
A program compiled with the RMODE(AUTO) option will have RMODE 24 if NORENT is
| specified, and 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 will have RMODE ANY whether
NORENT or RENT is specified.
DATA and RENT: The RMODE option interacts with other compiler options and
run-time options that affect storage and its addressability. See the related concepts
for information about passing data between programs with different modes.
RELATED CONCEPTS
“Storage and its addressability” on page 33
SEQUENCE
When you use SEQUENCE, the compiler examines columns 1 through 6 of your
source statements to check that the 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 sequence (source statements with
blanks in columns 1 through 6 do not participate in this sequence check and do
not result in messages).
If you use COPY statements and SEQUENCE is in effect, be sure that your source
program 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 LIB and SEQUENCE are 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.
SIZE
Abbreviations are: SZ
MAX requests the largest available block of storage in the user region for use during
compilation.
Use SIZE to indicate the amount of main storage available for compilation.
SOURCE
Use SOURCE to get a listing of your source program. This listing will include any
statements embedded by PROCESS or COPY statements.
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. Your source statements following a
*CONTROL NOSOURCE are not included in the listing at all, unless a *CONTROL SOURCE
statement switches the output back to normal SOURCE format.
RELATED REFERENCES
*CONTROL (*CBL) statement (Enterprise COBOL Language Reference)
SPACE
Use SPACE to select single-, double-, or triple-spacing in your source code listing.
SPACE has meaning only when the SOURCE compiler option is in effect.
RELATED REFERENCES
“SOURCE”
Use the SQL compiler option to enable the DB2 coprocessor capability and to
specify DB2 suboptions. You must specify the SQL option if your COBOL source
program contains SQL statements and it has not been processed by the DB2
precompiler.
When you use the SQL option, the compiler writes the database request module
(DBRM) to ddname DBRMLIB. Note that the compiler needs access to DB2 Version
7 or later.
If you specify the NOSQL option, any SQL statements found in the source program
are diagnosed and discarded.
You can partition a long suboption string into multiple suboption strings on
multiple CBL statements. The DB2 suboptions are concatenated in the order of their
appearance. For example:
//STEP1 EXEC IGYWC, . . .
// PARM.COBOL=’SQL(“string1”)’
//COBOL.SYSIN DD *
CBL SQL(“string2”)
| CBL SQL(’string3’)
IDENTIFICATION DIVISION.
PROGRAM-ID. DRIVER1.
. . .
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 suboptions string
to 4 KB.
RELATED TASKS
“Compiling with the SQL option” on page 387
RELATED REFERENCES
“Conflicting compiler options” on page 289
Use SSRANGE to generate code that checks if subscripts (including ALL subscripts) or
indexes try to reference an area outside the region of the table. Each subscript or
index is not individually checked for validity; rather, the effective address is
checked to ensure that it does not cause a reference outside the region of the table.
Variable-length items will also be checked to ensure that the reference is within
their maximum defined length.
Remember: You will get range checking only if you compile your program with
the SSRANGE option and run it with the CHECK(ON) run-time option.
RELATED CONCEPTS
“Reference modifiers” on page 93
TERMINAL
Use TERMINAL to send progress and diagnostic messages to the SYSTERM data set.
Use TEST to produce object code that enables Debug Tool to perform batch and
interactive debugging. The amount of debugging support available depends on
which TEST suboptions you use. The TEST option also allows you to request that
symbolic variables be included in the formatted dump produced by Language
Environment.
Use NOTEST if you do not want to generate object code with debugging information
and do not want the formatted dump to include symbolic variables.
TEST has three suboptions. You can specify any combination of suboptions (one,
two, or all), but you can specify SEPARATE only when SYM is in effect.
When you invoke the COBOL compiler from JCL or from TSO and you specify
TEST(. . .,SYM,SEPARATE), the symbolic debug information tables are written to
the data set that is specified in the SYSDEBUG DD statement. The SYSDEBUG DD
statement must specify the name of a sequential data set, the name of a PDS or
PDSE member, or an HFS path. The data set LRECL must be greater than or equal
to 80, and less than or equal to 1024. The default LRECL for SYSDEBUG is 1024. The
data set RECFM can be F or FB. You can set the block size by using the BLKSIZE
subparameter of the DCB parameter, or leave it to the system to set the
system-determined default block size.
When you invoke the COBOL compiler from the UNIX shell and you specify
TEST(. . .,SYM,SEPARATE), the symbolic debug information tables are written to
file.dbg in the current directory, where file is the name of the COBOL source file.
Language Environment: The TEST option can improve your formatted dumps from
Language Environment in two ways:
| v Use the TEST option (with any suboptions) to have line numbers in the dump
| that indicate the failing statement, rather than just an offset.
v Use the SYM suboption of TEST to have the values of the program variables listed
in the dump.
With NOTEST, the dump will not have program variables and will not have a line
number for the failing statement.
| SEPARATE suboption and Language Environment: For programs that are compiled
| with the SEPARATE suboption of TEST, Language Environment gets the data set
| name for the separate file (which is stored in DD SYSDEBUG by the compiler) from
| the object program. You cannot change the name of the data set at run time. Use
| the same data set name for SYSDEBUG at compile time that you want Language
| Environment to use at run time.
RELATED CONCEPTS
Considerations for setting TERMTHDACT options (Language Environment
Debugging Guide)
RELATED TASKS
“Defining the debug data set (SYSDEBUG)” on page 257
RELATED REFERENCES
“Conflicting compiler options” on page 289
“OPTIMIZE” on page 312
TEST | NOTEST (Language Environment Programming Reference)
THREAD
A program that has been compiled with the THREAD option can also be used in a
nonthreaded application. However, when a COBOL program will be executed in a
threaded application, all the COBOL programs in the Language Environment
enclave must be compiled with the THREAD option.
NOTHREAD indicates that the COBOL program is not to be enabled for execution in
an enclave with multiple POSIX threads or PL/I tasks.
Programs compiled with compilers earlier than Enterprise COBOL are treated as
compiled with NOTHREAD.
When the THREAD option is in effect, the following language 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 RERUN
v STOP literal statement
v Segmentation module
v USE FOR DEBUGGING statement
v INITIAL phrase in PROGRAM-ID clause
v Nested programs
v SORT or MERGE statements
Performance: With the THREAD option, you can anticipate some run-time
performance degradation due to the overhead of serialization logic that is
automatically generated.
RELATED TASKS
Chapter 27, “Preparing COBOL programs for multithreading” on page 449
RELATED REFERENCES
“Conflicting compiler options” on page 289
TRUNC
TRUNC has no effect on COMP-5 data items; COMP-5 items are handled as if
TRUNC(BIN) were in effect regardless of the TRUNC suboption specified.
TRUNC(STD)
Use TRUNC(STD) to control the way arithmetic fields are truncated during
MOVE and arithmetic operations. 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:
v Use the TRUNC(OPT) option only if you are sure that the data being
moved into the binary areas will not have a value with larger precision
than that defined by the PICTURE clause for the binary item. Otherwise,
unpredictable results could occur. This truncation is performed in the
most efficient manner possible; therefore, the results will be dependent
| You can avoid the performance overhead of using TRUNC(BIN) for all binary
| data in a program by using COMP-5 for individual binary data items passed
to non-COBOL programs or other products and subsystems. The use of
COMP-5 is not affected by the TRUNC suboption in effect.
Large literals in VALUE clauses: When you use the compiler option
TRUNC(BIN), numeric literals specified in VALUE clauses for binary data
items (COMP, COMP-4, or BINARY) can generally contain a value 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.
TRUNC example 1
01 BIN-VAR PIC 99 USAGE BINARY.
. . .
MOVE 123451 to BIN-VAR
The following table shows values of the data items after the MOVE:
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 the 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 gained 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:
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 40
RELATED TASKS
“Compiling with the CICS option” on page 378
VBREF
Use VBREF to get a cross-reference among all verb types used in the source program
and the line numbers in which they are used. VBREF also produces a summary of
how many times each verb was used in the program.
WORD
xxxx specifies the ending characters of the name of the reserved-word table
(IGYCxxxx) to be used in your compilation. IGYC are the first four standard
characters of the name, and xxxx can be one to four characters in length.
RELATED TASKS
“Compiling with the CICS option” on page 378
RELATED REFERENCES
“Conflicting compiler options” on page 289
| You can choose XREF, XREF(FULL), or XREF(SHORT). If you specify XREF without any
| suboptions, XREF(FULL) will be in effect.
Also included is a section listing all the program-names that are referenced in your
program, and the line number where they are defined. External program-names are
identified as such.
If you use XREF and SOURCE, cross-reference information is printed on the same line
as the original source in the listing. Line number references or other information
appears on the right-hand side of the listing page. On the right of source lines that
reference an intrinsic function, the letters IFN appear with the line numbers of the
location where the function’s arguments are defined. Information included in the
embedded references lets you know if an identifier is undefined or defined more
than once (UND or DUP will be printed); if an item is implicitly defined (IMP), such as
special registers or figurative constants; and if a program-name is external (EXT).
If you use XREF and NOSOURCE, you’ll get only the sorted cross-reference listing.
XREF(SHORT) will print only the explicitly referenced variables in the cross-reference
listing. XREF(SHORT) applies to DBCS data-names and procedure-names as well as
EBCDIC names.
Usage notes
v Group names used in a MOVE CORRESPONDING statement are in the XREF listing. In
addition, the elementary names in those groups are also listed.
v In the data-name XREF listing, line numbers 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.
RELATED CONCEPTS
Chapter 19, “Debugging” on page 337
RELATED REFERENCES
COBOL compiler options (Language Environment Debugging Guide)
YEARWINDOW
Abbreviation is: YW
Use the YEARWINDOW option to specify the first year of the 100-year window (the
century window) to be applied to windowed date field processing by the COBOL
compiler.
base-year represents the first year of the 100-year window, and must be specified as
one of the following:
v An unsigned decimal number between 1900 and 1999.
This specifies the starting year of a fixed window. For example,
YEARWINDOW(1930) indicates a century window of 1930-2029.
v A negative integer from -1 through -99.
This indicates a sliding window, where the first year of the window is calculated
from the current run-time date. The number is subtracted from the current year
to give the starting year of the century window. For example, YEARWINDOW(-80)
indicates that the first year of the century window is 80 years before the current
year at the time the program is run.
Usage notes
v The YEARWINDOW option has no effect unless the DATEPROC option is also in effect.
v At run time, two conditions must be true:
– The century window must have its beginning year in the 1900s.
– The current year must lie within the century window for the compilation
unit.
For example, if the current year is 2002, the DATEPROC option is in effect, and you
use the YEARWINDOW(1900) option, the program will terminate with an error
message.
ZWB
If the external decimal item is a scaled item (contains the symbol P in its PICTURE
character string), its use in comparisons is not affected by ZWB. Such items always
have their sign removed before the comparison is made to the alphanumeric field.
ZWB affects how the program runs; the same COBOL source program can give
different results, depending on the option setting.
Use NOZWB if you want to test input numeric fields for SPACES.
Compiler-directing statements
Several statements help you to direct the compilation of your program.
BASIS statement
This extended source program library statement provides a complete
COBOL program as the source for a compilation. For rules of formation
and processing, see the description of text-name for the COPY statement.
*CONTROL (*CBL) statement
This compiler-directing statement selectively suppresses or allows output
to be produced. The names *CONTROL and *CBL are synonymous.
COPY statement
For example:
COPY INVOICES1Q
COPY “Company-#Employees” IN Personellib
In the IN/OF phrase, library-name is the ddname that identifies the
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 on your DD
statement for SYSLIB. Alternatively, define multiple DD statements and
include the IN/OF phrase on your COPY statements.
The maximum block size for the copy library depends on the device on
which your data set resides.
When you compile with the cob2 command, copybooks are included from
the HFS. text-name, library-name, and literal are processed as follows:
v User-defined words are folded to uppercase. Literals are not. Because
UNIX is case sensitive, if your file name is lowercase or mixed case, you
must specify it as a literal.
v When 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 When 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 containing the copybook.
If an environment variable of that name is not defined, the copybook is
searched for as the following names, in the order given:
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 When library-name is a literal, it is treated as the actual path, relative or
absolute, from which to copy file text-name.
v When 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
with a path separator (/) inserted between the two values. For example,
suppose you have the following setting for COPY MYCOPY OF MYLIB:
export MYCOPY=mystuff/today.cpy
export MYLIB=/u/user1
RELATED TASKS
“Changing the header of a source listing” on page 7
“Eliminating repetitive coding” on page 569
“Specifying compiler options under z/OS” on page 258
RELATED REFERENCES
“cob2” on page 273
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.
Besides using the features inherent in COBOL, you can also use Debug Tool, which
is available in the Full Function offering of this compiler.
RELATED TASKS
“Debugging with source language” on page 338
“Debugging using compiler options” on page 341
“Getting listings” on page 347
“Preparing to use the debugger” on page 371
Debug Tool User’s Guide
RELATED REFERENCE
Debug Tool Reference and Messages
Formatting and analyzing system dumps (Language Environment Debugging Guide)
Debugging example COBOL programs (Language Environment Debugging Guide)
RELATED TASKS
“Tracing program logic”
“Finding and handling input-output errors” on page 339
“Validating data” on page 339
“Finding uninitialized data” on page 339
“Generating information about procedures” on page 340
RELATED REFERENCES
Source language debugging (Enterprise COBOL Language Reference)
If you have used explicit scope terminators to end statements in your program, the
logic of your program 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 REFERENCES
DISPLAY statement (Enterprise COBOL Language Reference)
To use file status keys in debugging, include a test after each input-output
statement to check for a nonzero value in the status key. If the value is nonzero (as
reported in an error message), you should 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.
Code each USE AFTER STANDARD ERROR statement in a section immediately after the
DECLARATIVE SECTION keyword of the PROCEDURE DIVISION.
RELATED TASKS
“Coding ERROR declaratives” on page 227
RELATED REFERENCES
Status key values and meanings (Enterprise COBOL Language Reference)
Status key (Enterprise COBOL Language Reference)
Validating data
If you suspect that your program is trying to perform arithmetic on nonnumeric
data or is somehow receiving the wrong type of data on an input record, use the
class test to validate the type of data. The class test checks whether data is
alphabetic, alphabetic-lower, alphabetic-upper, DBCS, KANJI, or numeric.
RELATED REFERENCES
Class condition (Enterprise COBOL Language Reference)
If the problem happens intermittently and not always with the same data, it could
be that a switch is not initialized but generally is set to the right value (0 or 1) by
accident. By including a SET statement to ensure that the switch is initialized, you
can either determine that the uninitialized switch is the problem or remove that as
a possible cause.
RELATED REFERENCES
INITIALIZE statement (Enterprise COBOL Language Reference)
SET statement (Enterprise COBOL Language Reference)
For example, to check 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 control passes to that procedure. You can use
the counter technique to check items such as these:
v How many times a PERFORM runs and thus whether a particular routine is being
used and whether the control structure is correct
v How many times a loop routine runs and thus whether the loop is executing
and whether the number for the loop is accurate
You can have debugging lines or debugging statements or both in your program.
Debugging lines
Debugging lines are statements that are identified by a D in column 7. To make
debugging lines in your program active, include the WITH DEBUGGING MODE clause
on the SOURCE-COMPUTER line in the ENVIRONMENT DIVISION. Otherwise debugging
lines are treated as comments.
Debugging statements
Debugging statements are the statements 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 contained in
nested programs.
To use debugging statements in your program, you must include the WITH
DEBUGGING MODE clause and use the DEBUG run-time option. However, you cannot
use the USE FOR DEBUGGING declarative in a program that you compile with the
THREAD option.
The WITH DEBUGGING MODE clause and the TEST compiler option (with any suboption
value other than NONE) are mutually exclusive. If both are present, the WITH
DEBUGGING MODE clause takes precedence.
RELATED REFERENCES
Debugging line (Enterprise COBOL Language Reference)
Coding debugging sections (Enterprise COBOL Language Reference)
DEBUGGING declarative (Enterprise COBOL Language Reference)
The number at the end of the message, 22, is the value accumulated in the data
item Total; it shows 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.
In addition, you can use certain compiler options to help you find these elements
in your program:
v Error messages and where the errors occurred (FLAG)
v Program entity definitions and references (XREF)
You can get a copy of your source (by using the SOURCE compiler option) or a
listing of generated code (by using the LIST compiler option).
There is also a compiler option (TEST) that you need to use to prepare your
program for debugging.
RELATED TASKS
“Selecting the level of error to be diagnosed” on page 344
“Finding coding errors”
“Finding line sequence problems” on page 343
“Checking for valid ranges” on page 343
“Finding program entity definitions and references” on page 345
“Listing data items” on page 346
“Getting listings” on page 347
“Preparing to use the debugger” on page 371
RELATED REFERENCES
“COMPILE” on page 294
“SEQUENCE” on page 318
“SSRANGE” on page 321
“FLAG” on page 302
“XREF” on page 330
“MAP” on page 307
“VBREF” on page 329
“LIST” on page 306
“TEST” on page 322
If you are compiling in the TSO foreground, you can send the messages to your
screen by defining your data set as the SYSTERM data set and using the TERM
option when you compile your program.
The following compiler options are suppressed when you use NOCOMPILE without
parameters: DECK, OFFSET, LIST, OBJECT, OPTIMIZE, SSRANGE, and TEST.
Compiling conditionally
When you use NOCOMPILE(x), where x is one of the severity levels for errors, your
program is compiled if all the errors are of a lower severity than the x level. The
severity levels (from highest to lowest) that you can use are S (severe), E (error),
and W (warning).
RELATED REFERENCES
“COMPILE” on page 294
When you use SEQUENCE, the compiler checks the source statement numbers you
have supplied to see whether they are in ascending sequence. Two asterisks are
placed beside statement numbers that are out of sequence. Also, the total number
of these statements is printed as the first line of the diagnostics after the source
listing.
RELATED REFERENCES
“SEQUENCE” on page 318
When the SSRANGE option is specified, checking is performed at run time when
both of the following are true:
v The COBOL statement containing the indexed, subscripted, variable-length, or
reference-modified data item is performed.
v The CHECK run-time option is ON.
If a check finds that an address is generated outside the address range of the data
item that contains the referenced data, an error message is generated and the
program stops. The error 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, or reference modifiers are literals in a given data reference
and they result in a reference outside the data item, the error is diagnosed at
compile time regardless of the setting of the SSRANGE compiler option.
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.
Severity level What you get when you specify the corresponding level
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 the 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 containing 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.
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 error messages” on page 265
RELATED REFERENCES
“FLAG” on page 302
“Messages and listings for compiler-detected errors” on page 266
“Severity codes for compiler error messages” on page 267
To include only the explicitly referenced variables, use the XREF(SHORT) option.
If your program contains DBCS user-defined words, these user-defined words are
listed before the alphabetic list of EBCDIC user-defined words.
Group names in a MOVE CORRESPONDING statement are listed in the XREF listing. The
cross-reference listing includes the group names and all the elementary names
involved in the move.
RELATED TASKS
“Getting listings” on page 347
RELATED REFERENCES
“XREF” on page 330
In addition, when you use the MAP option, an embedded MAP summary (which
contains condensed data MAP information) is generated to the right of the COBOL
source data declaration. 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 or *CONTROL NOMAP statements (*CBL MAP or *CBL NOMAP
statements) throughout the source. For example:
*CONTROL NOMAP *CBL NOMAP
01 A 01 A
02 B 02 B
*CONTROL MAP *CBL MAP
RELATED TASKS
“Getting listings” on page 347
RELATED REFERENCES
“MAP” on page 307
Attention: The listings produced by the compiler are not a programming interface
and are subject to change.
1. To eliminate messages, turn off the options (such as FLAG) that govern the level of compile diagnostic
information.
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 selective listing of generated object code by placing *CONTROL LIST and *CONTROL NOLIST
statements (*CBL LIST and *CBL NOLIST) in your source. Note that the *CONTROL statement is different from 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 error messages” on page 265
“Reading LIST output” on page 356
Debugging COBOL programs (Language Environment Debugging Guide)
RELATED REFERENCES
“Messages and listings for compiler-detected errors” on page 266
| (4) Deliberate option conflicts were forced by specifying the LIST option in the
| compiler input parameter list. LIST and OFFSET (specified in the CBL
| statement) are mutually exclusive. As a result, the LIST option is ignored.
(5) Status of options at the start of this compilation.
(6) Customized page header resulting from the COBOL program TITLE
statement.
(7) 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.
(8) Count of diagnostic messages in this program, grouped by severity level.
(9) Program statistics for the program IGYTCARA.
(10) 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) Customized page header resulting from the COBOL program TITLE
statement
(2) Scale line, which labels Area A, Area B, and source code column numbers
(3) Source code line number assigned by the compiler
(4) Program (PL) and statement (SL) nesting level
(5) Columns 1 through 6 of program (the sequence number area)
RELATED REFERENCES
“Terms used in MAP output” on page 354
“Symbols used in LIST and MAP output” on page 354
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.
Symbol Definition
APBdisp=n1 ALL subscript parameter block displacement
AVN=n1 Variable name cell for ALTER statement
| 1. n is the number of the entry. For base locators, it can also be XXXXX, indicating a data item that was deleted by
OPTIMIZE(FULL) processing.
2. (hhhhh) is the program offset in hexadecimal.
3. nnnn is the offset in decimal from the beginning of the entry.
4. Alphanumeric temporaries are temporary data values used in processing alphanumeric intrinsic function and
alphanumeric EVALUATE statement subjects.
RELATED TASKS
Interpret a particular instruction (Principles of Operation)
RELATED REFERENCE
Stack storage overview (Language Environment Programming Guide)
RELATED REFERENCES
“Signature information bytes: compiler options”
“Signature information bytes: DATA DIVISION” on page 361
“Signature information bytes: ENVIRONMENT DIVISION” on page 361
“Signature information bytes: PROCEDURE DIVISION verbs” on page 362
“Signature information bytes: more PROCEDURE DIVISION items” on page 363
RELATED REFERENCES
“LIST” on page 306
Check return code: A return code greater than 4 from the compiler could mean
that some of the verbs shown as being in the program in information bytes might
have been discarded because of an error.
RELATED REFERENCES
“LIST” on page 306
RELATED CONCEPTS
“Storage and its addressability” on page 33
DATA VALIDATION AND UPDATE PROGRAM IGYTCARA Date 08/21/2002 Time 10:48:16
*** DSA MEMORY MAP ***
(1) (2)
DSALOC
(1) Hexadecimal offset of the dynamic save area (DSA) field from the start of
the DSA
(2) Explanation of the contents of the DSA field
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.
(1) Line number where the program name was defined. If the program is
external, the word EXTERNAL is displayed instead of a definition line
number.
(2) Program name.
(3) Line numbers where the program is referenced.
DATA VALIDATION AND UPDATE PROGRAM IGYTCARA Date 08/21/2002 Time 10:48:16
. . .
(1) (2) (3)
LINE # HEXLOC VERB LINE # HEXLOC VERB LINE # HEXLOC VERB
000880 0026F0 DISPLAY 000881 002702 PERFORM 000933 002702 OPEN
000934 002722 IF 000935 00272C DISPLAY 000936 002736 PERFORM
001389 002736 DISPLAY 001390 002740 DISPLAY 001391 00274A DISPLAY
001392 002754 DISPLAY 001393 00275E DISPLAY 001394 002768 DISPLAY
001395 002772 DISPLAY 000937 00277C PERFORM 001434 00277C DISPLAY
001435 002786 STOP 000939 0027A2 MOVE 000940 0027AC WRITE
000941 0027D6 IF 000942 0027E0 DISPLAY 000943 0027EA PERFORM
001389 0027EA DISPLAY 001390 0027F4 DISPLAY 001391 0027FE DISPLAY
001392 002808 DISPLAY 001393 002812 DISPLAY 001394 00281C DISPLAY
001395 002826 DISPLAY 000944 002830 DISPLAY 000945 00283A PERFORM
001403 00283A DISPLAY 001404 002844 DISPLAY 001405 00284E DISPLAY
001406 002858 DISPLAY 001407 002862 CALL 000947 002888 CLOSE
(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 once for each
time they are used.
(3) Verb used.
RELATED REFERENCES
“OFFSET” on page 312
The Debug Tool debugger is provided with the Full Function feature of the
Enterprise COBOL compiler. To use Debug Tool to step through a run of your
program, use the TEST compiler option. For remote debugging, the Distributed
Debugger provides the client graphical user interface to the debug information
provided by the Debug Tool engine running under z/OS or UNIX.
| You can specify the TEST suboption SEPARATE to have the symbolic information
| tables for Debug Tool generated in a data set separate from your object module.
| Also, you can enable your COBOL program for debugging using overlay hooks
| (production debugging), rather than compiled-in hooks, which have some
| performance degradation even when the run-time TEST option is off. To use this
| function, compile with TEST(NONE,SYM).
RELATED TASKS
Preparing your program for debugging (Debug Tool User’s Guide)
RELATED REFERENCES
“TEST” on page 322
When you use the CICS compiler option, the Enterprise COBOL compiler handles
both native COBOL and embedded CICS statements in the source program.
Compilers before COBOL for OS/390 & VM Version 2 Release 2 require a separate
translation step to convert EXEC CICS commands to COBOL code. You can still
translate embedded CICS statements separately, but use of the integrated CICS
translator is recommended.
After you compile and link-edit 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 this COBOL information. See
the related references for further information about CICS.
You can determine how run-time errors are handled by setting the CBLPSHPOP
run-time option. See the related tasks for information about CICS HANDLE and
CBLPSHPOP.
RELATED CONCEPTS
“Integrated CICS translator” on page 380
RELATED TASKS
“Coding COBOL programs to run under CICS”
“Compiling with the CICS option” on page 378
“Using the separate CICS translator” on page 381
“Handling errors by using CICS HANDLE” on page 383
Using the CBLPSHPOP run-time option under CICS (Language Environment
Programming Guide)
RELATED REFERENCES
“CICS” on page 293
CICS Application Programming Guide
Within EXEC commands, use the space as a word separator; do not use a comma or
a semicolon.
When you code your programs to run under CICS, do not use the following code:
ACCEPT format 1: data transfer (you can use format-2 ACCEPT to retrieve the
system date and time)
CLOSE
DELETE
DISPLAY UPON SYSPUNCH
DISPLAY UPON CONSOLE
MERGE
OPEN
READ
RERUN
REWRITE
START
STOP literal
WRITE
If you plan to use the separate CICS translator, you must put any REPLACE
statements that contain EXEC commands after the PROCEDURE DIVISION statement for
the program, or they will not be translated.
You can use these format-2 ACCEPT statements in the CICS environment to get the
system date:
v ACCEPT identifier-2 FROM DATE
v ACCEPT identifier-2 FROM DATE YYYYMMDD
v ACCEPT identifier-2 FROM DAY
v ACCEPT identifier-2 FROM DAY YYYYDDD
v ACCEPT identifier-2 FROM DAY-OF-WEEK
You can use this format-2 ACCEPT statement in the CICS environment to get the
system time:
v ACCEPT identifier-2 FROM TIME
The recommended way to retrieve system date and time information is to use the
ACCEPT statement, because it works in all environments (CICS and non-CICS).
DISPLAY . . . UPON CONSOLE and DISPLAY . . . UPON SYSPUNCH, however, are not
allowed.
You can use CALL identifier with the NODYNAM compiler option to dynamically call a
program. Called programs can contain any function supported by CICS for the
language. You must define dynamically called programs in the CICS program
processing table (PPT) if you are not using CICS autoinstall.
The following table shows the calling relationship between COBOL and assembler
programs. In the table, assembler programs that conform to the interface 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.
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 Yes, if the assembler program No
to an Enterprise COBOL is not a main program
program?
When you code nested programs and you plan to use the separate CICS translator,
pass DFHEIBLK and DFHCOMMAREA as parameters to the nested programs that contain
EXEC commands or references to the EIB (EXEC interface block). You must pass the
same parameters also to any program that forms part of the control hierarchy
between such a program and its top-level 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
“Handling errors when calling programs” on page 233
ILC under CICS (Language Environment Writing ILC Applications)
RELATED REFERENCES
CICS External Interfaces Guide
You can specify the CICS option in any of the compiler option sources: compiler
invocation, PROCESS or CBL statements, or installation default. When 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 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 these
options:
In addition, IBM recommends that you use the compiler option WORD(CICS) to have
the compiler flag language elements that are not supported under CICS.
You can use the standard JCL procedural statements that are supplied with
COBOL to compile your program with the integrated CICS translator. In addition
to specifying the above compiler options, you must change your JCL to specify the
STEPLIB override for the COBOL step and to 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 V2R2 is
CICSTS22.CICS.SDFHLOAD, but your installation might have changed the name.
For example, you might have the following line in your JCL:
//STEPLIB DD DSN=CICSTS22.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.
The CICS suboptions 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 JCL file has the following code:
During compilation, the compiler passes the following suboption string to the
integrated CICS translator:
“FLAG(I) DEBUG LINKAGE”
The concatenated strings are delimited with a single space and with a quote or
apostrophe 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 CONCEPTS
“Integrated CICS translator”
RELATED TASKS
“Coding COBOL programs to run under CICS” on page 375
RELATED REFERENCES
“CICS” on page 293
CICS Application Programming Guide
Although the use of the separate CICS translator continues to be supported, use of
the integrated CICS translator is recommended. Certain restrictions that apply
when you use the separate translator do not apply when you use the integrated
translator:
v You can use Debug Tool to debug the original source, instead of the expanded
source that the separate CICS translator provides.
v You do not need to translate separately the EXEC CICS or EXEC DLI statements
that are in copybooks.
v There is no intermediate data set for the translated but not compiled version of
the source program.
v There is only one output listing instead of two.
v Using nested programs that contain EXEC CICS statements is simpler. DFHCOMAREA
and DFHEIBLK are generated with the GLOBAL attribute in the outermost program.
You do not need to pass them as arguments on calls to nested programs or
specify them on the PROCEDURE DIVISION USING statement of nested programs.
v You can keep nested programs that contain EXEC CICS in separate files and
include them through COPY statements.
RELATED TASKS
“Coding COBOL programs to run under CICS” on page 375
“Compiling with the CICS option” on page 378
RELATED REFERENCES
“TRUNC” on page 326
To translate CICS statements separately, use the COBOL3 translator option. This
option causes the following line to be inserted:
CBL RENT,NODYNAM,LIB
You can suppress the insertion of a CBL statement by using the CICS translator
option NOCBLCARD.
CICS provides the translator option ANSI85, which supports these language
features (introduced by the COBOL 85 Standard):
v Blank lines intervening in literals
v Sequence numbers containing any character
v Lowercase characters supported in all COBOL words
v REPLACE statement
v Batch compilation
v Nested programs
v Reference modification
v GLOBAL variables
v Interchangeability of comma, semicolon, and space
v Symbolic character definition
After you use the separate CICS translator, use the following compiler options
when you compile the program:
In addition, IBM recommends that you use the compiler option WORD(CICS)to have
the compiler flag language elements that are not supported under CICS.
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 options that have no effect:
ADV
FASTSRT
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 380
RELATED TASKS
“Compiling with the CICS option” on page 378
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 before using it. You must remove the words in bold above from the list of
words marked as restricted, because they are required for the SORT function.
RELATED TASKS
“Compiling with the CICS option” on page 378
| 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), eliminating the
| overhead of the PUSH HANDLE and POP HANDLE commands. As a result, performance
| can be improved compared to running with CBLPSHPOP(ON).
| If you are migrating an application from the VS COBOL II run time to the
| Language Environment run time, see the related reference for information about
| the CBLPSHPOP option for additional considerations.
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 will occur.
RELATED REFERENCES
CBLPSHPOP run-time option (Enterprise COBOL Compiler and Run-Time Migration
Guide)
IBM Enterprise COBOL Version 3 Release 1 Performance Tuning
(www.ibm.com/software/ad/cobol/zos/pdf/cobpf310.pdf)
RELATED CONCEPTS
“DB2 coprocessor” on page 388
RELATED TASKS
“Coding SQL statements”
“Compiling with the SQL option” on page 387
Coding SQL statements in a COBOL application (IBM DB2 Application Programming
and SQL Guide)
RELATED REFERENCES
IBM DB2 SQL Reference
The name in an SQL INCLUDE statement follows the same rules as those for COPY
text-name and is processed identically to a COPY text-name without a REPLACING
clause.
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.
| When you use the stand-alone DB2 preprocessor, you must specify the code page
| (CCSID) in EXEC SQL DECLARE statements for host variables declared with USAGE
| NATIONAL. You must specify the code page for host variables declared with USAGE
| DISPLAY or DISPLAY-1 only if the CCSID in effect for the COBOL CODEPAGE compiler
| option and the CCSIDs used by DB2 for character and graphic data do not match.
| For example:
| CBL CODEPAGE(1140) NSYMBOL(NATIONAL)
| . . .
| WORKING-STORAGE SECTION.
| EXEC SQL INCLUDE SQLCA END-EXEC.
| EXEC SQL BEGIN DECLARE SECTION END-EXEC.
| 01 ID 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 END DECLARE SECTION END-EXEC.
| . . .
| EXEC SQL FETCH C1 INTO :ID, :C1140, :G1200 END-EXEC.
| When you use the integrated DB2 coprocessor, the statements EXEC SQL DECLARE
| :C1140 VARIABLE CCSID 1140 END-EXEC and EXEC SQL DECLARE :G1200 VARIABLE
| CCSID 1200 END-EXEC coded above are not necessary because the code page
| information is handled implicitly.
| 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 the
| CCSID in effect for the COBOL CODEPAGE compiler option:
| 01 C1208.
| 49 C1208-LEN PIC S9(4) USAGE COMP.
| 49 C1208-TEXT PIC X(50).
| EXEC SQL DECLARE :C1208 VARIABLE CCSID 1208 END-EXEC.
| 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.
If you specify a USAGE BINARY, COMP, or COMP-4 item when option TRUNC(OPT) or
TRUNC(STD) or both are in effect, the compiler will accept the item but the data
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 the 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 CONCEPTS
“Formats for numeric data” on page 40
RELATED REFERENCES
“CODEPAGE” on page 294
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 on the SQL compiler option is made
available to the DB2 coprocessor. Only the DB2 coprocessor views the contents of
the string.
When you use the DB2 coprocessor, you must compile with these options:
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:
v DBRMLIB DD statement with the location for the generated database request
module (DBRM).
For example, you might have the following lines in your JCL:
//DBRMLIB DD DSN=PAYROLL.MONTHLY.DBRMLIB.DATA(MASTER),DISP=SHR
//STEPLIB DD DSN=DSN710.SDSNLOAD,DISP=SHR
Compiling in batch
When you use the SQL option to compile a source file that contains a sequence of
COBOL programs (a batch compile sequence), the option must be in effect for the
first program of the batch sequence. If the SQL option is specified on CBL or PROCESS
cards, the CBL or PROCESS cards must precede the first program in the batch
compile sequence.
The DB2 suboptions 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(“DATABASE xxxx”)’
//COBOL.SYSIN DD *
CBL SQL(“PACKAGE USER xxxx”)
CBL SQL(“USING xxxx”)
IDENTIFICATION DIVISION.
PROGRAM-ID. DRIVER1.
During compilation, the compiler passes the following suboption string to the DB2
coprocessor:
“DATABASE xxxx PACKAGE USER xxxx USING xxxx”
The concatenated strings are delimited with single spaces. When the compiler finds
multiple instances of the same DB2 suboption, the last specification of the
suboption in the concatenated string will be in effect. The compiler limits the
length of the concatenated DB2 suboption string to 4 KB.
RELATED CONCEPTS
“DB2 coprocessor”
RELATED REFERENCES
“SQL” on page 320
IBM DB2 Command Reference
DB2 coprocessor
When you use the DB2 coprocessor (called SQL statement coprocessor by DB2), the
compiler handles your source program containing embedded SQL statements
without your having to use a separate precompile step. When the compiler
encounters SQL statements at significant points in the source program, it interfaces
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 on the DBRMLIBB 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.
The COBOL compiler listing includes the error diagnostics (such as syntax errors
in the SQL statements) that the DB2 coprocessor generates.
Certain restrictions on the use of COBOL language that apply when you use the
precompile step do not apply when you use the DB2 coprocessor:
v You can use SQL statements in any nested program. (With the precompiler, SQL
statements are restricted to the outermost program.)
v You can use SQL statements in copybooks.
v REPLACE statements work on SQL statements.
RELATED TASKS
“Compiling with the SQL option” on page 387
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
You code calls to CEETDLI the same way as calls to CBLTDLI. CEETDLI behaves
essentially the same way as CBLTDLI.
| You can also run object-oriented COBOL programs in an IMS Java dependent
| region. You can mix the object-oriented COBOL and Java languages in a single
| application.
RELATED TASKS
“Compiling and linking COBOL programs for running under IMS”
“Using object-oriented COBOL and Java under IMS” on page 392
“Calling a COBOL method from an IMS Java application” on page 392
“Building a mixed COBOL and Java application that starts with COBOL” on
page 393
“Writing mixed-language applications” on page 394
You must use the RENT compiler option to compile a program that is to be run
preloaded or as both preloaded and nonpreloaded. When you preload a load
module that contains COBOL programs, all of the COBOL programs in that load
module must be compiled with 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, your application program must be compiled with
either RENT or NORENT RMODE(ANY).
RELATED CONCEPTS
“Storage and its addressability” on page 33
RELATED TASKS
Coordinated condition handling under IMS (Language Environment Programming
Guide)
RELATED REFERENCES
“DATA” on page 296
“RENT” on page 316
IMS considerations (Enterprise COBOL Compiler and Run-Time Migration Guide)
| 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 488
Chapter 28, “Writing object-oriented programs” on page 459
Chapter 29, “Communicating with Java methods” on page 501
Chapter 17, “Compiling, linking, and running OO applications” on page 277
IMS Java User’s Guide
| You can then create an instance and invoke the methods of this class from an IMS
| Java program that runs in an IMS Java dependent region, just as you would use
| any other class.
| When you write the initial routine of a mixed-language application in Java, you
| must implement a class that is derived from the IMS Java IMSApplication class.
| A Java program cannot call procedural COBOL programs directly. To reuse existing
| COBOL IMS code, you can use one of the following techniques:
| v Restructure the COBOL code as a method in a COBOL class.
| v Write a COBOL class definition and method that serves as a wrapper for the
| existing procedural code. The wrapper code can use COBOL CALL statements to
| access procedural COBOL programs.
RELATED TASKS
Chapter 17, “Compiling, linking, and running OO applications” on page 277
“Structuring OO applications” on page 498
“Wrapping procedure-oriented COBOL programs” on page 497
IMS Java User’s Guide
| An application that runs in an IMS Java dependent region must start with the main
| method of a class. A COBOL class definition with a main factory method meets this
| requirement; therefore, you can use it as the first routine of a mixed COBOL and
| Java IMS application. (See the related tasks for details about how you can structure
| OO applications.) Enterprise COBOL generates a Java class with a main method
| that the IMS Java dependent region can find, instantiate, and invoke in the same
| way that the region does for the main method of an IMS Java IMSApplication
| subclass. Although you can code the entire application in COBOL, you would
| probably build this type of application to call a Java routine. When COBOL
| run-time support runs within the JVM of an IMS Java dependent region, it
| automatically finds and uses this JVM to invoke methods on Java classes.
| When the main factory method of a COBOL class is the initial routine of a
| mixed-language application in an IMS Java dependent region, the program is
| subject to the same requirements as a Java program that runs in the dependent
| region. That is, the program must explicitly commit resources before it reads
| However, the COBOL application is not derived from the IMSApplication class,
| and it should not use the IMS Java classes for processing messages or
| synchronizing transactions. Instead, it should use DL/I calls in COBOL for
| processing messages (GU and GN) and synchronizing transactions (CHKP). A CHKP call
| in an IMS Java dependent region does not result in the automatic retrieval of a
| message from the message queue, unlike a CHKP call in a non-IMS Java region.
RELATED TASKS
“Structuring OO applications” on page 498
IMS Java User’s Guide
New IBM Technology featuring Persistent Reusable Java Virtual Machines
Accessing databases
| Limitation: EXEC SQL statements for DB2 database access are not currently
| supported in COBOL routines that run in IMS Java dependent regions.
| You can use either Java, COBOL, or a mixture of the two languages for accessing
| IMS databases.
| 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 IMS Java class library constructs 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 has probably altered the
| 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
| the AIB. You do not specify the PCB address directly, and your application does
| not need to know the relative PCB position in the PCB list. At the completion of
| the call, the AIB returns the PCB address that corresponds to the PCB name that
| the application passed.
| For example:
| 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 x(04).
| 05 iotime pic x(04).
| 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
RELATED TASKS
IMS Java User’s Guide
IMS Application Programming: Transaction Manager
| You can use Debug Tool to debug UNIX programs in remote debug mode, for
| example, by using the remote debugger from IBM VisualAge COBOL, or in
| full-screen mode using a VTAM terminal.
RELATED TASKS
Chapter 16, “Compiling under UNIX” on page 269
“Running OO applications under UNIX” on page 279
“Running in UNIX environments”
“Setting and accessing environment variables” on page 398
“Calling UNIX/POSIX APIs” on page 400
“Accessing main program parameters” on page 402
Language Environment Programming Guide
RELATED REFERENCE
“RENT” on page 316
Enter the program name at the shell prompt. The program must be in the
current directory or in your search path.
You can specify run-time options only by setting the environment variable
_CEE_RUNOPTS before starting the program.
The ISPF shell can direct stdout and stderr only to an HFS file, not to your
terminal.
v From outside a shell, either:
– TSO/E, or
– Batch
To call a UNIX COBOL program that resides in an HFS file from the TSO/E
ready prompt, use the BPXBATCH utility or a spawn() syscall in a REXX exec.
To call a UNIX COBOL program that resides in an HFS file with the JCL EXEC
statement, use the BPXBATCH utility.
RELATED TASKS
“Running OO applications under UNIX” on page 279
“Setting and accessing environment variables”
“Calling UNIX/POSIX APIs” on page 400
“Accessing main program parameters” on page 402
“Defining and allocating QSAM files” on page 134
“Defining and allocating line-sequential files” on page 175
“Allocating VSAM files” on page 168
“Displaying values on a screen or in a file (DISPLAY)” on page 30
Running POSIX-enabled programs using a UNIX shell (Language Environment
Programming Guide)
Running POSIX-enabled programs outside the UNIX shells (Language Environment
Programming Guide)
RELATED REFERENCES
“TEST” on page 322
The BPXBATCH utility (UNIX System Services User’s Guide)
Language Environment Programming Reference
Although setting and resetting environment variables from the shell before you
begin to run a program is probably 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 access the value of an environment variable from a COBOL program, call the
getenv() function.
RELATED TASKS
“Running in UNIX environments” on page 397
“Calling UNIX/POSIX APIs” on page 400
“Accessing main program parameters” on page 402
“Running OO applications under UNIX” on page 279
“Displaying values on a screen or in a file (DISPLAY)” on page 30
RELATED REFERENCES
_CEE_ENVFILE (C/C++ Programming Guide)
Language Environment Programming Reference
MVS JCL 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.
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() is a
main program, and all COBOL programs in the process start in initial state with all
files closed.
Samples
Sample code for calling some of the POSIX routines is provided with the product.
The sample source code is in the SIGYSAMP data set.
RELATED REFERENCES
C/C++ Run-Time Library Reference
UNIX System Services Programming Assembler Callable Services Reference
RELATED TASKS
“Running in UNIX environments” on page 397
“Setting and accessing environment variables” on page 398
“Calling UNIX/POSIX APIs” on page 400
Name prefix alert: Do not use program names that start with prefixes used by IBM
products. If you try to use programs whose names start with any of the following,
your CALL statements might resolve to IBM library or compiler routines rather than
to your intended program:
RELATED CONCEPTS
“Main programs, subprograms, and calls” on page 408
RELATED TASKS
“Ending and reentering main programs or subprograms” on page 408
“Transferring control to another program” on page 410
“Making recursive calls” on page 419
“Calling to and from object-oriented programs” on page 419
“Using procedure and function pointers” on page 420
RELATED REFERENCES
Register conventions (Language Environment Programming Guide)
In the PROCEDURE DIVISION, a program can call another program (generally called a
subprogram in COBOL terms), 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
called program processing is completed, the program can either transfer control
back to the calling program or end the run unit.
The called COBOL program starts running at the top of the PROCEDURE DIVISION.
RELATED TASKS
“Ending and reentering main programs or subprograms”
“Making recursive calls” on page 419
“Transferring control to another program” on page 410
RELATED REFERENCES
Language Environment Programming Guide
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 it is called in the run unit, its internal values will
be as they were left, except that return values for PERFORM statements will be reset
to their initial values. (In contrast, a main program is initialized each time it is
called.)
There are some cases where 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 with the INITIAL attribute 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
Thread termination (Language Environment Programming Guide)
RELATED TASKS
“Calling nested COBOL programs” on page 416
“Making recursive calls” on page 419
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.
When you want to use OS/VS COBOL with Enterprise COBOL, there are
differences in support between non-CICS and CICS:
In a non-CICS environment
You can make static and dynamic calls between Enterprise COBOL and
other COBOL programs.
Exception: You cannot call VS COBOL II or OS/VS COBOL programs in
the UNIX environment.
In a CICS environment
You cannot call OS/VS COBOL programs in the CICS environment. You
must use EXEC CICS LINK to transfer control between OS/VS COBOL
programs and other COBOL programs.
Calls to dynamic link libraries (DLLs) are an alternative to COBOL dynamic CALL,
and are well suited to object-oriented COBOL applications, UNIX programs, and
applications that interoperate with C/C++.
Under z/OS, linking two load modules together results logically in a single
program with a primary entry point and an alternate entry point, each with its
own name. Each name by which a subprogram is to be dynamically called must be
known to the system. You must specify each such name in linkage-editor or binder
control statements as either a NAME or an ALIAS of the load module that contains the
subprogram.
RELATED CONCEPTS
“Nested programs” on page 416
RELATED TASKS
“Making static calls”
“Making dynamic calls” on page 411
“Making both static and dynamic calls” on page 414
“Calling nested COBOL programs” on page 416
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 413
RELATED TASKS
“Calling to and from object-oriented programs” on page 419
“Making dynamic calls”
“Making both static and dynamic calls” on page 414
RELATED REFERENCES
“DYNAM” on page 301
“DLL” on page 299
CALL statement (Enterprise COBOL Language Reference)
In this form of the CALL statement, the called COBOL subprogram is not link-edited
with the main program, but is instead link-edited into a separate load module, and
is loaded at run time only when it is required (that is, when called).
Each subprogram that you call with a dynamic CALL statement can be part of a
different load module 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 hierarchical 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 containing 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
Canceling a subprogram
When you issue a CANCEL statement for a subprogram, the storage occupied by the
subprogram is freed, and 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 an intervening
CANCEL statement is issued before you specify different entry points in the dynamic
CALL statement.
RELATED CONCEPTS
“Performance considerations of static and dynamic calls”
RELATED TASKS
“Making both static and dynamic calls” on page 414
RELATED REFERENCES
“DYNAM” on page 301
CALL statement (Enterprise COBOL Language Reference)
ENTRY statement (Enterprise COBOL Language Reference)
Language Environment Programming Reference
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 TASKS
“Making static calls” on page 410
“Making dynamic calls” on page 411
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
loaded into storage. Because this arrangement does not guarantee that the
subprogram will be left in its last-used state, results can be unpredictable.
RELATED REFERENCES
“DYNAM” on page 301
The following example shows how you would code a static call:
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 a dynamic call:
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:
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 the CALL literal or CALL identifier statement to make calls to nested
programs.
You can call a contained program only from its directly containing program, unless
you identify the contained program as COMMON in its PROGRAM-ID clause. In that case,
you can call the common program from any program that is contained (directly or
indirectly) in the same program as the common program. Only contained
programs can be identified as COMMON. Recursive calls are not allowed.
You cannot use the THREAD option when compiling programs that contain nested
programs.
RELATED CONCEPTS
“Nested programs”
RELATED REFERENCES
“Scope of names” on page 418
CALL statement (Enterprise COBOL Language Reference)
Nested programs
A COBOL program can nest, or contain, other COBOL programs. The nested
programs can themselves contain yet other programs. A nested program can be
directly or indirectly contained in a program.
RELATED TASKS
“Calling nested COBOL programs” on page 416
RELATED REFERENCES
“Scope of names” on page 418
Note that:
v A2 cannot call A1 because A1 is not common and is not contained in A2.
v A1 can call A2 because A2 is common.
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 were declared. They are not visible or accessible to contained and containing
programs.
Global names: A name that is global (indicated 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 name of the item.
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 on 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 coded on its 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 6
RELATED REFERENCES
RECURSIVE attribute (Enterprise COBOL Language Reference)
“THREAD” on page 325
If you must call a COBOL DLL program from a COBOL non-DLL program, other
means that ensure that the DLL linkage mechanism is followed are available.
You can set procedure-pointer and function-pointer data items only by using
format 6 of the SET statement. The SET statement sets the pointer to refer either to
an entry point in the same load module as your program, to a separate load
module, or to an entry point 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 your program with the NODYNAM and NODLL options and set your
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 load module as your program.
Otherwise the reference cannot be resolved.
v If you compile your program with the NODLL option and either set your pointer
item to an identifier that will contain the name of the entry point at run time or
set your pointer item to a literal and compile with the DYNAM option, then your
pointer item, whether a literal or variable, must point to an entry point in a
separate load module. The entry point can be either the primary entry point or
an alternate entry point named in an ALIAS linkage-editor or binder statement.
v If you compile with the NODYNAM and DLL options and set your pointer item to a
literal value (the actual name of an entry point), the value must refer to an entry
point in the same load module as your program 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 load
module.
v If you compile with the NODYNAM and DLL options and set your 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.
If you set your pointer item to an entry address in a dynamically called load
module and your program subsequently cancels that dynamically called module,
then your pointer item becomes undefined. Reference to it thereafter is not reliable.
RELATED TASKS
“Using procedure or function pointers with DLLs” on page 443
“Accessing JNI services” on page 501
RELATED REFERENCES
“DLL” on page 299
“DYNAM” on page 301
“NAME” on page 308
CANCEL statement (Enterprise COBOL Language Reference)
Procedure pointer (Enterprise COBOL Language Reference)
Function pointer (Enterprise COBOL Language Reference)
ENTRY statement (Enterprise COBOL Language Reference)
For reentrant programs, use the DATA compiler option and the HEAP and ALL31
run-time 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 33
RELATED TASKS
“Compiling programs to create DLLs” on page 438
Chapter 17, “Compiling, linking, and running OO applications” on page 277
RELATED REFERENCES
“RENT” on page 316
“DATA” on page 296
ALL31 run-time option (Language Environment Programming Reference)
HEAP run-time option (Language Environment Programming Reference)
This material describes how you can write programs that can share data with other
programs. For the purposes of this discussion, a subprogram is any program called
by another program.
RELATED TASKS
“Passing data”
“Coding the LINKAGE SECTION” on page 425
“Coding the PROCEDURE DIVISION for passing arguments” on page 426
“Passing return code information” on page 430
“Specifying CALL . . . RETURNING” on page 431
“Sharing data by using the EXTERNAL clause” on page 431
“Sharing files between programs (external files)” on page 432
Passing data
You can choose among three ways of passing data between programs:
BY REFERENCE
The subprogram refers to and processes the data items in storage of the
calling program rather than working on a copy of the data.
BY CONTENT
The calling program passes only the contents of the literal or identifier. With
a CALL . . . BY CONTENT, the called program cannot change the value of
the literal or identifier in the calling program, even if it modifies the variable
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 in the
called program or invoked method. However, because the subprogram or
method has access only to a temporary copy of the sending data item,
these changes do not affect the argument in the calling program.
Determine which of these three data-passing methods to use based on what you
want your program to do with the data:
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 not supported by IBM.
Storage for arguments is allocated only in the highest outermost program. For
example, program A calls program B, which calls program C. Data items are
allocated in program A and 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.
Do not pass parameters allocated in storage above the 16-MB line to AMODE 24
subprograms. Use the DATA(24) option if the RENT option is in effect, or the
RMODE(24) option if the NORENT option is in effect.
Code the USING phrase after the PROCEDURE DIVISION header to receive the
parameters.
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 CONCEPTS
“Storage and its addressability” on page 33
RELATED TASKS
“Specifying CALL . . . RETURNING” on page 431
“Sharing data by using the EXTERNAL clause” on page 431
“Sharing files between programs (external files)” on page 432
RELATED REFERENCES
CALL statement (Enterprise COBOL Language Reference)
INVOKE statement (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 data-names in the identifier list of 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.
RELATED REFERENCES
The procedure division header (Enterprise COBOL Language Reference)
To make the possibility of mismatched records even smaller, put the level-01 record
into a copy library and copy it in 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 425
To determine the length of a null-terminated string and then display the value of
the string:
Inspect N tallying N-length for characters before initial X’00’
Display ’N: ’ N(1:N-length) ’ Length: ’ N-length
RELATED TASKS
“Manipulating null-terminated strings” on page 91
RELATED REFERENCES
Null-terminated alphanumeric literals (Enterprise COBOL Language Reference)
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 pointer items.
You can assign the value NULL to a pointer data item in 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, the code to check for the end of the list is as follows:
IF PTR-NEXT-REC = NULL
. . .
(logic for end of chain)
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 TASKS
“Coding the LINKAGE SECTION” on page 425
“Coding the PROCEDURE DIVISION for passing arguments” on page 426
RELATED REFERENCES
SET statement (Enterprise COBOL Language Reference)
The first item in each record points to the next record, except for the last record.
The first item in the last record contains a null value instead of an address, to
indicate that it is the last record.
The high-level logic of an application that processes these records might look as
follows:
OBTAIN ADDRESS OF FIRST RECORD IN CHAINED LIST FROM ROUTINE
CHECK FOR END OF THE CHAINED LIST
DO UNTIL END OF THE CHAINED LIST
PROCESS RECORD
GO ON 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)
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, however, 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, using 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:
RELATED TASKS
“Using pointers to process a chained list” on page 427
You can also use the RETURNING phrase on the PROCEDURE DIVISION header in your
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.
You might need to think about this handling of the RETURN-CODE 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, then the
RETURN-CODE special register of the COBOL program might be updated with a
value that is not valid. 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 not valid will be passed back to the system.
For equivalent function between COBOL and C programs, have your COBOL
program call the C program with the RETURNING option. 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 successfully returns to its caller, the value in dataname2 is
stored into the identifier that you specified in the RETURNING phrase of the CALL
statement:
CALL . . . RETURNING dataname2
You must define dataname2 in the DATA DIVISION of the calling COBOL 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 containing the item can access and process the data
item. For example, suppose program A has the following data description:
01 EXT-ITEM1 EXTERNAL PIC 99.
Program B could access that data item by having the identical data description in
its WORKING-STORAGE SECTION.
Remember, any program that has access to an EXTERNAL data item can change its
value. Do not use this clause for data items that you need to protect.
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
Each program in the example declares a data item with the EXTERNAL clause in its
WORKING-STORAGE SECTION. This item is used for checking file status codes and is
also placed using the COPY statement.
Depending on whether you want a DLL load module or a load module that
references a separate DLL, you need to use slightly different compiler and
linkage-editor or binder options.
RELATED CONCEPTS
“Dynamic link libraries (DLLs)”
RELATED TASKS
“Using CALL identifier with DLLs” on page 441
“Using DLL linkage and dynamic calls together” on page 442
“Using COBOL DLLs with C/C++ programs” on page 446
“Using DLLs in OO COBOL applications” on page 446
“Compiling programs to create DLLs” on page 438
“Linking DLLs” on page 439
“Using procedure and function pointers” on page 420
Although some functions of z/OS DLLs overlap the functions provided by COBOL
dynamic CALL statements, DLLs have several advantages over regular z/OS load
modules 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 load modules with
names of up to 160 characters.
RELATED REFERENCES
“PGMNAME” on page 314
Binder support for DLLs (z/OS DFSMS: Program Management)
In an application with DLL support, use the following compiler options depending
on where the programs or classes are:
RELATED TASKS
“Linking DLLs”
“Prelinking certain DLLs” on page 441
Chapter 26, “Creating a DLL or a DLL application” on page 437
RELATED REFERENCES
“DLL” on page 299
“EXPORTALL” on page 301
“RENT” on page 316
Linking DLLs
You can link your DLL-enabled object modules into separate DLL load modules, 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.
Use of the DLL support in the DFSMS binder is recommended for linking DLL
applications. The DFSMS binder can directly receive the output of the COBOL
compilers, thus eliminating the prelink step. However, you must use the Language
| Environment prelinker before standard linkage editing if your DLL must reside in
a PDS load library.
A binder-based DLL must reside in a PDSE or in an HFS file rather than in a PDS.
When linking a DLL application by using the DFSMS binder, use the following
binder options:
You must specify a SYSDEFSD DD statement to indicate the data set where 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 the 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 REFERENCES
Binder support for DLLs (z/OS DFSMS: Program Management)
After compiling your source DLL, prelink the object modules to form a single
object module:
1. Specify a SYSDEFSD DD statement for the prelink step to indicate the data set
where the prelinker should create a DLL definition side file for the DLL. This
side file contains IMPORT prelinker control statements for each symbol exported
by the DLL. The prelinker uses this side file to prelink other modules that
reference the new DLL.
2. Specify the DLLNAME(xxx) prelinker option to indicate the DLL load module
name for the prelinker to use in constructing the IMPORT control statements in
the side file. Alternatively, the prelinker can obtain the DLL load module name
from the NAME prelinker control statement or from the PDS member name in the
SYSMOD DD statement for the prelink step.
3. If this DLL references any other DLLs, include the definition side files for these
DLLs together with the object decks that are input to this prelink step. These
side files instruct the prelinker to resolve the symbolic references in the current
module to the symbols exported from the other DLLs.
Use the linkage editor or binder as usual to create the DLL load module from the
object module produced by the prelinker. Specify the RENT option of the linkage
editor or binder.
RELATED TASKS
“Compiling programs to create DLLs” on page 438
“Linking DLLs” on page 439
For the contents of the identifier or for the literal in the CALL statement, use the
name of either of the following programs:
v A nested program in the same compilation unit as is eligible to be called from
the program containing the CALL identifier statement.
v A program in a separately bound DLL module. The target program name must
be exported from the DLL, and the DLL module name must match the exported
name of the target program.
In the nonnested case, the run-time environment interprets the program name in
the identifier according to the setting of the PGMNAME compiler option of the program
containing the CALL statement, and interprets the program name that is exported
from the target DLL according to the setting of the PGMNAME option used when the
target program was compiled.
The search for the target DLL in the hierarchical file system (HFS) is case sensitive.
If the target DLL is a PDS or PDSE member, then 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.
RELATED TASKS
“Using DLL linkage and dynamic calls together”
“Compiling programs to create DLLs” on page 438
“Linking DLLs” on page 439
RELATED REFERENCES
“DLL” on page 299
“PGMNAME” on page 314
CALL statement (Enterprise COBOL Language Reference)
“Search order for DLLs in HFS”
If the POSIX run-time option is set to ON, the search order is as follows:
1. The run-time environment looks for the DLL in the HFS. If the LIBPATH
environment variable is set, the run time searches each directory listed.
Otherwise, it searches just the current directory. The search for the DLL in the
HFS is case sensitive.
2. If the run-time environment does not find the DLL in the HFS, it tries to load
the DLL from the MVS load library search order of the caller. In this case, the
DLL name must be eight characters or less. The run time automatically
converts the DLL name to uppercase for this search.
If the POSIX run-time option is set to OFF, the search order is reversed:
1. The run-time environment tries to load the DLL from the search order for the
load library of the caller.
2. If the run-time environment cannot load the DLL from this load library, it tries
to load the DLL from the HFS.
RELATED TASKS
“Using CALL identifier with DLLs” on page 441
RELATED REFERENCES
POSIX (Language Environment Programming Reference)
If a program contains a CALL statement for a separately compiled program and you
compile one program with the DLL compiler option and the other program with
NODLL, then the call is supported only if you bind the two programs together in the
same module.
The following diagram shows several separately bound modules that mix dynamic
calls and DLL linkage:
You cannot cancel programs that are called 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.
If you compile with the NODYNAM and DLL options and entry-name is an identifier, the
identifier value must refer to the entry point name that is exported from a DLL
RELATED CONCEPTS
“Dynamic link libraries (DLLs)” on page 437
RELATED TASKS
“Using CALL identifier with DLLs” on page 441
“Using procedure and function pointers” on page 420
“Compiling programs to create DLLs” on page 438
“Linking DLLs” on page 439
RELATED REFERENCES
“DLL” on page 299
“EXPORTALL” on page 301
PROCEDURE DIVISION.
IF DLL-NOT-LOADED
THEN
* Move the names in. They must be null terminated.
MOVE Z’OOC05R’ TO DLL-LOADMOD-NAME
MOVE Z’ooc05r’ TO DLL-PROGRAM-NAME
GOBACK.
#include <stdio.h>
#include <dll.h>
#pragma linkage (A1CCDLGT,COBOL)
In particular, COBOL applications can call functions that are exported from C/C++
DLLs. Similarly, C/C++ applications can call COBOL programs that are exported
from COBOL DLLs.
The COBOL options DLL, RENT, and EXPORTALL work much the same way as the DLL,
RENT, and EXPORTALL options in C/C++. However, the C/C++ compiler produces
DLL-enabled code by default. The DLL option applies only to C.
You can pass a C/C++ DLL function pointer to COBOL and use it within COBOL,
receiving the C/C++ function pointer as a COBOL 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 TASKS
“Compiling programs to create DLLs” on page 438
“Linking DLLs” on page 439
RELATED REFERENCES
“DLL” on page 299
“EXPORTALL” on page 301
“RENT” on page 316
EXTERNAL (Enterprise COBOL Language Reference)
RELATED REFERENCES
“DLL” on page 299
“THREAD” on page 325
“RENT” on page 316
“DBCS” on page 298
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 declare 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”
RELATED TASKS
“Choosing THREAD to support multithreading” on page 451
“Transferring control with multithreading” on page 451
“Processing files with multithreading” on page 452
“Handling COBOL limitations with multithreading” on page 454
RELATED REFERENCES
“THREAD” on page 325
PROGRAM-ID paragraph (Enterprise COBOL Language Reference)
Multithreading
To use COBOL support for multithreading, you need to understand how processes,
threads, run units, and program invocation instances relate to each other.
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
Program Management Model (Language Environment Programming Guide)
Threads (Language Environment Programming Guide)
RELATED TASKS
“Choosing THREAD to support multithreading” on page 451
“Transferring control with multithreading” on page 451
“Processing files with multithreading” on page 452
“Handling COBOL limitations with multithreading” on page 454
In order to run COBOL programs in more than one thread, you must compile all
of the COBOL programs in the run unit with the THREAD option. You must also
compile them with the RENT option and link them with the RENT option of the
binder or linkage editor.
Language restrictions: When you use the THREAD option, you cannot use certain
language elements, as documented in the discussion of the THREAD option.
Recursion: Before you compile a program with the THREAD compiler option, you
must specify the RECURSIVE phrase in the PROGRAM-ID paragraph. If you do not, you
will get an error.
RELATED TASKS
“Sharing data in recursive or multithreaded programs” on page 17
RELATED REFERENCES
“THREAD” on page 325
Ending a program
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
Enclave termination (Language Environment Programming Guide)
RELATED TASKS
“Ending and reentering main programs or subprograms” on page 408
Automatic serialization also occurs for the implicit MOVE that is associated with the
following statements:
WRITE recordname FROM identifier
READ file-name INTO identifier
With other usage patterns, you must take one of the following actions:
v Verify the safety of your application logic. Ensure that two instances of the
program are never simultaneously active on different threads.
v Code explicit serialization logic by using calls to POSIX services.
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
“Closing QSAM files” on page 132
“Closing VSAM files” on page 162
“Coding ERROR declaratives” on page 227
“Calling UNIX/POSIX APIs” on page 400
Example 1
READ F1
. . .
REWRITE R1
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.
Example 2
READ F1
. . .
* Process the data in the FD record description entry for F1
. . .
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 still processing. To avoid this
problem, use the recommended technique of 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.
In general, you must synchronize access to resources that are visible to the
application within a run unit. Exceptions to this requirement are DISPLAY and
ACCEPT, which you can use from multiple threads and supported COBOL file I/O
statements with the recommended usage pattern; all synchronization is provided
by the run-time environment.
CICS: You cannot run multithreaded applications in the CICS environment. You
can run in the CICS environment 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 or linkage editor.
POSIX and PL/I: If you use POSIX threads in your multithreaded application, you
must specify the Language Environment run-time option POSIX(ON). If the
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.
IGZBRDGE, IGZETUN, and IGZEOPT: Do not use IGZBRDGE, the macro for
converting static calls to dynamic calls, with programs that have been compiled
with the THREAD option; this macro is not supported. Do not use the modules
IGZETUN (for storage tuning) or IGZEOPT (for run-time options) for applications
where 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 419
“Processing files with multithreading” on page 452
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 System Services environment.
RELATED TASKS
“Defining a class” on page 462
“Defining a class instance method” on page 467
“Defining a client” on page 475
“Defining a subclass” on page 484
“Defining a factory section” on page 488
Chapter 17, “Compiling, linking, and running OO applications” on page 277
Upgrading IBM COBOL programs (Enterprise COBOL Compiler and Run-Time
Migration Guide)
RELATED REFERENCES
The Java Language Specification
Once you determine the classes that you need, your next step is to determine the
methods that the classes need to do their work. An Account class for example 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.
The following methods for an Account class meet the above needs:
init Open an account and assign it an account number.
getBalance
Return the current balance of the account.
credit Deposit a given sum to the account.
debit Withdraw a given sum from the account.
print Display account number and account balance.
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 would need 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 words in parentheses in the diagrams are the names of the instance data, and
the words following a number and colon are the names of the instance methods.
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 would need, at a minimum, instance
data for payer, payee, and the check amount.
RELATED TASKS
“Defining a class”
“Defining a class instance method” on page 467
“Defining a subclass” on page 484
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:
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 466
“Defining a class instance method” on page 467
“Defining a subclass” on page 484
“Defining a factory section” on page 488
“Describing the computing environment” on page 7
Chapter 17, “Compiling, linking, and running OO applications” on page 277
RELATED REFERENCES
COBOL class definition structure (Enterprise COBOL Language Reference)
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)
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 the REPOSITORY paragraph, you must code an entry for each class-name that you
explicitly reference in the class definition. For example:
v Base
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. 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.
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 506
RELATED REFERENCES
REPOSITORY paragraph (Enterprise COBOL Language Reference)
Identifiers (The Java Language Specification)
Packages (The Java Language Specification)
The external class-name (the name following 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 464
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.
RELATED TASKS
“Creating and initializing instances of classes” on page 482
“Freeing instances of classes” on page 483
“Defining a factory method” on page 489
“Coding attribute (get and set) methods” on page 473
RELATED TASKS
Chapter 17, “Compiling, linking, and running OO applications” on page 277
“Defining a client” on page 475
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 470
“Overloading an instance method” on page 472
“Overriding an instance method” on page 471
“Invoking methods (INVOKE)” on page 480
“Defining a subclass instance method” on page 487
“Defining a factory method” on page 489
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 480
“Using national data (Unicode) in COBOL” on page 105
The INPUT-OUTPUT SECTION relates the file-names used in a method definition to the
corresponding file-names as they are known to the operating system. 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 7
RELATED REFERENCES
INPUT-OUTPUT section (Enterprise COBOL Language Reference)
RELATED TASKS
“Describing the data” on page 12
“Sharing data by using the EXTERNAL clause” on page 431
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 COBOL 85:
– 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.
You must terminate a method definition with an END METHOD marker. For example,
the following statement marks the end of the credit method:
End method “credit”.
RELATED TASKS
“Coding interoperable data types in COBOL and Java” on page 506
“Overriding an instance method”
“Overloading an instance method” on page 472
“Comparing and setting object references” on page 479
“Invoking methods (INVOKE)” on page 480
Chapter 17, “Compiling, linking, and running OO applications” on page 277
RELATED REFERENCES
“THREAD” on page 325
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.
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 instance method and the overridden superclass instance method.
RELATED TASKS
“PROCEDURE DIVISION for defining a class instance method” on page 470
RELATED REFERENCES
Inheritance, overriding, and hiding (The Java Language Specification)
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.
For example, the Account class defines an instance method init that has exactly
one formal parameter. The LINKAGE SECTION and PROCEDURE DIVISION header of the
init method look like this:
Linkage section.
01 inAccountNumber pic S9(9) binary.
Procedure Division using by value inAccountNumber.
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 desired method.
The presence or absence of a method return value does not have to be consistent in
overloaded methods, and the data type of the return value given in the PROCEDURE
DIVISION RETURNING phrase (if any) does not have to be identical in overloaded
methods.
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 REFERENCES
Overloading (The Java Language Specification)
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 466
“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:
Identification Division.
Method-id. “credit”.
Data division.
Linkage section.
01 inCredit pic S9(9) binary.
Procedure Division using by value inCredit.
Add inCredit to AccountBalance.
End method “credit”.
*
* debit method to withdraw from the account:
Identification Division.
Method-id. “debit”.
Data division.
Check class
/**
* A Java class for check information
*/
public class Check {
private CheckingAccount payer;
private Account payee;
private int amount;
RELATED TASKS
Chapter 17, “Compiling, linking, and running OO applications” on page 277
Defining a client
A program or method that requests services from one or more methods in a class
is called a client of that class.
A method can request services from another method. Therefore a COBOL method
can act as a client and use the statements discussed in this section.
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 TASKS
Chapter 17, “Compiling, linking, and running OO applications” on page 277
Chapter 27, “Preparing COBOL programs for multithreading” on page 449
Chapter 29, “Communicating with Java methods” on page 501
“Coding interoperable data types in COBOL and Java” on page 506
“Creating and initializing instances of classes” on page 482
“Comparing and setting object references” on page 479
“Invoking methods (INVOKE)” on page 480
“Invoking factory or static methods” on page 491
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 TASKS
“REPOSITORY paragraph for defining a class” on page 464
RELATED REFERENCES
REPOSITORY paragraph (Enterprise COBOL Language Reference)
Identifiers (The Java Language Specification)
Packages (The Java Language Specification)
Because a client references classes, it needs one or more special data items called
object references, that is, references to instances of the 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 code object references 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 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
Chapter 27, “Preparing COBOL programs for multithreading” on page 449
“Coding interoperable data types in COBOL and Java” on page 506
“Invoking methods (INVOKE)” on page 480
“REPOSITORY paragraph for defining a client” on page 477
RELATED REFERENCES
RETURNING phrase (Enterprise COBOL Language Reference)
You can code a call to the JNI service 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 preceding the call to IsSameObject:
Local-storage Section.
. . .
01 is-same Pic X.
88 is-same-false Value X’00’.
88 is-same-true Value X’01’ Through X’FF’.
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 if 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.
This SET statement causes anotherAccount to refer to the same object instance as
anAccount does. If the receiver (anotherAccount) is a universal object reference, the
sender (anAccount) can be either a universal or a typed object reference. If the
receiver is a typed object reference, the sender must be a typed object reference
bound to the same class as the receiver or to one of its subclasses.
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 506
“Accessing JNI services” on page 501
In a COBOL client, you can invoke methods defined in Java or COBOL classes by
coding the INVOKE statement. For example:
Invoke Account “createAccount”
using by value 123456
returning anAccount
Invoke anAccount “credit” using by value 500.
The first statement uses the class-name Account to invoke a method called
createAccount, which must be either a Java static method or a COBOL factory
method supported (that is, either defined or inherited) in the Account class. using
by value 123456 indicates that 123456 is an input argument to the method, passed
by value. 123456 and 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 defined in the Account class. The input
argument 500 must conform to the definition of the formal parameters of the
(possibly overloaded) credit method.
For example, when you code an INVOKE statement using an object reference (as in
the second statement above), the statement begins with one of the following two
forms:
Invoke objRef “literal-name” . . .
Invoke objRef identifier-name . . .
When the method-name is an identifier, you must define the object reference
(objRef) as USAGE OBJECT REFERENCE with no specified type, that is, as a universal
object reference.
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 of 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.
The item that you specify in the RETURNING phrase of the INVOKE statement must
conform to the type returned by the target method:
v If the target method is implemented in COBOL and the returned item is not an
object reference, code the DATA DIVISION definition of the returned item exactly
like the definition of the RETURNING item in the target method.
v If the target method is implemented in Java, code the DATA DIVISION definition
of the returned item to be interoperable with the returned Java data item.
v If the returned item is an object reference, code the DATA DIVISION definition of
the returned item as an object reference typed to the same class as the object
reference 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
“Overloading an instance method” on page 472
“Coding interoperable data types in COBOL and Java” on page 506
“PROCEDURE DIVISION for defining a class instance method” on page 470
“Invoking overridden superclass methods”
“Invoking factory or static methods” on page 491
“Using national data (Unicode) in COBOL” on page 105
RELATED REFERENCES
INVOKE statement (Enterprise COBOL Language Reference)
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”.
RELATED TASKS
“Overriding an instance method” on page 471
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 (for example, if you use it as the method return value), 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.
To obtain addressability to the NewGlobalRef service, code the statement COPY JNI
in the LINKAGE SECTION of the method, and code these two statements in the
PROCEDURE DIVISION of the method before the call to NewGlobalRef:
Set address of JNIEnv to JNIEnvPtr
Set address of JNINativeInterface to JNIEnv
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
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
Then to create an instance of the COBOL class and properly initialize it, the client
invokes the parameterized factory method, passing BY VALUE the desired
arguments.
RELATED TASKS
“Accessing JNI services” on page 501
“Managing local and global references” on page 504
“DATA DIVISION for defining a client” on page 478
“Invoking methods (INVOKE)” on page 480
“Defining a factory section” on page 488
“Coding interoperable data types in COBOL and Java” on page 506
RELATED REFERENCES
VALUE clause (Enterprise COBOL Language Reference)
INVOKE statement (Enterprise COBOL Language Reference)
The Java run-time system automatically performs garbage collection, that is, it
reclaims the memory for objects that are no longer in use.
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
“Defining a factory method” on page 489
“Invoking factory or static methods” on page 491
Chapter 17, “Compiling, linking, and running OO applications” on page 277
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
The structure and syntax of a subclass definition are identical to those of a class
definition: Define instance data and methods in the DATA DIVISION and PROCEDURE
DIVISION, respectively, within the OBJECT paragraph of the subclass definition. In
subclasses that require data and methods that are to be associated with the
subclass itself rather than with individual object instances, define a separate DATA
DIVISION and PROCEDURE DIVISION within the FACTORY paragraph of the subclass
definition.
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 462
“Overriding an instance method” on page 471
“Coding attribute (get and set) methods” on page 473
“Defining a subclass instance method” on page 487
“Defining a factory section” on page 488
RELATED REFERENCES
Inheritance, overriding, and hiding (The Java Language Specification)
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
RELATED TASKS
“CLASS-ID paragraph for defining a class” on page 464
“Coding attribute (get and set) methods” on page 473
“REPOSITORY paragraph for defining a subclass”
The REPOSITORY paragraph entries indicate that the external class-names of the
classes referred to as CheckingAccount, Check, and Account within the subclass
definition are CheckingAccount, Check, and Account, respectively.
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 464
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.
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.
RELATED TASKS
“Defining a class instance method” on page 467
“Overriding an instance method” on page 471
“Overloading an instance method” on page 472
RELATED TASKS
Chapter 17, “Compiling, linking, and running OO applications” on page 277
“Invoking methods (INVOKE)” on page 480
“Overriding an instance method” on page 471
“Invoking overridden superclass methods” on page 481
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 462
“Creating and initializing instances of classes” on page 482
“Defining a factory method”
“Wrapping procedure-oriented COBOL programs” on page 497
“Structuring OO applications” on page 498
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 473
“Creating and initializing instances of classes” on page 482
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
| to enable you to run an OO application by using the java command, and to
| structure your applications in keeping with standard Java practice. See the related
| tasks for details.
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:
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 desired 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 498
“Wrapping procedure-oriented COBOL programs” on page 497
“Creating and initializing instances of classes” on page 482
“Defining a class instance method” on page 467
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 506
“Overriding an instance method” on page 471
“Invoking methods (INVOKE)” on page 480
RELATED REFERENCES
Inheritance, overriding, and hiding (The Java Language Specification)
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.
RELATED TASKS
“Invoking methods (INVOKE)” on page 480
“Using national data (Unicode) in COBOL” on page 105
“Coding interoperable data types in COBOL and Java” on page 506
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 HFS; 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),lib
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.
*
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 482
“Defining a factory method” on page 489
“Invoking factory or static methods” on page 491
Chapter 17, “Compiling, linking, and running OO applications” on page 277
Factory methods provide a convenient means for writing wrappers for existing
procedural COBOL code to make it accessible from Java programs.
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 462
“Defining a factory section” on page 488
“Defining a factory method” on page 489
“Examples: COBOL applications that you can run using the java command”
RELATED TASKS
Chapter 17, “Compiling, linking, and running OO applications” on page 277
“Defining a factory method” on page 489
“Declaring arrays and strings for Java” on page 506
Chapter 22, “Developing COBOL programs for IMS” on page 391
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.
| *
RELATED TASKS
Chapter 17, “Compiling, linking, and running OO applications” on page 277
“Defining a factory method” on page 489
Chapter 29, “Communicating with Java methods” on page 501
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
“Using national data (Unicode) in COBOL” on page 105
“Accessing JNI services”
“Sharing data with Java” on page 505
Chapter 28, “Writing object-oriented programs” on page 459
Chapter 17, “Compiling, linking, and running OO applications” on page 277
Chapter 27, “Preparing COBOL programs for multithreading” on page 449
RELATED REFERENCES
The Java 2 Enterprise Edition Developer’s Guide
You obtain the JNI environment structure by two levels of indirection from the JNI
environment pointer, as this illustration shows:
Before you reference the contents of the JNI environment structure, you must code
the following statements to establish its addressability:
Linkage section.
COPY JNI
. . .
Procedure division.
. . .
Set address of JNIEnv to JNIEnvPtr
Set address of JNINativeInterface to JNIEnv
. . .
After you code the above statements, 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 this example:
01 InputArrayObj usage object reference jlongArray.
01 ArrayLen pic S9(9) comp-5.
. . .
Call GetArrayLength using by value JNIEnvPtr InputArrayObj
returning ArrayLen
RELATED TASKS
“Managing local and global references” on page 504
“Handling Java exceptions”
“Defining a client” on page 475
RELATED REFERENCES
Appendix F, “JNI.cpy” on page 625
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.
To do error analysis, use the methods supported by the exception object that is
returned. This object is an instance of java.lang.Throwable.
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 global references as RETURNING values. Do not
return local references to objects that you created in the method; they become
invalid upon return. First convert the reference to a global reference, then return
that global reference.
Local references are valid only in the thread in which you create them. Do not pass
them from one thread to another.
Save local references only in object references that you define in the LOCAL-STORAGE
SECTION of a method. If you want to save a local reference with a SET statement to
an object instance variable, a factory variable, or a variable in the WORKING-STORAGE
SECTION of a method, first convert the local reference to a global reference.
Otherwise, you will get an error because these storage areas persist when the
method returns, but the local reference is no longer valid.
In most cases you can rely on the automatic freeing of local references that occurs
when a method returns. However, in some cases you should explicitly free a local
reference within a method by using the JNI service DeleteLocalRef. Here are two
situations where explicit freeing is appropriate:
v In a method you access a large object, thereby creating a local reference to the
object. After extensive computations, the method returns. You should free the
large object if you do not need it for the additional computations, because the
local reference prevents the object from being released during garbage collection.
v You create a large number of local references in a method but do not use all of
them at the same time. Because the Java virtual machine requires space to keep
track of each local reference, you should free those that you no longer need to
avoid causing the system to run out of memory.
JNI services
Use these callable services to manage local references and global references:
To pass or receive a group data structure, create a Java Record class to represent
the structure and pass or receive object instances of the class. You can use the
Enterprise Access Builder of IBM VisualAge for Java Enterprise Edition to create
Record classes.
RELATED TASKS
“Coding interoperable data types in COBOL and Java” on page 506
“Declaring arrays and strings for Java” on page 506
“Manipulating Java arrays” on page 507
“Manipulating Java strings” on page 510
“Invoking methods (INVOKE)” on page 480
Chapter 25, “Sharing data” on page 423
1. You must distinguish boolean from byte, because they both correspond to PIC X. PIC X
is interpreted as boolean only when you define an argument or a parameter with the
two condition names shown in the table. Otherwise, your PIC X data item is interpreted
as the Java byte type.
2. Java floating-point data is represented in IEEE floating point; Enterprise COBOL 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.
When you use these special classes for array and string interoperability with Java,
you must code an entry for the classes that you use in the REPOSITORY paragraph,
such as in this example:
| The REPOSITORY paragraph entry for an object array type must specify an external
| class-name of one of the following forms:
| “jobjectArray”
| “jobjectArray:external-classname-2”
| In the first case, the REPOSITORY entry specifies an array class where the elements of
| the array are objects of type java.lang.Object.
| In the second case, the REPOSITORY entry specifies an array class where the
| elements of the array are objects of type external-classname-2. A colon is required as
| a separator between the specification of the jobjectArray type and the external
| class-name of the elements of the array.
“Examples: COBOL applications that you can run using the java command” on
page 498
The following Java array types are currently not supported for interoperation with
COBOL programs:
RELATED TASKS
“REPOSITORY paragraph for defining a class” on page 464
To operate on objects of the special Java-array classes, call the services that JNI
provides. You can use services to access and set individual elements of an array
and for the following purposes, using the services cited:
“Examples: COBOL applications that you can run using the java command” on
page 498
“Example: processing a Java int array”
RELATED TASKS
“Coding interoperable data types in COBOL and Java” on page 506
“Declaring arrays and strings for Java” on page 506
“Accessing JNI services” on page 501
Call ReleaseIntArrayElements
using by value JNIEnvPtr inIntArrayObj intArrayPtr 0.
End method “ProcessArray”.
End Object.
End class OOARRAY.
Access these services by using function pointers in the JNI environment structure
JNINativeInterface.
1. If the pointer is null, the encoding from the Java file.encoding property is used.
The EBCDIC services are packaged as a DLL that is part of the IBM Developer Kit
for OS/390, Java 2 Technology Edition. Use CALL literal statements to call these
services. The calls are resolved via 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 given in full in “Example: J2EE client written in COBOL” on page 512.)
Move z“MyConverter” to stringBuf
Call “NewStringPlatform”
using by value JNIEnvPtr
address of stringBuf
address of jstring1
0
returning rc
For details of these services, see jni_convert.h, which is shipped with the IBM
Developer Kit for OS/390, Java 2 Technology Edition.
Access these services by using function pointers in the JNI environment structure
JNINativeInterface.
RELATED TASKS
“Accessing JNI services” on page 501
“Coding interoperable data types in COBOL and Java” on page 506
“Declaring arrays and strings for Java” on page 506
“Using national data (Unicode) in COBOL” on page 105
Chapter 17, “Compiling, linking, and running OO applications” on page 277
*****************************************************************
* Create JNDI naming context. *
*****************************************************************
Invoke InitialContext New returning initialCtx
Perform JavaExceptionCheck
*****************************************************************
* Create a jstring object for the string “MyConverter” for use *
* as argument to the lookup method. *
*****************************************************************
Move z“MyConverter” to stringBuf
Call “NewStringPlatform”
using by value JNIEnvPtr
address of stringBuf
address of jstring1
0
returning rc
If rc not = zero then
Display “Error occurred creating jstring object”
Stop run
End-if
*****************************************************************
* 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”
*****************************************************************
* 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
Perform JavaExceptionCheck
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 17, “Compiling, linking, and running OO applications” on page 277
WebSphere for z/OS: Assembling J2EE Applications
RELATED REFERENCES
The Java 2 Enterprise Edition Developer’s Guide
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 load module containing your
program. While your program is running, the checkpoint routine creates records at
points 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 522
“Resubmitting jobs for restart” on page 525
z/OS DFSMS: Checkpoint/Restart
RELATED REFERENCES
“DD statements for defining checkpoint data sets” on page 521
“Messages generated during checkpoint” on page 522
“Formats for requesting deferred restart” on page 524
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 onto 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.
Restriction: A checkpoint data set must have sequential organization. You cannot
write checkpoints on VSAM data sets or on data sets 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 open.
You must use the multiple checkpoint method for complete compliance to the
COBOL 85 Standard.
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 using disk files, design the program so that you can identify
previously processed records. For example, consider a disk file containing 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 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 TASKS
“Using checkpoint/restart with DFSORT” on page 196
RELATED REFERENCES
“DD statements for defining checkpoint data sets” on page 521
Return codes (z/OS DFSMS: Checkpoint/Restart)
For tape:
//ddname DD DSNAME=data-set-name,
// [VOLUME=SER=volser,]UNIT=device-type,
// DISP=({NEW|MOD},PASS)
checkid is the identification name of the checkpoint taken. The control program
assigns checkid as an eight-character string. The first character is the letter C,
followed by a decimal number indicating the checkpoint. For example, the
following message indicates the fourth checkpoint taken in the job step:
checkid C0000004
Restarting programs
The system restart routine does the following:
v Retrieves the information recorded in a checkpoint record
v Restores the contents of main storage and all registers
v 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 on their DD statements are handled
in various ways depending on the type of restart.
If the checkpoint data set is multivolume, include in the VOLUME parameter the
sequence number of the volume on which the checkpoint entry was written. If the
checkpoint data set is on a 7-track tape with nonstandard labels or no labels, the
SYSCHK DD statement must contain DCB=(TRTCH=C,. . .).
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 has been 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
SYSCHK DD statement is ignored. If a RESTART parameter without the CHECKID
subparameter is included in a job, a SYSCHK DD statement must not appear before
the first EXEC statement for the job.
RELATED TASKS
“Using checkpoint/restart with DFSORT” on page 196
checkid
Identifies the checkpoint where restart is to occur.
SYSCHK
The ddname used to identify a checkpoint data set to the control program.
The SYSCHK DD statement must immediately precede the first EXEC
statement of the resubmitted job, and must follow any JOBLIB statement.
data-set-name
Identifies the checkpoint data set. It must be the same name that
was used when the checkpoint was taken.
device-type and volser
Identify the device type and the serial number of the volume
containing the checkpoint data set.
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.
//J3412 JOB 386,SMITH,MSGLEVEL=1,RD=R,
// RESTART=(*,C0000002)
//SYSCHK DD DSNAME=C91468,DISP=OLD
//S1 EXEC PGM=MYPROG
//INDATA DD DSNAME=INVENT,UNIT=TAPE,DISP=OLD,
// VOLUME=SER=91468,LABEL=RETPD=14
//REPORT DD SYSOUT=A
//WORK DD DSNAME=T91468,DISP=(,,KEEP),
// UNIT=SYSDA,SPACE=(3000,(5000,500)),
// VOLUME=(PRIVATE,RETAIN,,6)
//DDCKPNT DD UNIT=TAPE,DISP=(MOD,KEEP,CATLG),
// DSNAME=C91468,LABEL=(,NL)
You can use certain programming techniques to take advantage of date processing
and control the effects of using date fields such as when comparing dates, sorting
and merging by date, and performing arithmetic operations involving dates. The
millennium language extensions support year-first, year-only, and year-last date
fields for the most common operations on date fields: comparisons, moving and
storing, and incrementing and decrementing.
RELATED CONCEPTS
“Millennium language extensions (MLE)” on page 528
RELATED TASKS
“Resolving date-related logic problems” on page 529
“Using year-first, year-only, and year-last date fields” on page 534
“Manipulating literals as dates” on page 537
“Setting triggers and limits” on page 539
“Sorting and merging by date” on page 541
“Performing arithmetic on date fields” on page 543
“Controlling date processing explicitly” on page 545
“Analyzing and avoiding date-related diagnostic messages” on page 546
“Avoiding problems in processing dates” on page 548
RELATED REFERENCES
DATE FORMAT clause (Enterprise COBOL Language Reference)
“DATEPROC” on page 297
“YEARWINDOW” on page 331
RELATED CONCEPTS
“Principles and objectives of these extensions”
RELATED REFERENCES
“DATEPROC” on page 297
“YEARWINDOW” on page 331
The extensions do not provide fully specified or complete date-oriented data types,
with semantics that recognize, for example, the month and day parts of Gregorian
dates. They do, however, provide special semantics for the year part of dates.
You can use the millennium language extensions with each approach to achieve a
solution, but each has advantages and disadvantages, as shown below.
RELATED TASKS
“Using a century window”
“Using internal bridging” on page 531
“Moving to full field expansion” on page 532
To implement this century window, you use the DATE FORMAT clause to identify the
date fields in your program and use the YEARWINDOW compiler option to define the
century window as either a fixed window or a sliding window:
v For a fixed window, specify a four-digit year between 1900 and 1999 as the
YEARWINDOW option value. For example, YEARWINDOW(1950) defines a fixed window
of 1950-2049.
v For a sliding window, specify a negative integer from -1 through -99 as the
YEARWINDOW option value. For example, YEARWINDOW(-48) defines a sliding
window that starts 48 years before the year that the program is running. So if
The compiler then automatically applies the century window to operations on the
date fields that you have identified. You do not need any extra program logic to
implement the windowing.
In this example, there are no changes to the PROCEDURE DIVISION. The addition of
the DATE FORMAT clause on the two date fields means that the compiler recognizes
them as windowed date fields, and therefore applies the century window when
processing the IF statement. For example, if Date-Due-Back contains 000102
(January 2, 2000) and Date-Returned contains 991231 (December 31, 1999),
Date-Returned is less than (earlier than) Date-Due-Back, so the program does not
perform the Fine-Member paragraph.
When you use this technique, your changes to the program logic are minimal. You
simply add statements to expand and contract the dates, and change the
statements that refer to dates to use the four-digit-year date fields in
WORKING-STORAGE instead of the two-digit-year fields in the records.
Because you are converting the dates back to two-digit years for output, you
should allow for the possibility that the year is outside the century window. For
example, if a date field contains the year 2020, but the century window is
1920-2019, then the date is outside the window, and simply moving it to a
two-digit-year field will be incorrect. To protect against this problem, you can use a
RELATED TASKS
“Using a century window” on page 530
“Performing arithmetic on date fields” on page 543
“Moving to full field expansion”
After you have completed the first two steps, you can repeat the remaining steps
any number of times. You do not need to change every date field in every file at
the same time. Using this method, you can select files for progressive conversion
based on criteria such as business needs or interfaces with other applications.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUT-FILE
ASSIGN TO INFILE
FILE STATUS IS INPUT-FILE-STATUS.
SELECT OUTPUT-FILE
ASSIGN TO OUTFILE
FILE STATUS IS OUTPUT-FILE-STATUS.
DATA DIVISION.
FILE SECTION.
FD INPUT-FILE
RECORDING MODE IS F.
01 INPUT-RECORD.
03 CUST-NAME.
05 FIRST-NAME PIC X(10).
05 LAST-NAME PIC X(15).
03 ACCOUNT-NUM PIC 9(8).
03 DUE-DATE PIC X(6) DATE FORMAT YYXXXX. (1)
03 REMINDER-DATE PIC X(6) DATE FORMAT YYXXXX.
03 DUE-AMOUNT PIC S9(5)V99 COMP-3.
FD OUTPUT-FILE
RECORDING MODE IS F.
01 OUTPUT-RECORD.
03 CUST-NAME.
05 FIRST-NAME PIC X(10).
05 LAST-NAME PIC X(15).
03 ACCOUNT-NUM PIC 9(8).
03 DUE-DATE PIC X(8) DATE FORMAT YYYYXXXX. (2)
03 REMINDER-DATE PIC X(8) DATE FORMAT YYYYXXXX.
03 DUE-AMOUNT PIC S9(5)V99 COMP-3.
WORKING-STORAGE SECTION.
PROCEDURE DIVISION.
GO TO READ-RECORD.
CLOSE-FILES.
CLOSE INPUT-FILE.
CLOSE OUTPUT-FILE.
EXIT PROGRAM.
Notes
(1) The fields DUE-DATE and REMINDER-DATE in the input record are both
Gregorian dates with two-digit-year components. They are defined with a
DATE FORMAT clause in this program so that the compiler will recognize
them as windowed date fields.
(2) The output record contains the same two fields in expanded date format.
They are defined with a DATE FORMAT clause so that the compiler will treat
them as four-digit-year date fields.
(3) The MOVE CORRESPONDING statement moves each item in INPUT-RECORD
individually to its matching item in OUTPUT-RECORD. When the two
windowed date fields are moved to the corresponding expanded date
fields, the compiler will expand the year values using the current century
window.
A year-last date field is a date field whose DATE FORMAT clause specifies one or more
Xs preceding the YY or YYYY. Such date formats are commonly used to display
dates, but are less useful computationally, because the year, which is the most
significant part of the date, is in the least significant position of the date
representation.
If you need more general date-processing capability for year-last dates, you should
isolate and operate on the year part of the date.
RELATED CONCEPTS
“Compatible dates”
RELATED TASKS
“Sorting and merging by date” on page 541
“Using other date formats” on page 536
Compatible dates
The meaning of the term compatible dates depends on the COBOL division in which
the usage occurs, as follows:
v The DATA DIVISION usage deals with the declaration of date fields, and the rules
governing COBOL language elements such as subordinate data items and the
REDEFINES clause. In the following example, Review-Date and Review-Year are
compatible because Review-Year can be declared as a subordinate data item to
Review-Date:
01 Review-Record.
03 Review-Date Date Format yyxxxx.
05 Review-Year Pic XX Date Format yy.
05 Review-M-D Pic XXXX.
v The PROCEDURE DIVISION usage deals with how date fields can be used together
in operations such as comparisons, moves, and arithmetic expressions. For
year-first and year-only date fields, to be considered compatible, date fields must
have the same number of nonyear characters. For example, a field with DATE
FORMAT YYXXXX is compatible with another field that has the same date format,
and with a YYYYXXXX field, but not with a YYXXX field.
Year-last date fields must have identical DATE FORMAT clauses. In particular,
operations between windowed date fields and expanded year-last date fields are
not allowed. For example, you can move a date field with a date format of
XXXXYY to another XXXXYY date field, but not to a date field with a format of
XXXXYYYY.
You can perform operations on date fields, or on a combination of date fields and
nondates, provided that the date fields in the operation are compatible. For
example, assume the following definitions:
01 Date-Gregorian-Win Pic 9(6) Packed-Decimal Date Format yyxxxx.
01 Date-Julian-Win Pic 9(5) Packed-Decimal Date Format yyxxx.
01 Date-Gregorian-Exp Pic 9(8) Packed-Decimal Date Format yyyyxxxx.
The following statement is accepted because the number of nonyear digits is the
same for both fields:
If Date-Gregorian-Win Less than Date-Gregorian-Exp . . .
In this case the century window is applied to the windowed date field
(Date-Gregorian-Win) to ensure that the comparison is meaningful.
When a nondate is used in conjunction with a date field, the nondate either is
assumed to be compatible with the date field or is treated as a simple numeric
value.
If there are date fields in your application that do not fit these criteria, you might
have to make some code changes to define just the year part of the date as a date
field with the DATE FORMAT clause. Some examples of these types of date formats
are:
v A seven-character field consisting of a two-digit year, three characters containing
an abbreviation of the month and two digits for the day of the month. This
format is not supported because date fields can have only one through four
nonyear characters.
v A Gregorian date of the form DDMMYY. Automatic windowing is not provided
because the year component is not the first part of the date. Year-last dates such
as these are fully supported as windowed keys in SORT or MERGE statements, and
are also supported in a limited number of other COBOL operations.
If you need to use date windowing in cases like these, you will need to add some
code to isolate the year portion of the date.
Because the year is not the first part of these date fields, the DATE FORMAT clause
cannot be applied without some code to isolate the year component. In the next
The literal 051220 is treated as a nondate, and therefore it is windowed against the
assumed century window of 1900-1999 to represent December 20, 1905. But where
the same literal is specified in the VALUE clause of an 88-level condition-name, the
literal becomes part of the data item to which it is attached. Because this data item
is a windowed date field, the century window is applied whenever it is referenced.
You can also use the DATEVAL intrinsic function in a comparison expression to
convert a literal to a date field, and the output from the intrinsic function will then
be treated as either a windowed date field or an expanded date field to ensure a
consistent comparison. For example, using the above definitions, both of these
conditions evaluate to true:
If Date-Due = Function DATEVAL (051220 “YYXXXX”)
If Date-Due = Function DATEVAL (20051220 “YYYYXXXX”)
With a level-88 condition-name, you can specify the THRU option on the VALUE
clause, but you must specify a fixed century window on the YEARWINDOW compiler
option rather than a sliding window. For example:
05 Year-Field Pic 99 Date Format yy.
88 In-Range Value 98 Thru 06.
With this form, the windowed value of the second item must be greater than the
windowed value of the first item. However, the compiler can verify this difference
only if the YEARWINDOW compiler option specifies a fixed century window (for
example, YEARWINDOW(1940) rather than YEARWINDOW(-60).
The windowed order requirement does not apply to year-last date fields. If you
specify a condition-name VALUE clause with the THROUGH phrase for a year-last date
field, the two literals must follow normal COBOL rules. That is, the first literal
must be less than the second literal.
RELATED TASKS
“Controlling date processing explicitly” on page 545
The assumed century window is 1900-1999, which is typically not the same as the
century window for the compilation unit.
In many cases, particularly for literal nondates, this assumed century window is
the correct choice. In the following construct, the literal should retain its original
meaning of January 1, 1972, and not change to 2072 if the century window is, for
example, 1975-2074:
01 Manufacturing-Record.
03 Makers-Date Pic X(6) Date Format yyxxxx.
. . .
If Makers-Date Greater than “720101” . . .
Even if the assumption is correct, it is better to make the year explicit and
eliminate the warning-level diagnostic message (which results from applying the
assumed century window) by using the DATEVAL intrinsic function:
If Makers-Date Greater than
Function Dateval(“19720101” “YYYYXXXX”) . . .
In some cases, the assumption might not be correct. For the following example,
assume that Project-Controls is in a copy member that is used by other
applications that have not yet been upgraded for year 2000 processing, and
therefore Date-Target cannot have a DATE FORMAT clause:
01 Project-Controls.
03 Date-Target Pic 9(6).
. . .
01 Progress-Record.
03 Date-Complete Pic 9(6) Date Format yyxxxx.
. . .
If Date-Complete Less than Date-Target . . .
In the example, the following three conditions need to be true to make the
Date-Complete earlier than (less than) Date-Target:
v The century window is 1910-2009.
v Date-Complete is 991202 (Gregorian date: December 2, 1999).
v Date-Target is 000115 (Gregorian date: January 15, 2000).
However, because Date-Target does not have a DATE FORMAT clause, it is a nondate.
Therefore, the century window applied to it is the assumed century window of
1900-1999, and it is processed as January 15, 1900. So Date-Complete will be greater
than Date-Target, which is not the desired result.
RELATED TASKS
“Controlling date processing explicitly” on page 545
Treatment of nondates
The simplest kind of nondate is a literal value. The following items are also
nondates:
v A data item whose data description does not include a DATE FORMAT clause.
v The results (intermediate or final) of some arithmetic expressions. For example,
the difference of two date fields is a nondate, whereas the sum of a date field
and a nondate is a date field.
v The output from the UNDATE intrinsic function.
When you use a nondate in conjunction with a date field, the compiler interprets
the nondate either as a date whose format is compatible with the date field or as a
simple numeric value. This interpretation depends on the context in which the date
field and nondate are used, as follows:
v Comparison
When a date field is compared with a nondate, the nondate is considered to be
compatible with the date field in the number of year and nonyear characters. In
the following example, the nondate literal 971231 is compared with a windowed
date field:
01 Date-1 Pic 9(6) Date Format yyxxxx.
. . .
If Date-1 Greater than 971231 . . .
The nondate literal 971231 is treated as if it had the same DATE FORMAT as Date-1,
but with a base year of 1900.
v Arithmetic operations
In all supported arithmetic operations, nondate fields are treated as simple
numeric values. In the following example, the numeric value 10000 is added to
the Gregorian date in Date-2, effectively adding one year to the date:
01 Date-2 Pic 9(6) Date Format yyxxxx.
. . .
Add 10000 to Date-2.
v MOVE statement
Moving a date field to a nondate is not supported. However, you can use the
UNDATE intrinsic function to do this.
When you move a nondate to a date field, the sending field is assumed to be
compatible with the receiving field in the number of year and nonyear
characters. For example, when you move a nondate to a windowed date field,
the nondate field is assumed to contain a compatible date with a two-digit year.
The difference between a trigger and a limit is not in the particular value, but in
the way it is used. You can use any of the special values as either a trigger or a
limit.
When used as triggers, special values can indicate a specific condition such as
“date not initialized” or “account past due.” When used as limits, special values
are intended to act as dates earlier or later than any valid date. LOW-VALUE, SPACE
and zeros are lower limits; HIGH-VALUE and nines are upper limits.
You activate trigger and limit support by specifying the TRIG suboption of the
DATEPROC compiler option. If the DATEPROC(TRIG) compiler option is in effect,
automatic expansion of windowed date fields (before their use as operands in
comparisons, arithmetic, and so on) is sensitive to these special values.
When an actual or assumed windowed date field contains a trigger, the compiler
expands the trigger as if the trigger value were propagated to the century part of
the expanded date result, rather than inferring 19 or 20 as the century value as in
normal windowing. In this way, your application can test for special values or use
them as upper or lower date limits. Specifying DATEPROC(TRIG) also enables SORT
and MERGE statement support of the DFSORT special indicators, which correspond
to triggers and limits.
RELATED TASKS
“Using sign conditions” on page 541
Because both dates are windowed, the first subscription is tested as if 20000104
were compared with 19991231, and so the test succeeds. However, when the
compiler detects the special value, it uses trigger expansion instead of windowing.
Therefore, the test proceeds as if 20000104 were compared with 99999999, and it
fails and will always fail.
However, if you are compiling with the NOTRIG suboption of the DATEPROC compiler
option, this comparison is not valid because the literal value Zero is a nondate, and
is therefore windowed against the assumed century window to give a value of
1900000.
With a sign condition, Order-Date is treated as a nondate, and the century window
is not considered.
This approach applies only if the operand in the sign condition is a simple
identifier rather than an arithmetic expression. If an expression is specified, the
expression is evaluated first, with the century window being applied where
appropriate. The sign condition is then compared with the results of the
expression.
You could use the UNDATE intrinsic function instead or the TRIG suboption of the
DATEPROC compiler option to achieve the same result.
RELATED CONCEPTS
“Treatment of nondates” on page 539
RELATED TASKS
“Setting triggers and limits” on page 539
“Controlling date processing explicitly” on page 545
If your sort product also supports the date field identifiers Y2T, Y2U, Y2W, Y2X, and
Y2Y, you can use the TRIG suboption of the DATEPROC compiler option. (Support for
these date field identifiers was added to DFSORT through APAR PQ19684.)
The special indicators that DFSORT recognizes match exactly those supported by
COBOL: LOW-VALUE, HIGH-VALUE, and SPACE for alphanumeric date or year fields,
and all zeros and all nines for numeric and alphanumeric date fields with at least
one nonyear digit.
RELATED TASKS
OPTION control statement (Y2PAST) (DFSORT Application Programming Guide)
RELATED REFERENCES
“DATEPROC” on page 297
“YEARWINDOW” on page 331
01 Transaction-Record.
05 Trans-Account PIC 9(8).
05 Trans-Type PIC X.
05 Trans-Date PIC 9(5) Date Format yyxxx.
05 Trans-Time PIC 9(6).
05 Trans-Amount PIC 9(7)V99.
. . .
Sort Transaction-File
On Ascending Key Trans-Account
Trans-Date
Trans-Time
Using Input-File
Giving Sorted-File.
COBOL passes the relevant information to DFSORT for it to perform the sort. In
addition to the information COBOL always passes to DFSORT, COBOL also passes
the following information:
v Century window as the Y2PAST sort option
v Windowed year field and date format of Trans-Date.
Date semantics are provided for the year parts of date fields but not for the
nonyear parts. For example, adding 1 to a windowed Gregorian date field that
contains the value 980831 gives a result of 980832, not 980901.
If the century window is 1910-2009, and the value of Last-Review-Year is 98, then
the computation proceeds as if Last-Review-Year is first incremented by 1900 to
give 1998. Then the ADD operation is performed, giving a result of 2008. This result
is stored in Next-Review-Year as 08.
This result falls outside the range of the century window. If the result is stored in
Next-Review-Year, it will be incorrect because later references to Next-Review-Year
will interpret it as 1918. In this case, the result of the operation depends on
whether the ON SIZE ERROR phrase is specified on the ADD statement:
v If SIZE ERROR is specified, the receiving field is not changed, and the SIZE ERROR
imperative statement is executed.
v If SIZE ERROR is not specified, the result is stored in the receiving field with the
left-hand digits truncated.
SIZE ERROR processing for windowed date receivers recognizes any year value that
falls outside the century window. That is, a year value less than the starting year of
the century window raises the SIZE ERROR condition, as does a year value greater
than the ending year of the century window.
However, the addition of two date fields is not permitted. To resolve these date
fields, you should use parentheses to isolate the parts of the arithmetic expression
that are allowed. For example:
Compute End-Year-2 = Start-Year-2 + (End-Year-1 - Start-Year-1).
The subtraction of one date field from another is permitted and gives a nondate
result. This nondate result is then added to the date field End-Year-1, giving a date
field result that is stored in End-Year-2.
RELATED TASKS
“Using internal bridging” on page 531
Conversely, there might be times when you want a date field to be treated as a
nondate in specific parts of the program.
Using DATEVAL
You can use the DATEVAL intrinsic function to convert a nondate to a date field, so
that COBOL will apply the relevant date processing to the field. The first argument
in the function is the nondate to be converted, and the second argument specifies
the date format. The second argument is a literal string with a specification similar
to that of the date pattern in the DATE FORMAT clause.
In most cases, the compiler makes the correct assumption about the interpretation
of a nondate, but accompanies this assumption with a warning-level diagnostic
message. This message typically happens when a windowed date is compared
with a literal:
03 When-Made Pic x(6) Date Format yyxxxx.
. . .
If When-Made = “850701” Perform Warranty-Check.
Using UNDATE
The UNDATE intrinsic function converts a date field to a nondate, so that it can be
referenced without any date processing.
Attention: Avoid using UNDATE except as a last resort, because the compiler will
lose the flow of date fields in your program. This problem could result in date
comparisons not being windowed properly. Use more DATE FORMAT clauses instead
of function UNDATE for MOVE and COMPUTE.
Example: DATEVAL
Assume that a program contains a field Date-Copied and that this field is
referenced many times in the program, but that most of these references move it
between records or reformat it for printing. Only one reference relies on it to
contain a date, for comparison with another date.
In this case, it is better to leave the field as a nondate, and use the DATEVAL intrinsic
function in the comparison statement. For example:
03 Date-Distributed Pic 9(6) Date Format yyxxxx.
03 Date-Copied Pic 9(6).
. . .
If FUNCTION DATEVAL(Date-Copied “YYXXXX”) Less than
Date-Distributed . . .
In this example, the DATEVAL intrinsic function converts Date-Copied to a date field
so that the comparison will be meaningful.
RELATED REFERENCES
DATEVAL (Enterprise COBOL Language Reference)
Example: UNDATE
In the following example, the field Invoice-Date in Invoice-Record is a windowed
Julian date. In some records, it contains a value of 00999 to indicate that this is not
a true invoice record, but a record containing file control information.
Invoice-Date has been given a DATE FORMAT clause because most of its references in
the program are date-specific. However, in the instance where it is checked for the
existence of a control record, the value of 00 in the year component will lead to
some confusion. A year of 00 in Invoice-Date will represent a year of either 1900
or 2000, depending on the century window. This is compared with a nondate (the
literal 00999 in the example), which will always be windowed against the assumed
century window and will therefore always represent the year 1900.
To ensure a consistent comparison, you should use the UNDATE intrinsic function to
convert Invoice-Date to a nondate. Therefore, if the IF statement is not comparing
date fields, it does not need to apply windowing. For example:
01 Invoice-Record.
03 Invoice-Date Pic x(5) Date Format yyxxx.
. . .
If FUNCTION UNDATE(Invoice-Date) Equal “00999” . . .
RELATED REFERENCES
UNDATE (Enterprise COBOL Language Reference)
The easiest way to use the MLE messages is to compile with a FLAG option setting
that embeds the messages in the source listing after the line to which the messages
refer. You can choose to see all MLE messages or just certain severities.
To see all MLE messages, specify the FLAG(I,I) and DATEPROC(FLAG) compiler
options. Initially, you might want to see all of the messages to understand how
MLE is processing the date fields in your program. For example, if you want to do
a static analysis of the date usage in a program by using the compile listing, use
FLAG (I,I).
In some cases, a the W-level message might be acceptable, but you might want to
change the code to get a compile with a return code of zero.
RELATED TASKS
“Controlling date processing explicitly” on page 545
Analyzing date-related diagnostic messages (COBOL Millennium Language
Extensions Guide)
A field that holds a six-digit Gregorian date, for example, can be declared as PIC
S9(6) COMP-3, and this declaration will reserve 4 bytes of storage. But the
programmer might have declared the field as PIC S9(7), knowing that this would
reserve the same 4 bytes, with the high-order digit always containing a zero.
If you add a DATE FORMAT YYXXXX clause to this field, the compiler will give you a
diagnostic message because the number of digits in the PICTURE clause does not
match the size of the date format specification. In this case, you need to check
carefully each use of the field. If the high-order digit is never used, you can simply
change the field definition to PIC S9(6). If it is used (for example, if the same field
can hold a value other than a date), you need to take some other action, such as:
v Using a REDEFINES clause to define the field as both a date and a nondate (this
usage will also produce a warning-level diagnostic message)
v Defining another WORKING-STORAGE field to hold the date, and moving the
numeric field to the new field
v Not adding a DATE FORMAT clause to the data item, and using the DATEVAL
intrinsic function when referring to it as a date field
You can write programs that result in better generated code sequences and use
system services better. These five areas affect program performance:
v Coding techniques. These include using a programming style that helps the
optimizer, choosing efficient data types, and handling tables efficiently.
v Optimization. You can optimize your code by using the OPTIMIZE compiler
option.
v Compiler options and USE FOR DEBUGGING ON ALL PROCEDURES. Certain compiler
options and language affect the efficiency of your program.
v Run-time environment. Carefully consider your choice of run-time options and
other run-time considerations that control how your compiled program runs.
v Running under CICS, IMS, or using VSAM. Various tips can help make these
programs run efficiently.
RELATED CONCEPTS
“Optimization” on page 560
IBM Enterprise COBOL Version 3 Release 1 Performance Tuning
(www.ibm.com/software/ad/cobol/zos/pdf/cobpf310.pdf)
RELATED TASKS
“Using an optimal programming style”
“Choosing efficient data types” on page 555
“Handling tables efficiently” on page 557
“Optimizing your code” on page 560
“Choosing compiler features to enhance performance” on page 562
Specifying run-time options (Language Environment Programming Guide)
“Running efficiently with CICS, IMS, or VSAM” on page 566
RELATED REFERENCES
“Performance-related compiler options” on page 563
Storage performance considerations (Language Environment Programming Guide)
Factoring expressions
Factoring can save a lot of computation. For example, this 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
If you move a literal to a data item, the optimizer recognizes it as a constant, but
only in a limited region of the program after the MOVE statement.
For example, given that V1, V2, and V3 are variables and that C1, C2, and C3 are
constants, the expressions that contain the constant computations are preferable to
those that do not:
The optimizer can eliminate duplicate computations; you do not need to introduce
artificial temporary computations. The program is often more comprehensible
without them.
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 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 to avoid using library routines for
multiplication and division
You largely avoid conversions by using consistent data types, giving both operands
the same usage and also appropriate PICTURE specifications. That is, you should
give two numbers to be compared, added, or subtracted not only have the same
usage but also the same number of decimal places (9s after the V in the PICTURE
clause).
Arithmetic expressions
Computation of arithmetic expressions that are evaluated in floating point is most
efficient when the operands need little or no conversion. Use operands that are
COMP-1 or COMP-2 to produce the most efficient code.
Exponentiations
Use floating point for exponentiations for large exponents to achieve faster
evaluation and more accurate results. For example, the first statement below is
computed more quickly and accurately than the second statement:
COMPUTE fixed-point1 = fixed-point2 ** 100000.E+00
RELATED CONCEPTS
“Formats for numeric data” on page 40
The following two guidelines affect your choice of how to refer to table elements:
v Use indexing rather than subscripting.
Although the compiler can eliminate duplicate indexes and subscripts, the
original reference to a table element is more efficient with indexes than with
subscripts, even if the subscripts are BINARY. The value of an index has the
element size factored into it, whereas the value of a subscript must be multiplied
by the element size when the subscript is used. The index already contains the
displacement from the start of the table, and this value does not have to be
calculated at run time. However, subscripting might be easier to understand and
maintain.
v Use relative indexing.
Relative index references (that is, references in which an unsigned numeric
literal is added to or subtracted from the index name) are executed as fast as
direct index references and sometimes faster. There is no merit in keeping
alternative indexes with the offset factored in.
Whether you use indexes or subscripts, the following guidelines can help you get
better performance in terms of how you code them:
v Put constant and duplicate indexes or subscripts on the left.
You can reduce or eliminate run-time computations by making the constant and
duplicate indexes or subscripts the leftmost ones. Even when all the indexes or
subscripts are variable, try to use your tables so that the rightmost subscript
varies most often for references that occur close to each other in the program.
This practice also improves the pattern of storage references as well as paging. If
all the indexes or subscripts are duplicates, then the entire index or subscript
computation is a common subexpression.
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. With equal element lengths, the stride for the last
dimension of the tables will be equal. The optimizer can then 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 your indexes and subscripts, it might be faster to code
your own checks in your COBOL program than to use the SSRANGE compiler
option.
RELATED CONCEPTS
“Optimization of table references”
RELATED TASKS
“Referring to an item in a table” on page 61
“Choosing efficient data types” on page 555
RELATED REFERENCES
“SSRANGE” on page 321
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).
Because the compiler evaluates expressions from left to right, the optimizer finds
the most opportunities to eliminate computations when the constant or duplicate
subscripts are the leftmost.
However, for the table element reference ELEMENT(C1 C2 V1) the compiler can
eliminate the entire subexpression comp_c1 * d1 + comp_c2 * d2 as constant from
the expression:
comp_c1 * d1 + comp_c2 * d2 + comp_v1 * d3 + base_address
In the table element reference ELEMENT(C1 C2 C3), all the subscripts are constant,
and so no subscript computation is done at run time. The expression is:
comp_c1 * d1 + comp_c2 * d2 + comp_c3 * d3 + base_address
However, for the two table element references ELEMENT(V1 V2 V3) and ELEMENT(V1
V2 V4) the entire subexpression comp_v1 * d1 + comp_v2 * d2 is common between
the two expressions needed to reference the table elements:
comp_v1 * d1 + comp_v2 * d2 + comp_v3 * d3 + base_address
comp_v1 * d1 + comp_v2 * d2 + comp_v4 * d3 + base_address
In the two references ELEMENT(V1 V2 V3) and ELEMENT(V1 V2 V3), the expressions
are the same:
comp_v1 * d1 + comp_v2 * d2 + comp_v3 * d3 + base_address
comp_v1 * d1 + comp_v2 * d2 + comp_v3 * d3 + base_address
With the optimizer, the second (and any subsequent) reference to the same element
can be as efficient as a reference to a scalar (nontable) item.
The direct indexing in ELEMENT (I5, J3, K2) requires this preprocessing:
This processing makes the direct indexing less efficient than the relative indexing
in ELEMENT (I + 5, J - 3, K + 2).
RELATED CONCEPTS
“Optimization”
RELATED TASKS
“Handling tables efficiently” on page 557
You might also want to use this compiler option during development if a program
is used frequently without recompilation. However, the overhead for OPTIMIZE
might outweigh its benefits if you recompile frequently, unless you are using the
assembler language expansion (LIST compiler option) to fine-tune your program.
For unit-testing your program, you will probably find it easier to debug code that
has not been optimized.
To see how the optimizer works on your program, compile it with and without the
OPTIMIZE option and compare the generated code. (Use the LIST compiler option to
request the assembler language listing of the generated code.)
RELATED CONCEPTS
“Optimization”
RELATED REFERENCES
“LIST” on page 306
“OPTIMIZE” on page 312
Optimization
To improve the efficiency of the generated code, you can use the OPTIMIZE compiler
option to cause the COBOL optimizer to do the following:
v Eliminate unnecessary transfers of control and inefficient branches, including
those generated by the compiler that are not evident from looking at the source
program.
v Simplify the compiled code for both a PERFORM statement and a CALL statement to
a contained (nested) program. Where possible, the optimizer places the
statements inline, eliminating the need for linkage code. This optimization is
known as procedure integration. If procedure integration cannot be done, the
optimizer uses the simplest linkage possible (perhaps as few as two instructions)
to get to and from the called program.
v Eliminate duplicate computations (such as subscript computations and repeated
statements) that have no effect on the results of the program.
Program size: If several CALL statements call contained programs and these
programs replace each such statement, the containing program can become large.
The optimizer limits this increase to no more than 50 percent, after which it no
longer integrates the programs. The optimizer then chooses the next best
optimization for the CALL statement; the linkage overhead can be as few as two
instructions.
RELATED REFERENCES
“OPTIMIZE” on page 312
By contrast, in the following program only the first PERFORM statement, PERFORM 12,
will be optimized by procedure integration:
1 SECTION.
11. PERFORM 12
STOP RUN.
12. PERFORM 21
PERFORM 21.
2 SECTION 5.
21. IF A < 5 THEN
ADD 1 TO A
DISPLAY A
END-IF.
RELATED CONCEPTS
“Optimization of table references” on page 558
RELATED TASKS
“Optimizing your code” on page 560
Chapter 32, “Tuning your program” on page 553
Another compiler feature to consider besides compiler options 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 CONCEPTS
“Optimization” on page 560
RELATED TASKS
“Optimizing your code” on page 560
“Getting listings” on page 347
RELATED REFERENCES
“Performance-related compiler options”
Compiler Performance
option Purpose Performance advantages disadvantages Usage notes
“AWO” on To get optimum Can result in performance In general, none When you use AWO, the APPLY
page 292 use of buffer savings, because this WRITE-ONLY clause is in effect
and device option results in fewer calls for all files in the program that
space to data management are physical sequential with
services to handle input V-mode records.
and output
DATA(31) To have DFSMS Because extended-format In general, none On a z/OS system with
allocate QSAM QSAM data sets can DFSMS, if your application
(see “DATA” buffers above require many buffers, processes striped
on page 296) the 16-MB line allocating the buffers in extended-format QSAM data
(by using the unrestricted storage avoids sets, use the RENT and
RENT and virtual storage constraint DATA(31) compiler options to
DATA(31) problems. have the input-output buffers
compiler for your QSAM files allocated
options) from storage above the 16-MB
line.
RELATED CONCEPTS
“Optimization” on page 560
“Storage and its addressability” on page 33
RELATED TASKS
“Generating a list of compiler error messages” on page 265
“Evaluating performance” on page 566
“Optimizing buffer and device space” on page 12
“Choosing compiler features to enhance performance” on page 562
RELATED REFERENCES
“Sign representation and processing” on page 45
“Allocation of buffers for QSAM files” on page 140
Evaluating performance
Fill in this worksheet to help you evaluate the performance of your program. If
you answer yes to each question, you are probably improving the performance.
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.
RELATED TASKS
“Choosing compiler features to enhance performance” on page 562
RELATED REFERENCES
“Performance-related compiler options” on page 563
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 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)
appropriate for the application. Smaller CISZ results in faster retrieval for the
random processing at the expense of inserts, and 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 do use alternate indexes, access method
services builds them more efficiently than the AIXBLD run-time option.
RELATED TASKS
“Coding COBOL programs to run under CICS” on page 375
Chapter 22, “Developing COBOL programs for IMS” on page 391
“Improving VSAM performance” on page 171
Language Environment Customization
RELATED REFERENCES
Specifying run-time options (Language Environment Programming Guide)
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 timestamps 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 for your application in order to perform these calculations.
RELATED CONCEPTS
“Numeric intrinsic functions” on page 48
“Math and date Language Environment services” on page 49
RELATED TASKS
“Eliminating repetitive coding”
“Converting data items (intrinsic functions)” on page 96
“Evaluating data items (intrinsic functions)” on page 99
“Using Language Environment callable services” on page 571
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):
z/OS batch
Use JCL to concatenate data sets on your SYSLIB DD statement.
Alternatively, define multiple DD statements and use the IN/OF phrase of
the COPY statement.
TSO Use the ALLOCATE command to concatenate data sets for SYSLIB.
Alternatively, issue multiple ALLOCATE statements and use the IN/OF phrase
of the COPY statement.
UNIX Use the SYSLIB environment variable to define multiple paths to your
copybooks. Alternatively, use multiple environment variables and use the
IN/OF phrase of the COPY statement.
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 itself cannot be a debugging line; if it
contains a D and WITH DEBUGGING mode is not specified, the COPY statement is
nevertheless processed.
RELATED REFERENCES
“Compiler-directing statements” on page 332
You can retrieve the member CFILEA by using the COPY statement in your source
program code as follows:
FD FILEA
COPY CFILEA.
The library entry is copied into your program, and the resulting program listing
looks as follows:
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, and C
precedes copied lines.
Assume that a member named DOWORK was stored with the following statements:
COMPUTE QTY-ON-HAND = TOTAL-USED-NUMBER-ON-HAND
MOVE QTY-ON-HAND to PRINT-AREA
If you use the EXIT compiler option to provide a LIBEXIT module, your results
might differ from those shown here.
RELATED TASKS
“Eliminating repetitive coding” on page 569
RELATED CONCEPTS
“Sample list of Language Environment callable services”
“Numeric intrinsic functions” on page 48
“Math and date Language Environment services” on page 49
RELATED TASKS
“Calling Language Environment services” on page 573
“Using procedure and function pointers” on page 420
RELATED REFERENCES
Language Environment Programming Reference
Define the variables for the CALL statement in the DATA DIVISION with the
definitions required by the function you are calling:
77 argument comp-1.
77 feedback-code pic x(12) display.
77 result comp-1.
You can choose whether you want to specify the feedback code parameter. If you
specify the feedback code, 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 allow the default Language Environment processing for unhandled
conditions to occur. In any case, this avoids the requirement to write logic to check
the feedback code explicitly after each call.
When you call a Language Environment callable service and specify OMITTED for
the feedback code, the RETURN-CODE special register is set to 0 if the service is
successful. It is not altered if the service is unsuccessful. If you do not specify
OMITTED for the feedback code, the RETURN-CODE special register is always set to 0
regardless of whether the service completed successfully.
RELATED CONCEPTS
General callable services (Language Environment Programming Guide)
RELATED REFERENCES
General callable services (Language Environment Programming Reference)
CALL statement (Enterprise COBOL Language Reference)
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), explained below.
RELATED REFERENCES
“Fixed-point data and intermediate results” on page 579
“Floating-point data and intermediate results” on page 584
“Arithmetic expressions in nonarithmetic statements” on page 586
“ARITH” on page 291
RELATED REFERENCES
ROUNDED phrase (Enterprise COBOL Language Reference)
RELATED CONCEPTS
“Arithmetic expressions” on page 47
RELATED REFERENCES
“Terminology used for intermediate results” on page 578
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 involving addition,
subtraction, multiplication, or division in compatibility mode (that is, when you
compile using the default compiler option ARITH(COMPAT)):
Value of i +
Value of i + d Value of d dmax Number of places carried for ir
<30 Any value Any value i integer and d decimal places
=30
The following table shows the number of places the compiler carries for
fixed-point intermediate results of arithmetic operations involving addition,
subtraction, multiplication, or division in extended mode (that is, when you compile
using option ARITH(EXTEND)):
Value of i +
Value of i + d Value of d dmax Number of places carried for ir
<31 Any value Any value i integer and d decimal places
=31
>31 <dmax Any value 31-d integer and d decimal places
=dmax
>dmax <31 i integer and 31-i decimal places
=31
>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|
The compiler having calculated i and d takes the action indicated in the table
below to handle the intermediate results ir of the exponentiation when in
compatibility mode (compilation using ARITH(COMPAT)).
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 578
“Truncated intermediate results” on page 582
“Binary data and intermediate results” on page 582
“Floating-point data and intermediate results” on page 584
“Intrinsic functions evaluated in fixed-point arithmetic” on page 583
“ARITH” on page 291
SIZE ERROR phrases (Enterprise COBOL Language Reference)
RELATED REFERENCES
“Terminology used for intermediate results” on page 578
“Fixed-point data and intermediate results” on page 579
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 40
RELATED REFERENCES
“Fixed-point data and intermediate results” on page 579
“ARITH” on page 291
You use binary operands most efficiently when the intermediate results will not
exceed nine digits.
RELATED REFERENCES
“Fixed-point data and intermediate results” on page 579
“ARITH” on page 291
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
RELATED REFERENCES
“Terminology used for intermediate results” on page 578
“Fixed-point data and intermediate results” on page 579
“Floating-point data and intermediate results”
“ARITH” on page 291
Mixed functions with at least one floating-point argument are evaluated using
floating-point arithmetic.
RELATED REFERENCES
“Terminology used for intermediate results” on page 578
“ARITH” on page 291
For example:
IF operand-1 = expression-1 THEN . . .
RELATED CONCEPTS
“Fixed-point versus floating-point arithmetic” on page 53
RELATED REFERENCES
“Terminology used for intermediate results” on page 578
“Fixed-point data and intermediate results” on page 579
“Floating-point data and intermediate results” on page 584
IF statement (Enterprise COBOL Language Reference)
EVALUATE statement (Enterprise COBOL Language Reference)
Conditional expressions (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 option is followed by a nonsubordinate data item or group.
v Variably located table: A data item described by an OCCURS clause with the
DEPENDING ON option is followed by a nonsubordinate data item described by an
OCCURS clause.
v Table with variable-length elements: A data item described by an OCCURS clause
contains a subordinate data item described by an OCCURS clause with the
DEPENDING ON option.
v Index name for a table with variable-length elements.
v Element of a table with variable-length elements.
Complex ODO can help you save disk space, but it can be tricky to use and can
make maintaining your code more difficult.
RELATED TASKS
“Preventing index errors when changing ODO object value” on page 589
“Preventing overlay when adding elements to a variable table” on page 589
RELATED REFERENCES
“Effects of change in ODO object value” on page 588
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 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.
The following code shows how to save and restore the index-name (seen in
“Example: complex ODO” on page 587) 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 corresponding 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
* corresponding 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
DEPENDING ON CONTROL-1 PIC X(5).
05 GROUP-ITEM-1.
10 VARY-FIELD-2
OCCURS 1 TO 10 TIMES
DEPENDING ON CONTROL-2 PIC X(9).
01 STORE-VARY-FIELD-2.
05 GROUP-ITEM-2.
10 VARY-FLD-2
OCCURS 1 TO 10 TIMES
DEPENDING ON CONTROL-2 PIC X(9).
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:
You can picture the updated storage for VARY-FIELD-1 and VARY-FIELD-2 as follows:
Note that 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 the operation of the service routines.
RELATED TASKS
“Converting national data” on page 107
“Processing alphanumeric data items that contain DBCS data” on page 111
RELATED REFERENCES
“DBCS notation”
“Alphanumeric to DBCS data conversion (IGZCA2D)”
“DBCS to alphanumeric data conversion (IGZCD2A)” on page 595
“CODEPAGE” on page 294
DBCS notation
These symbols 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
.A, .B, .C, . . . Any double-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:
parameter-1
The sending field for the conversion, handled as an alphanumeric data
item.
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 is 1 to 16,777,215, and the valid
range for the contents of parameter-4 is 1 to 15,777,214.
RELATED REFERENCES
“IGZCA2D return codes”
Example: IGZCA2D
The following 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 593
IGZCD2A syntax
To use the IGZCD2A service routine, pass the following four parameters to the
routine 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 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 are not double-byte EBCDIC
characters
– Converts double-byte characters to single-byte 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 is 1 to 16,777,214, and the valid
range for the contents of parameter-4 is 1 to 15,777,215, which is the maximum
size of alphanumeric item.
RELATED REFERENCES
“IGZCD2A return codes”
Example: IGZCD2A
The following 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 593
RELATED REFERENCES
“XML exceptions that allow continuation”
“XML exceptions that do not allow continuation” on page 603
“XML conformance” on page 606
XML specification (www.w3c.org/XML/)
The table describes the exception and the actions that the parser takes when you
request it to continue after the exception. In these descriptions, the term “XML
text” means either XML-TEXT or XML-NTEXT, depending on whether the XML
document that you are parsing is in an alphanumeric or national data item,
respectively.
RELATED TASKS
“Handling errors in XML documents” on page 215
Code 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.
RELATED TASKS
“Handling errors in XML documents” on page 215
XML conformance
The XML parser included in Enterprise COBOL is not a conforming XML processor
according to the definition in the XML specification. It does not validate the XML
documents that you parse. While it does check for many well-formedness errors, it
does not perform all of the actions required of a nonvalidating XML processor.
In particular, it does not process the internal document type definition (DTD
internal subset). Thus it does not supply default attribute values, does not
normalize attribute values, and does not include the replacement text of internal
entities except for the predefined entities. Instead, it passes the entire document
The COBOL XML parser does check that documents conform to the XML grammar,
except for any document type declaration. The declaration is supplied in its
entirety, unchecked, to your application.
The following material is an annotation from the XML specification. The W3C is not
responsible for any content not found at the original URL (www.w3.org/TR/REC-xml). All
the annotations are non-normative and are shown in italic.
Copyright (C) 1994-2001 W3C (R) (Massachusetts Institute of Technology, Institut National
de Recherche en Informatique et en Automatique, Keio University), All Rights Reserved.
W3C liability, trademark, document use, and software licensing rules apply.
(www.w3.org/Consortium/Legal/ipr-notice-20000612)
RELATED CONCEPTS
“XML parser in COBOL” on page 199
RELATED REFERENCES
XML specification (www.w3c.org/XML/)
2.8 Prolog and document type declaration (XML specification at
www.w3.org/TR/REC-xml#sec-prolog-dtd)
For SYSADATA, the ADEXIT suboption provides a module that will be called for
each SYSADATA record immediately after the record has been written out to the
file.
If you specify the EXIT option without providing at least one suboption, NOEXIT
will be in effect. You can specify the suboptions in any order and separate them by
either commas or spaces. If you specify both the positive and negative form of a
suboption (INEXIT|NOINEXT, LIBEXIT|NOLIBEXIT, PRTEXIT|NOPRTEXIT, or
ADEXIT|NOADEXIT), the form specified last takes effect. If you specify the same
suboption more than once, the last one specified takes 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 load module (where
mod1 is the module name), instead of SYSIN.
LIBEXIT([’str2’,]mod2)
The compiler obtains copybooks from a user-supplied load module (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 load
module (where mod3 is the module name), instead of SYSPRINT.
ADEXIT([’str4’,]mod4)
The compiler passes the SYSADATA output to the user-supplied load
module (where mod4 is the module name).
The module names mod1, mod2, mod3, and mod4 can refer to the same module.
If one of str1, str2, str3, or str4 is specified, the string is passed to the appropriate
user-exit module with the following format:
LL string
RELATED TASKS
“Using the user-exit work area”
“Calling from exit modules” on page 613
“Using the EXIT compiler option with CICS and SQL statements” on page 620
RELATED REFERENCES
“Processing of INEXIT” on page 613
“Processing of LIBEXIT” on page 614
“Processing of PRTEXIT” on page 617
“Processing of ADEXIT” on page 618
“Error handling for exit modules” on page 619
You need to establish your own conventions for using the work area if more than
one exit is active during the compilation. For example, the INEXIT module uses
the first word in the work area, the LIBEXIT module uses the second word, the
PRTEXIT module uses the third word, and the ADEXIT module uses the fourth
word.
RELATED REFERENCES
“Processing of INEXIT” on page 613
“Processing of LIBEXIT” on page 614
“Processing of PRTEXIT” on page 617
“Processing of ADEXIT” on page 618
Exit modules must have the RMODE attribute of 24 and the AMODE attribute of ANY.
Processing of INEXIT
The exit module is used to read source code from a user-supplied load module in
place of SYSIN.
RELATED TASKS
“Using the EXIT compiler option with CICS and SQL statements” on page 620
RELATED REFERENCES
“Processing of LIBEXIT”
Processing of LIBEXIT
The 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.
The compiler does not allow 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:
RELATED TASKS
“Using the EXIT compiler option with CICS and SQL statements” on page 620
Processing of PRTEXIT
The exit module is used in place of the SYSPRINT data set.
RELATED TASKS
“Using the EXIT compiler option with CICS and SQL statements” on page 620
RELATED REFERENCES
“Processing of LIBEXIT” on page 614
Processing of ADEXIT
Use of the ADEXIT module requires:
v Compiler option ADATA to produce SYSADATA output
v DD statement SYSADATA
RELATED TASKS
“Using the EXIT compiler option with CICS and SQL statements” on page 620
RELATED REFERENCES
“Processing of LIBEXIT” on page 614
Message IGYSI5008 is written to the operator and the compiler terminates with
return code 16 when any of the following happens:
v An exit module cannot be loaded.
v A nonzero return code is received from INEXIT during an OPEN request.
v A nonzero return code is received from PRTEXIT during an OPEN request.
The exit type and operation (OPEN or LOAD) are identified in the message.
Using the EXIT compiler option with CICS and SQL statements
When you compile using suboptions of the EXIT compiler option and your
program contains CICS or SQL statements, the actions that you can take in the exit
modules depend on whether you translated the statements using the separate CICS
translator and DB2 precompiler, or translate them using the integrated CICS
translator and DB2 coprocessor. When you use the integrated translators, you can
process EXEC CICS and EXEC SQL statements in the exit modules.
INEXIT
When you translate the EXEC CICS and EXEC SQL statements in a program using the
separate CICS translator and DB2 precompiler, and then compile the program
using the INEXIT suboption, you can process the COBOL statements generated for
the EXEC statements in the INEXIT module. You can change the generated
statements in the INEXIT module, although doing so is not supported by IBM.
When you compile a program using the INEXIT suboption and translate the EXEC
CICS and EXEC SQL statements using the integrated CICS translator and DB2
coprocessor (enabled using the CICS and SQL compiler options, respectively), you
can process the EXEC CICS and EXEC SQL statements in the INEXIT module. The
INEXIT module does not get control for the COBOL statements generated for the
EXEC statements by the integrated translator and coprocessor.
LIBEXIT
When you compile a program using the LIBEXIT suboption and use the integrated
DB2 coprocessor, EXEC SQL INCLUDE statements in the program are processed like
COBOL COPY statements. You can process the statements brought in by the EXEC
SQL INCLUDE statements in the LIBEXIT module. (If you use the separate DB2
precompiler, you can process the input statements brought in by the EXEC SQL
INCLUDE statements only by using the INEXIT suboption.)
When you translate the EXEC CICS statements in a program and its copybooks
using the separate CICS translator and then compile the program using the
LIBEXIT suboption, you can process the COBOL statements generated for the EXEC
CICS statements in the LIBEXIT module.
When you compile a program using the LIBEXIT suboption and translate the EXEC
CICS statements using the integrated CICS translator, you can process the EXEC
CICS source statements in the LIBEXIT module.
PRTEXIT
When you translate the EXEC CICS and EXEC SQL statements in a program using the
separate CICS translator and DB2 precompiler, and compile the program using the
When you compile a program using the PRTEXIT suboption and translate the EXEC
CICS and EXEC SQL statements using the integrated CICS translator and DB2
coprocessor, you can process the EXEC CICS and EXEC SQL source statements from
the SOURCE listing in the PRTEXIT module. The PRTEXIT module does not have
access to the COBOL source statements generated by the integrated translator and
coprocessor.
ADEXIT
When you translate the EXEC CICS and EXEC SQL statements in a program using the
separate CICS translator and DB2 precompiler, and compile the program using the
ADEXIT suboption, you can process the COBOL SYSADATA source statements
generated for the EXEC statements in the ADEXIT module.
When you compile a program using the ADEXIT suboption and translate the EXEC
CICS and EXEC SQL statements using the integrated CICS translator and DB2
coprocessor, you can process the EXEC CICS and EXEC SQL source statements in the
ADEXIT module. The ADEXIT module does not have access to the COBOL source
statements generated by the integrated translator and coprocessor.
RELATED CONCEPTS
“DB2 coprocessor” on page 388
“Integrated CICS translator” on page 380
RELATED TASKS
“Compiling with the SQL option” on page 387
“Compiling with the CICS option” on page 378
RELATED REFERENCES
“Processing of INEXIT” on page 613
“Processing of LIBEXIT” on page 614
“Processing of PRTEXIT” on page 617
“Processing of ADEXIT” on page 618
Identification Division.
Program-ID. Skelinx.
Environment Division.
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) Binary.
01 Exit-Operation Pic 9(4) Binary.
01 Exit-ReturnCode Pic 9(9) Binary.
01 Exit-WorkArea.
05 INEXIT-Slot Pic 9(9) Binary.
05 LIBEXIT-Slot Pic 9(9) Binary.
05 PRTEXIT-Slot Pic 9(9) Binary.
05 Reserved-Slot Pic 9(9) Binary.
01 Exit-DataLength Pic 9(9) Binary.
01 Exit-DataArea Pointer.
01 Exit-Open-Parm Redefines Exit-DataArea.
05 String-Len Pic 9(4) Binary.
05 Open-String Pic X(64).
01 Exit-Print-Line Redefines Exit-DataArea Pic X(133).
01 Exit-LIBEXIT Pic X(8).
01 Exit-Systext Pic X(8).
01 Exit-CBLLibrary Pic X(30).
01 Exit-CBLText Pic X(30).
***********************************************************
* *
* Begin PROCEDURE DIVISION *
* *
* Invoke the section to handle the exit. *
* *
***********************************************************
Evaluate Exit-type
When (1) Perform Handle-INEXIT
When (2) Perform Handle-LIBEXIT
When (3) Perform Handle-PRTEXIT
End-Evaluate
Move 16 To Exit-ReturnCode
Goback.
*************************************************
* I N E X I T E X I T P R O C E S S O R *
*************************************************
Handle-INEXIT.
Evaluate Exit-Operation
When (0) Perform INEXIT-Open
When (1) Perform INEXIT-Close
When (2) Perform INEXIT-Get
End-Evaluate
INEXIT-Open.
* ------------------------------------------------------
* Prepare for reading source
* ------------------------------------------------------
Goback.
INEXIT-Close.
* ------------------------------------------------------
* Release resources
* ------------------------------------------------------
Goback.
INEXIT-Get.
* ------------------------------------------------------
* Retrieve next source record
* ------------------------------------------------------
* ------------------------------------------------------
* Return the address of the record to the compiler.
* ------------------------------------------------------
Set Exit-DataArea to Address of Record-Variable
* ------------------------------------------------------
* Set length of record in User-Exit Parameter List
* ------------------------------------------------------
Move 80 To Exit-DataLength
Goback.
***************************************************
* L I B E X I T P R O C E S S O R *
***************************************************
Handle-LIBEXIT.
Display “**** This module for INEXIT only”
Move 16 To Exit-ReturnCode
Goback.
*******************************************************
* P R I N T E X I T P R O C E S S O R *
*******************************************************
Handle-PRTEXIT.
Display “**** This module for INEXIT only”
Move 16 To Exit-ReturnCode
Goback.
*******************************************************
| JNI.cpy is in the HFS in the include subdirectory of the cobol directory (typically
| /usr/lpp/cobol/include) and 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 X’01’ through X’FF’.
* 88 jboolean1-false value X’00’.
*
*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
“Accessing JNI services” on page 501
RELATED REFERENCES
“ADATA” on page 290
“Existing compiler options affecting the SYSADATA file”
“Record types” on page 632
“SYSADATA record descriptions” on page 634
Note that the Type 0038 Source record contains two fields relating to line
numbers and record numbers:
These two fields can always be used to correlate the compiler line
numbers, used in all the above fields, with physical source record
numbers.
TEST The TEST option will cause additional object text records to be created that
will also affect the contents of the SYSADATA file.
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 FLAGSAA, FLAGSTD, or SSRANGE.
RELATED REFERENCES
“Record types”
“COMPILE” on page 294
“LANGUAGE” on page 305
“NUMBER” on page 309
“TEST” on page 322
Record types
The SYSADATA file contains records classified into different record types. Each
type of record provides information about the COBOL language program being
compiled. Each record consists of two parts:
v A 12-byte header section, which has the same structure for all record types
v A variable-length data section, which varies by record type
The header section contains, among other items, the record code that identifies the
type of record.
The types of record provided in the associated data file are listed in the following
table:
“Example: SYSADATA”
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 as shown below. Other programs
might produce records not shown below, which would affect the order of the
records.
Type Description
X’0120’ EVENTS Timestamp record
X’0120’ EVENTS Processor record
X’0120’ EVENTS Fileid 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
IDENTIFICATION DIVISION.
RELATED REFERENCES
“SYSADATA record descriptions”
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-based hardware.
RELATED REFERENCES
“Common header section” on page 635
“Job identification record - X’0000’” on page 636
“ADATA identification record - X’0001’” on page 637
“Compilation unit start/end record - X’0002’” on page 637
“Options record - X’0010’” on page 638
“External symbol record - X’0020’” on page 647
“Parse tree record - X’0024’” on page 648
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 compile.
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 will be continued on the next record. The current number of input files
(for that record) will be stored in the record and the record written to the associated
data file. The next record will contain the rest of the input files. The count of the
number of input files is a count for the current record.
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
0031 END-OF-PAGE
0032 USING
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
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
0046 UNDATE
0047 DATEVAL
0048 YEARWINDOW
0049 DISPLAY-OF
0050 NATIONAL-OF
For Special Register type:
0001 ADDRESS OF
0002 LENGTH OF
For Reserved Word Class type:
0001 ALPHABETIC
0002 ALPHABETIC-LOWER
0003 ALPHABETIC-UPPER
0004 DBCS
0005 KANJI
0006 NUMERIC
0007 NEGATIVE
0008 POSITIVE
0009 ZERO
For Reserved Word type:
0001 TRUE
0002 FALSE
0003 ANY
0004 THRU
The following table shows the contents of the COPY REPLACING record:
For workstation:
01 Base Locator File
02 Base Locator Linkage Section
03 Base Locator for Varloc items
04 Base Locator for Extern data
05 Base Locator for Object data
10 Base Locator Working-Storage
11 Base Locator Special regs
12 Base Locator Alphanumeric FUNC
13 Base Locator Alphanumeric EVAL
14 Indexed by variable
16 COMREG special reg
17 UPSI switch
22 Base Locator for Local-Storage
External CLASS name Number of characters in the external CLASS name for
length for CLASS-ID CLASS-ID
ODO Symbol name FL4 If data-name, ID of the ODO symbol name—zero if ODO
ID for data-name not specified.
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 in the case of data-name,
procedure, or program symbols, or 10 occurrences of the statement number in the case
of 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 a total of 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 will be
written to the SYSADATA file for each unique library.
Pseudocode and other comments regarding these programs are included in the
program prologue, which you can obtain in a program listing.
The sample programs in this material demonstrate many language elements and
concepts of COBOL:
v IGYTCARA is an example of using QSAM files and VSAM indexed files and
shows how to use many COBOL intrinsic functions.
v IGYTCARB is an example of using IBM Interactive System Product Facility
(ISPF).
v IGYTSALE is an example of using several of the Language Environment callable
services features.
RELATED CONCEPTS
“IGYTCARA: batch application”
“IGYTCARB: interactive program” on page 683
“IGYTSALE: nested program application” on page 686
Using QSAM files and VSAM indexed files, this program validates transaction file
entries (sequential file processing) and updates a master file (indexed file
processing).
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 681
“Language elements and concepts that are illustrated” on page 694
1. Transaction code
2. Shift
Data set and procedure names can be changed at installation time. You should
check with your system programmer to verify these names.
Do not change these options on the CBL statement in the source file for
IGYTCARA:
NOADV
NODYNAM
NONAME
NONUMBER
QUOTE
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 679
RELATED TASKS
“Running IGYTCARA”
RELATED REFERENCES
“Input data for IGYTCARA” on page 680
“Report produced by IGYTCARA” on page 681
“Language elements and concepts that are illustrated” on page 694
Running IGYTCARA
The procedure provided here does a combined compile, link-edit, and run of the
IGYTCARA program. If you want only to compile or only to compile and link-edit
the program, you need to 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 in the
fields that are shown in lowercase letters (accounting information, volume serial
number, unit name, cluster prefix). 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) -
INDEXED -
To remove any existing cluster, a DELETE is issued before the VSAM cluster is
created.
2. Use the following JCL to compile, link-edit, and run the IGYTCARA program:
//IGYTCARA JOB (acct-info),’IGYTCAR’,MSGLEVEL=(1,1),TIME=(0,29)
//TEST EXEC IGYWCLG
//COBOL.SYSLIB DD DSN=IGY.V3R2M0.SIGYSAMP,DISP=SHR
//COBOL.SYSIN DD DSN=IGY.V3R2M0.SIGYSAMP(IGYTCARA),DISP=SHR
//GO.SYSOUT DD SYSOUT=A
//GO.COMMUTR DD DSN=your-prefix.IGYTCAR.MASTFILE,DISP=SHR
//GO.LOCCODE DD DSN=IGY.V3R2M0.SIGYSAMP(IGYTCODE),DISP=SHR
//GO.UPDTRANS DD DSN=IGY.V3R2M0.SIGYSAMP(IGYTRANX),DISP=SHR
//GO.UPDPRINT DD SYSOUT=A,DCB=BLKSIZE=133
//
RELATED TASKS
Chapter 10, “Processing VSAM files” on page 147
RELATED REFERENCES
“Compile, link-edit, and run procedure (IGYWCLG)” on page 241
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:
RELATED TASKS
“Preparing to run IGYTCARB” on page 684
All the files required by the IGYTCARB program are supplied on the product
installation tape. These files (IGYTCARB, IGYTRANB, and IGYTPNL) are located
in the IGY.V3R2M0.SIGYSAMP data set.
Data set and procedure names can be changed at installation time. Check with
your system programmer to verify these names.
Do not change these options on the CBL card in the source file for IGYTCARB:
NONUMBER
QUOTE
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 683
RELATED TASKS
“Running IGYTCARB”
RELATED REFERENCES
“Language elements and concepts that are illustrated” on page 694
Running IGYTCARB
The following procedure does a combined compile, link-edit, and run of the
IGYTCARB program. If you want only to compile or only to compile and link-edit
the program, you need to change the procedure.
As indicated by (1) in this example, you add IGYTCARB to the upper portion
of the panel by entering:
% C +IGYTCARB - Run IGYTCARB UPDATE TRANSACTION PROGRAM
You add the corresponding line on the lower portion of the panel, indicated by
(2), by entering:
C,’PGM(IGYTCARB)’
2. Place ISR@PRIM (or your other modified panel) and IGYTPNL in a library and
make this library the first library in the ISPPLIB concatenation.
3. Comment sequence line IB2200 and uncomment sequence line IB2210 in
IGYTCARB. (The OPEN EXTEND verb is supported under z/OS.)
4. Compile and link-edit IGYTCARB and place the resulting load module in your
LOADLIB.
5. Allocate ISPLLIB using the following command:
ALLOCATE FILE(ISPLLIB) DATASET(DSN1, SYS1.COBLIB, DSN2) SHR REUSE
Here DSN1 is the library name of the LOADLIB from step 4. DSN2 is your
installed ISPLLIB.
6. Allocate the input and output data sets using the following command:
ALLOCATE FILE(UPDTRANS) DA(’IGY.V3R2M0.SIGYSAMP(IGYTRANB)) SHR REUSE
7. Allocate ISPPLIB using the following command:
ALLOCATE FILE(ISPPLIB) DATASET(DSN3, DSN4) SHR REUSE
Here DSN3 is the library containing the modified panels. DSN4 is the ISPF panel
library.
8. Invoke IGYTCARB using your modified panel.
RELATED REFERENCES
“Input data for IGYTSALE”
“Reports produced by IGYTSALE” on page 689
“Language elements and concepts that are illustrated” on page 694
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
. . .
Data set and procedure names can be changed at installation time. Check with
your system programmer to verify these names.
Do not change these options on the CBL card in the source file for IGYTSALE:
LIB
NONUMBER
SEQUENCE
NONUMBER
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 686
RELATED REFERENCES
“Input data for IGYTSALE” on page 687
“Reports produced by IGYTSALE” on page 689
“Language elements and concepts that are illustrated”
Running IGYTSALE
The following procedure does a combined compile, link-edit, and run of the
IGYTSALE program. If you want only to compile or only to compile and link-edit
the program, you need to change the IGYWCLG cataloged procedure.
Use the following JCL to compile, link-edit, and run the IGYTSALE program.
Insert the information for your system or installation in the fields that are shown
in lowercase letters (accounting information).
//IGYTSALE JOB (acct-info),’IGYTSALE’,MSGLEVEL=(1,1),TIME=(0,29)
//TEST EXEC IGYWCLG
//COBOL.SYSLIB DD DSN=IGY.V3R2M0.SIGYSAMP,DISP=SHR
//COBOL.SYSIN DD DSN=IGY.V3R2M0.SIGYSAMP(IGYTSALE),DISP=SHR
//GO.SYSOUT DD SYSOUT=A
//GO.IGYTABLE DD DSN=IGY.V3R2M0.SIGYSAMP(IGYTABLE),DISP=SHR
//GO.IGYTRANS DD DSN=IGY.V3R2M0.SIGYSAMP(IGYTRANA),DISP=SHR
//GO.IGYPRINT DD SYSOUT=A,DCB=BLKSIZE=133
//GO.IGYPRT2 DD SYSOUT=A,DCB=BLKSIZE=133
//
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 have patents or pending patent applications covering subject matter
described in this document. The furnishing of this document does not give you
any license to these patents. You can send license inquiries, in writing, to:
IBM Corporation
J46A/G4
555 Bailey Avenue
San Jose, CA 95141-1003
U.S.A.
For license inquiries regarding double-byte (DBCS) information, contact the IBM
Intellectual Property Department in your country or send inquiries, in writing, to:
IBM World Trade Asia Corporation
Licensing
2-31 Roppongi 3-chome, Minato-ku
Tokyo 106, Japan
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 publication to non-IBM Web sites are provided for
convenience only and do not in any manner serve as an endorsement of those Web
sites. The materials at those Web sites are not part of the materials for this IBM
product and use of those Web sites is at your own risk.
AIX
CICS
CICS/ESA
COBOL/370
DB2
DFSMS
DFSORT
IBM
IMS
IMS/ESA
Language Environment
MVS
OS/390
RACF
System/390
VisualAge
WebSphere
z/OS
Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the
United States, other countries, or both.
UNIX is a registered trademark of The Open Group in the United States and other
countries.
Other company, product or service names may be the trademarks or service marks
of others.
If you are viewing this information in softcopy, the photographs and color
illustrations may not appear.
Copies can be purchased from the American alphanumeric-edited character. A character within an
National Standards Institute, 25 West 43rd Street, alphanumeric character string that contains at least one
New York, New York 10036. B, 0 (zero), or / (slash).
This glossary includes definitions developed by alphanumeric item. A data item that is described with
Sun Microsystems, Inc. for their Java and J2EE USAGE DISPLAY and a PICTURE character-string that
glossaries. When Sun is the source of a definition, includes the symbol X.
that is indicated.
alphanumeric literal. A literal that has an opening
delimiter from the following set: ’, “, X’, X”, Z’, or Z“.
A The string of characters can include any character in
the character set of the computer.
* abbreviated combined relation condition. The
combined condition that results from the explicit * alternate record key. A key, other than the prime
omission of a common subject or a common subject record key, whose contents identify a record within an
and common relational operator in a consecutive indexed file.
sequence of relation conditions.
ANSI (American National Standards Institute). An
abend. Abnormal termination of a program. organization that consists of producers, consumers, and
general-interest groups and establishes the procedures
above the 16-MB line. Storage above the so-called by which accredited organizations create and maintain
16-MB line (or boundary) but below the 2-GB bar. This voluntary industry standards in the United States.
storage is addressable only in 31-bit mode. Before IBM
introduced the MVS/XA architecture in the 1980s, the APPC. See advanced program-to-program communication
virtual storage for a program was limited to 16 MB. (APPC).
Programs that have been compiled with a 24-bit mode
* argument. An identifier, a literal, an arithmetic
can address only 16 MB of space, as though they were
expression, or a function-identifier that specifies a value
kept under an imaginary storage line. Since VS COBOL
to be used in the evaluation of a function.
II, a program that has been compiled with a 31-bit
mode can be above the 16-MB line. * arithmetic expression. An identifier of a numeric
elementary item, a numeric literal, such identifiers and
* access mode. The manner in which records are to be
literals separated by arithmetic operators, two
operated upon within a file.
bytecode. Machine-independent code that is generated character string. A sequence of contiguous characters
by the Java compiler and executed by the Java that form a COBOL word, a literal, a PICTURE character
interpreter. (Sun) string, or a comment-entry. A character string must be
delimited by separators.
C checkpoint. A point at which information about the
status of a job and the system can be recorded so that
callable services. In Language Environment, a set of the job step can be restarted later.
services that a COBOL program can invoke by using
the conventional Language Environment-defined call * class. The entity that defines common behavior and
interface. All programs that share the Language implementation for zero, one, or more objects. The
Environment conventions can use these services. objects that share the same implementation are
considered to be objects of the same class. Classes can
called program. A program that is the object of a CALL be defined hierarchically, allowing one class to inherit
statement. At run time the called program and calling from another.
program are combined to produce a run unit.
* class condition. The proposition (for which a truth
* calling program. A program that executes a CALL to value can be determined) that the content of an item is
another program. wholly alphabetic, is wholly numeric, or consists
exclusively of the characters that are listed in the
case structure. A program-processing logic in which a
definition of a class-name.
series of conditions is tested in order to choose between
a number of resulting actions. * class definition. The COBOL source unit that
defines a class.
cataloged procedure. A set of job control statements
that are placed in a partitioned data set called the class hierarchy. A tree-like structure that shows
procedure library (SYS1.PROCLIB). You can use relationships among object classes. It places one class at
cataloged procedures to save time and reduce errors in the top and one or more layers of classes below it.
coding JCL. Synonymous with inheritance hierarchy.
CCSID. See coded character set identifier. * class identification entry. An entry in the CLASS-ID
paragraph of the IDENTIFICATION DIVISION; this entry
century window. A century window is a 100-year
contains clauses that specify the class-name and assign
interval within which any two-digit year is unique.
selected attributes to the class definition.
Several types of century window are available to
COBOL programmers: class library. A collection of classes.
v For windowed date fields, you use the YEARWINDOW
compiler option. class-name (object-oriented). The name of an
object-oriented COBOL class definition.
v For the windowing intrinsic functions
DATE-TO-YYYYMMDD, DAY-TO-YYYYDDD, and * class-name (of data). A user-defined word that is
YEAR-TO-YYYY, you specify the century window with defined in the SPECIAL-NAMES paragraph of the
argument-2. ENVIRONMENT DIVISION; this word assigns a name to the
v For Language Environment callable services, you proposition (for which a truth value can be defined)
specify the century window in CEESCEN. that the content of a data item consists exclusively of
the characters that are listed in the definition of the
* character. The basic indivisible unit of the language. class-name.
character encoding unit. A unit of computer memory class object. The run-time object representing a class.
that is used to represent characters. One or more
character encoding units are used to represent a * clause. An ordered set of consecutive COBOL
character in a coded character set. Also known as character strings whose purpose is to specify an
encoding unit. attribute of an entry.
character position. The amount of physical storage client. In object-oriented programming, a program or
required to store a single standard data format method that requests services from one or more
character described as USAGE IS DISPLAY. methods in a class.
Glossary 703
set consists of the characters listed below: * combined condition. A condition that is the result of
connecting two or more conditions with the AND or the
Character Meaning OR logical operator. See also condition and negated
0,1, . . . ,9 Digit combined condition.
A,B, . . . ,Z Uppercase letter
a,b, . . . ,z Lowercase letter * comment-entry. An entry in the IDENTIFICATION
Space DIVISION that can be any combination of characters
from the character set of the computer.
+ Plus sign
- Minus sign (hyphen) * comment line. A source program line represented by
* Asterisk an asterisk (*) in the indicator area of the line and any
/ Slant (virgule, slash) characters from the character set of the computer in
= Equal sign area A and area B of that line. The comment line serves
$ Currency sign only for documentation in a program. A special form of
, Comma (decimal point) comment line represented by a slant (/) in the indicator
; Semicolon area of the line and any characters from the character
. Period (decimal point, full stop) set of the computer in area A and area B of that line
causes page ejection before printing the comment.
” Quotation mark
( Left parenthesis * common program. A program that, despite being
) Right parenthesis directly contained within another program, can be
> Greater than symbol called from any program directly or indirectly
< Less than symbol contained in that other program.
: Colon
compatible date field. The meaning of the term
compatible, when applied to date fields, depends on the
* COBOL word. See word. COBOL division in which the usage occurs:
v DATA DIVISION
code page. An assignment of graphic characters and Two date fields are compatible if they have identical
control function meanings to all code points. For USAGE and meet at least one of the following
example, one code page could assign characters and conditions:
meanings to 256 code points for 8-bit code, and another
code page could assign characters and meanings to 128 – They have the same date format.
code points for 7-bit code. For example, one of the IBM – Both are windowed date fields, where one consists
code pages for English on the workstation is IBM-850 only of a windowed year, DATE FORMAT YY.
and on the host is IBM-1047. A coded character set. – Both are expanded date fields, where one consists
only of an expanded year, DATE FORMAT YYYY.
code point. A unique bit pattern that is defined in a
coded character set (code page). Code points are – One has DATE FORMAT YYXXXX, and the other has
assigned to graphic characters in a coded character set. YYXX.
– One has DATE FORMAT YYYYXXXX, and the other has
coded character set. A set of unambiguous rules that YYYYXX.
establish a character set and the relationship between
the characters of the set and their coded representation. A windowed date field can be subordinate to a data
Examples of coded character sets are the character sets item that is an expanded date group. The two date
as represented by ASCII or EBCDIC code pages or by fields are compatible if the subordinate date field has
the UTF-16 encoding scheme for Unicode. USAGE DISPLAY, starts two bytes after the start of the
group expanded date field, and the two fields meet
coded character set identifier (CCSID). A number in at least one of the following conditions:
the range 1 to 65,535 that includes a specific set of
identifiers for the encoding scheme, character set, and – The subordinate date field has a DATE FORMAT
code page, and other information that uniquely pattern with the same number of Xs as the DATE
identifies the coded graphic character representation. FORMAT pattern of the group date field.
– The subordinate date field has DATE FORMAT YY.
* collating sequence. The sequence in which the – The group date field has DATE FORMAT YYYYXXXX
characters that are acceptable to a computer are and the subordinate date field has DATE FORMAT
ordered for purposes of sorting, merging, comparing, YYXX.
and for processing indexed files sequentially.
v PROCEDURE DIVISION
* column. A character position within a print line. The Two date fields are compatible if they have the same
columns are numbered from 1, by 1, starting at the date format except for the year part, which can be
leftmost character position of the print line and
extending to the rightmost position of the print line.
Glossary 705
* CONFIGURATION SECTION. A section of the ENVIRONMENT program, that provides information describing a
DIVISION that describes overall specifications of source particular attribute of a data item.
and object programs and class definitions.
* data description entry. An entry in the DATA
CONSOLE. A COBOL environment-name associated DIVISION of a COBOL program that is composed of a
with the operator console. level-number followed by a data-name, if required, and
then followed by a set of data clauses, as required.
* contiguous items. Items that are described by
consecutive entries in the DATA DIVISION, and that bear DATA DIVISION. One of the four main components of a
a definite hierarchic relationship to each other. COBOL program, class definition, or method definition.
The DATA DIVISION describes the data to be processed
copybook. A file or library member containing a by the object program, class, or method: files to be used
sequence of code that is included in the source and the records contained within them; internal
program at compile time using the COPY statement. The working-storage records that will be needed; data to be
file can be created by the user, supplied by COBOL, or made available in more than one program in the
supplied by another product. Synonymous with copy COBOL run unit. (A class DATA DIVISION contains only
file. the WORKING-STORAGE SECTION.)
* counter. A data item used for storing numbers or * data item. A unit of data (excluding literals) defined
number representations in a manner that permits these by a COBOL program or by the rules for function
numbers to be increased or decreased by the value of evaluation.
another number, or to be changed or reset to zero or to
an arbitrary positive or negative value. * data-name. A user-defined word that names a data
item described in a data description entry. When used
cross-reference listing. The portion of the compiler in the general formats, data-name represents a word
listing that contains information on where files, fields, that must not be reference-modified, subscripted, or
and indicators are defined, referenced, and modified in qualified unless specifically permitted by the rules for
a program. the format.
currency-sign value. A character string that identifies date field. Any of the following:
the monetary units stored in a numeric-edited item.
v A data item whose data description entry includes a
Typical examples are $, USD, and EUR. A currency-sign
DATE FORMAT clause.
value can be defined by either the CURRENCY compiler
option or the CURRENCY SIGN clause in the v A value returned by one of the following intrinsic
SPECIAL-NAMES paragraph of the ENVIRONMENT DIVISION. functions:
If the CURRENCY SIGN clause is not specified and the
NOCURRENCY compiler option is in effect, the dollar sign DATE-OF-INTEGER
($) is used as the default currency-sign value. See also DATE-TO-YYYYMMDD
currency symbol. DATEVAL
DAY-OF-INTEGER
currency symbol. A character used in a PICTURE clause DAY-TO-YYYYDDD
to indicate the position of a currency sign value in a YEAR-TO-YYYY
numeric-edited item. A currency symbol can be defined YEARWINDOW
by either the CURRENCY compiler option or the CURRENCY v The conceptual data items DATE, DATE
SIGN clause in the SPECIAL-NAMES paragraph of the YYYYMMDD, DAY, and DAY YYYYDDD of the
ENVIRONMENT DIVISION. If the CURRENCY SIGN clause is ACCEPT statement.
not specified and the NOCURRENCY compiler option is in
v The result of certain arithmetic operations (for
effect, the dollar sign ($) is used as the default currency
details, see Arithmetic with date fields in Enterprise
sign value and currency symbol. Multiple currency
COBOL Language Reference).
symbols and currency sign values can be defined. See
also currency sign value.
The term date field refers to both expanded date field and
* current record. In file processing, the record that is windowed date field. See also nondate.
available in the record area associated with a file.
date format. The date pattern of a date field, specified
* current volume pointer. A conceptual entity that in either of the following ways:
points to the current volume of a sequential file. v Explicitly, by the DATE FORMAT clause or DATEVAL
intrinsic function argument-2
D v Implicitly, by statements and intrinsic functions that
return date fields (for details, see Date field in
* data clause. A clause, appearing in a data Enterprise COBOL Language Reference)
description entry in the DATA DIVISION of a COBOL
DBCS. See double-byte character set (DBCS).
dependent region. In IMS, the MVS virtual storage do-until. In structured programming, a do-until loop
region that contains message-driven programs, batch will be executed at least once, and until a given
programs, or online utilities. condition is true. In COBOL, a TEST AFTER phrase used
with the PERFORM statement functions in the same way.
* descending key. A key upon the values of which
data is ordered starting with the highest value of key do-while. In structured programming, a do-while loop
down to the lowest value of key, in accordance with the will be executed if, and while, a given condition is true.
rules for comparing data items. In COBOL, a TEST BEFORE phrase used with the
PERFORM statement functions in the same way.
digit. Any of the numerals from 0 through 9. In
COBOL, the term is not used to refer to any other document type definition (DTD). The grammar for a
symbol. class of XML documents. See XML type definition.
* digit position. The amount of physical storage double-byte character set (DBCS). A set of characters
required to store a single digit. This amount can vary in which each character is represented by 2 bytes.
depending on the usage specified in the data Languages such as Japanese, Chinese, and Korean,
description entry that defines the data item. which contain more symbols than can be represented
by 256 code points, require double-byte character sets.
* direct access. The facility to obtain data from storage Because each character requires 2 bytes, entering,
devices or to enter data into a storage device in such a displaying, and printing DBCS characters requires
way that the process depends only on the location of hardware and supporting software that are
that data and not on a reference to data previously DBCS-capable.
accessed.
* dynamic access. An access mode in which specific
Distributed Debugger. A client-server application that logical records can be obtained from or placed into a
enables you to detect and diagnose errors in programs mass storage file in a nonsequential manner and
that run on systems accessible through a network obtained from a file in a sequential manner during the
connection or that run on your workstation. The scope of the same OPEN statement.
Distributed Debugger uses a graphical user interface
where you can issue commands to control the dynamic CALL. A CALL literal statement in a program
execution (remote or local) of your program. that has been compiled with the DYNAM and NODLL
Glossary 707
options, or a CALL identifier statement in a program that EJB server. Software that provides services to an EJB
has been compiled with the NODLL option. container. An EJB server can host one or more EJB
containers. (Sun)
dynamic link library (DLL). A file containing
executable code and data that are bound to a program element (text element). One logical unit of a string of
at load time or run time, rather than during linking. text, such as the description of a single data item or
Several applications can share the code and data in a verb, preceded by a unique code identifying the
DLL simultaneously. Although a DLL is not part of the element type.
executable (.EXE) file for a program, it can be required
for an .EXE file to run properly. * elementary item. A data item that is described as
not being further logically subdivided.
dynamic storage area (DSA). Dynamically acquired
storage composed of a register save area and an area encapsulation. In object-oriented programming, the
available for dynamic storage allocation (such as technique that is used to hide the inherent details of an
program variables). DSAs are generally allocated within object. The object provides an interface that queries and
STACK segments managed by Language Environment. manipulates the data without exposing its underlying
structure. Synonymous with information hiding.
environment-name. A name, specified by IBM, that * external data record. A logical record that is
identifies system logical units, printer and card punch described in one or more programs of a run unit and
control characters, report codes, program switches or whose constituent data items can be referenced from
all of these. When an environment-name is associated any program in which they are described.
with a mnemonic-name in the ENVIRONMENT DIVISION,
the mnemonic-name can be substituted in any format external decimal item. A format for representing
in which such substitution is valid. numbers in which the digit is contained in bits 4
through 7 and the sign is contained in bits 0 through 3
environment variable. Any of a number of variables of the rightmost byte. Bits 0 through 3 of all other bytes
that describe the way an operating system is going to contain 1 (hex F). For example, the decimal value of
run and the devices it is going to recognize. +123 is represented as 1111 0001 1111 0010 1111 0011.
Synonymous with zoned decimal item.
EXE. See executable file (EXE).
* external file connector. A file connector that is
executable file (EXE). A file that contains programs or accessible to one or more object programs in the run
commands that perform operations or actions to be unit.
taken.
external floating-point item. A format for
execution time. See run time. representing numbers in which a real number is
represented by a pair of distinct numerals. In a
execution-time environment. See run-time environment. floating-point representation, the real number is the
product of the fixed-point part (the first numeral), and
expanded date field. A date field containing an a value obtained by raising the implicit floating-point
expanded (four-digit) year. See also date field and base to a power denoted by the exponent (the second
expanded year. numeral). For example, a floating-point representation
of the number 0.0001234 is: 0.1234 -3, where 0.1234 is
expanded year. A date field that consists only of a
the mantissa and -3 is the exponent.
four-digit year. Its value includes the century: for
example, 1998. Compare with windowed year. external program. The outermost program. A program
that is not nested.
* explicit scope terminator. A reserved word that
terminates the scope of a particular PROCEDURE DIVISION * external switch. A hardware or software device,
statement. defined and named by the implementor, which is used
to indicate that one of two alternate states exists.
exponent. A number that indicates the power to
which another number (the base) is to be raised.
Positive exponents denote multiplication; negative F
exponents denote division; and fractional exponents
denote a root of a quantity. In COBOL, an exponential factory data. Data that is allocated once for a class and
expression is indicated with the symbol ** followed by shared by all instances of the class. Factory data is
the exponent. declared in the WORKING-STORAGE SECTION of the DATA
DIVISION in the FACTORY paragraph of the class
* expression. An arithmetic or conditional expression. definition, and is equivalent to Java private static data.
* extend mode. The state of a file after execution of an factory method. A method that is supported by a class
OPEN statement, with the EXTEND phrase specified for independently of an object instance. Factory methods
that file, and before the execution of a CLOSE statement, are declared in the FACTORY paragraph of the class
without the REEL or UNIT phrase for that file. definition, and are equivalent to Java public static
methods. They are typically used to customize the
Extensible Markup Language. See XML.
creation of objects.
extensions. Certain COBOL syntax and semantics
* figurative constant. A compiler-generated value
supported by IBM compilers in addition to those
referenced through the use of certain reserved words.
described in ANSI Standard.
Glossary 709
* file. A collection of logical records. the alternate record keys, the code set, the minimum
and maximum record size, the record type (fixed or
* file attribute conflict condition. An unsuccessful variable), the collating sequence of the keys for indexed
attempt has been made to execute an input-output files, the blocking factor, the padding character, and the
operation on a file and the file attributes, as specified record delimiter.
for that file in the program, do not match the fixed
attributes for that file. * fixed-length record. A record associated with a file
whose file description or sort-merge description entry
* file clause. A clause that appears as part of any of requires that all records contain the same number of
the following DATA DIVISION entries: file description character positions.
entry (FD entry) and sort-merge file description entry
(SD entry). fixed-point number. A numeric data item defined
with a PICTURE clause that specifies the location of an
* file connector. A storage area that contains optional sign, the number of digits it contains, and the
information about a file and is used as the linkage location of an optional decimal point. The format can
between a file-name and a physical file and between a be either binary, packed decimal, or external decimal.
file-name and its associated record area.
floating-point number. A numeric data item that
FILE-CONTROL. The name of an ENVIRONMENT DIVISION contains a fraction and an exponent. Its value is
paragraph in which the data files for a given source obtained by multiplying the fraction by the base of the
program are declared. numeric data item raised to the power that the
exponent specifies.
* file control entry. A SELECT clause and all its
subordinate clauses that declare the relevant physical * format. A specific arrangement of a set of data.
attributes of a file.
* function. A temporary data item whose value is
* file description entry. An entry in the FILE SECTION determined at the time the function is referenced
of the DATA DIVISION that is composed of the level during the execution of a statement.
indicator FD, followed by a file-name, and then
followed by a set of file clauses as required. * function-identifier. A syntactically correct
combination of character strings and separators that
* file-name. A user-defined word that names a file references a function. The data item represented by a
connector described in a file description entry or a function is uniquely identified by a function-name with
sort-merge file description entry within the FILE its arguments, if any. A function-identifier can include a
SECTION of the DATA DIVISION. reference-modifier. A function-identifier that references
an alphanumeric function can be specified anywhere in
* file organization. The permanent logical file the general formats that an identifier can be specified,
structure established at the time that a file is created. subject to certain restrictions. A function-identifier that
references an integer or numeric function can be
*file position indicator. A conceptual entity that
referenced anywhere in the general formats that an
contains the value of the current key within the key of
arithmetic expression can be specified.
reference for an indexed file, or the record number of
the current record for a sequential file, or the relative function-name. A word that names the mechanism
record number of the current record for a relative file, whose invocation, along with required arguments,
or indicates that no next logical record exists, or that an determines the value of a function.
optional input file is not present, or that the AT END
condition already exists, or that no valid next record function-pointer data item. A data item in which a
has been established. pointer to an entry point can be stored. A data item
defined with the USAGE IS FUNCTION-POINTER clause
* FILE SECTION. The section of the DATA DIVISION that contains the address of a function entry point. Typically
contains file description entries and sort-merge file used to communicate with C and Java programs.
description entries together with their associated record
descriptions.
G
file system. The collection of files and file
management structures on a physical or logical mass garbage collection. The automatic freeing by the Java
storage device, such as a diskette or minidisk. run-time system of the memory for objects that are no
longer referenced.
* fixed file attributes. Information about a file that is
established when a file is created and that cannot * global name. A name that is declared in only one
subsequently be changed during the existence of the program but that can be referenced from the program
file. These attributes include the organization of the file and from any program contained within the program.
(sequential, relative, or indexed), the prime record key,
Glossary 711
* INPUT-OUTPUT SECTION. The section of the * internal data item. A data item that is described in
ENVIRONMENT DIVISION that names the files and the one program in a run unit. An internal data item can
external media required by an object program or have a global name.
method and that provides information required for
transmission and handling of data during execution of internal decimal item. A format in which each byte in
the object program or method definition. a field except the rightmost byte represents two
numeric digits. The rightmost byte contains one digit
* input-output statement. A statement that causes files and the sign. For example, the decimal value +123 is
to be processed by performing operations on individual represented as 0001 0010 0011 1111. Synonymous with
records or on the file as a unit. The input-output packed decimal.
statements are ACCEPT (with the identifier phrase),
CLOSE, DELETE, DISPLAY, OPEN, READ, REWRITE, SET (with * internal file connector. A file connector that is
the TO ON or TO OFF phrase), START, and WRITE. accessible to only one object program in the run unit.
* input procedure. A set of statements, to which * intrarecord data structure. The entire collection of
control is given during the execution of a SORT groups and elementary data items from a logical record
statement, for the purpose of controlling the release of that a contiguous subset of the data description entries
specified records to be sorted. defines. These data description entries include all
entries whose level-number is greater than the
instance data. Data that defines the state of an object. level-number of the first data description entry
The instance data introduced by a class is defined in describing the intra-record data structure.
the WORKING-STORAGE SECTION of the DATA DIVISION in
the OBJECT paragraph of the class definition. The state intrinsic function. A predefined function, such as a
of an object also includes the state of the instance commonly used arithmetic function, called by a built-in
variables introduced by base classes that are inherited function reference.
by the current class. A separate copy of the instance
data is created for each object instance. * invalid key condition. A condition, at run time,
caused when a specific value of the key associated with
* integer. (1) A numeric literal that does not include an indexed or relative file is determined to be not valid.
any digit positions to the right of the decimal point. (2)
A numeric data item defined in the DATA DIVISION that * I-O-CONTROL. The name of an ENVIRONMENT DIVISION
does not include any digit positions to the right of the paragraph in which object program requirements for
decimal point. (3) A numeric function whose definition rerun points, sharing of same areas by several data
provides that all digits to the right of the decimal point files, and multiple file storage on a single input-output
are zero in the returned value for any possible device are specified.
evaluation of the function.
* I-O-CONTROL entry. An entry in the I-O-CONTROL
integer function. A function whose category is paragraph of the ENVIRONMENT DIVISION; this entry
numeric and whose definition does not include any contains clauses that provide information required for
digit positions to the right of the decimal point. the transmission and handling of data on named files
during the execution of a program.
Interactive System Productivity Facility (ISPF). An
IBM software product that provides a menu-driven * I-O mode. The state of a file after execution of an
interface for the TSO or VM user. ISPF includes library OPEN statement, with the I-O phrase specified, for that
utilities, a powerful editor, and dialog management. file and before the execution of a CLOSE statement
without the REEL or UNIT phase for that file.
interlanguage communication (ILC). The ability of
routines written in different programming languages to * I-O status. A conceptual entity that contains the
communicate. ILC support allows the application two-character value indicating the resulting status of an
developer to readily build applications from component input-output operation. This value is made available to
routines written in a variety of languages. the program through the use of the FILE STATUS clause
in the file control entry for the file.
intermediate result. An intermediate field that
contains the results of a succession of arithmetic is-a. A relationship that characterizes classes and
operations. subclasses in an inheritance hierarchy. Subclasses that
have an is-a relationship to a class inherit from that
* internal data. The data that is described in a class.
program and excludes all external data items and
external file connectors. Items described in the LINKAGE ISPF. See Interactive System Productivity Facility (ISPF).
SECTION of a program are treated as internal data.
iteration structure. A program processing logic in
which a series of statements is repeated while a
condition is true or until a condition is true.
Java Database Connectivity (JDBC). A specification last-used state. A state that a program is in if its
from Sun Microsystems that defines an API that internal values remain the same as when the program
enables Java programs to access databases. was exited (the values are not reset to their initial
values).
Java message-processing program (JMP). An IMS
Java application program that is driven by transactions * letter. A character belonging to one of the following
and has access to online IMS databases and message two sets:
queues. 1. Uppercase letters: A, B, C, D, E, F, G, H, I, J, K, L,
M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z
Java message-processing region. An IMS dependent
region in which only Java message-processing 2. Lowercase letters: a, b, c, d, e, f, g, h, i, j, k, l, m, n,
programs are scheduled. o, p, q, r, s, t, u, v, w, x, y, z
Java virtual machine (JVM). A software * level indicator. Two alphabetic characters that
implementation of a central processing unit that runs identify a specific type of file or a position in a
compiled Java programs. hierarchy. The level indicators in the DATA DIVISION are:
CD, FD, and SD.
JavaBeans. A portable, platform-independent, reusable
component model. (Sun) * level-number. A user-defined word (expressed as a
two-digit number) that indicates the hierarchical
JBP. See Java batch-processing program (JBP). position of a data item or the special properties of a
data description entry. Level-numbers in the range from
JDBC. See Java Database Connectivity (JDBC). 1 through 49 indicate the position of a data item in the
hierarchical structure of a logical record. Level-numbers
JMP. See Java message-processing program (JMP). in the range 1 through 9 can be written either as a
single digit or as a zero followed by a significant digit.
job control language (JCL). A control language used
Level-numbers 66, 77, and 88 identify special properties
to identify a job to an operating system and to describe
of a data description entry.
the job’s requirements.
* library-name. A user-defined word that names a
JVM. See Java virtual machine (JVM).
COBOL library that the compiler is to use for
compiling a given source program.
K
* library text. A sequence of text words, comment
K. When referring to storage capacity, two to the tenth lines, the separator space, or the separator pseudotext
power; 1024 in decimal notation. delimiter in a COBOL library.
* key. A data item that identifies the location of a Lilian date. The number of days since the beginning
record, or a set of data items that serve to identify the of the Gregorian calendar. Day one is Friday, October
ordering of data. 15, 1582. The Lilian date format is named in honor of
Luigi Lilio, the creator of the Gregorian calendar.
Glossary 713
* linage-counter. A special register whose value points make file. A text file that contains a list of the files for
to the current position within the page body. your application. The make utility uses this file to
update the target files with the latest changes.
link. (1) The combination of the link connection (the
transmission medium) and two link stations, one at * mass storage. A storage medium in which data can
each end of the link connection. A link can be shared be organized and maintained in both a sequential
among multiple links in a multipoint or token-ring manner and a nonsequential manner.
configuration. (2) To interconnect items of data or
portions of one or more computer programs; for * mass storage device. A device that has a large
example, linking object programs by a linkage editor to storage capacity, such as magnetic disk and magnetic
produce an executable file. drum.
LINKAGE SECTION. The section in the DATA DIVISION of * mass storage file. A collection of records that is
the called program that describes data items available assigned to a mass storage medium.
from the calling program. Both the calling program and
the called program can refer to these data items * megabyte (MB). One megabyte equals 1,048,576
bytes.
linker. A term that refers to either the DFSMS linkage
editor or the DFSMS binder. * merge file. A collection of records to be merged by a
MERGE statement. The merge file is created and can be
literal. A character string whose value is specified used only by the merge function.
either by the ordered set of characters comprising the
string or by the use of a figurative constant. message-processing program (MPP). An IMS
application program that is driven by transactions and
little-endian. The default format that the PC uses to has access to online IMS databases and message
store binary data. In this format, the most significant queues.
digit is on the highest address. Compare with
big-endian. message queue. The data set on which messages are
queued before being processed by an application
local reference. A reference to an object that is within program or sent to a terminal.
the scope of your method.
method. Procedural code that defines an operation
locale. A set of attributes for a program execution supported by an object and that is executed by an
environment indicating culturally sensitive INVOKE statement on that object.
considerations, such as character code page, collating
sequence, date and time format, monetary value * method definition. The COBOL source unit that
representation, numeric value representation, or defines a method.
language.
* method identification entry. An entry in the
* LOCAL-STORAGE SECTION. The section of the DATA METHOD-ID paragraph of the IDENTIFICATION DIVISION;
DIVISION that defines storage that is allocated and freed this entry contains a clause that specifies the
on a per-invocation basis, depending on the value method-name.
assigned in the VALUE clauses.
method invocation. A communication from one object
* logical operator. One of the reserved words AND, to another that requests the receiving object to execute
OR, or NOT. In the formation of a condition, either a method.
AND, or OR, or both can be used as logical
method-name. The name of an object-oriented
connectives. NOT can be used for logical negation.
operation. When used to invoke the method, the name
* logical record. The most inclusive data item. The can be a literal or a data item. When used in the
level-number for a record is 01. A record can be either METHOD-ID paragraph to define the method, the name
an elementary item or a group of items. Synonymous must be a literal.
with record.
* mnemonic-name. A user-defined word that is
* low-order end. The rightmost character of a string of associated in the ENVIRONMENT DIVISION with a specified
characters. implementor-name.
main program. In a hierarchy of programs and MPP. See message-processing program (MPP).
subroutines, the first program that receives control
when the programs are run.
* negated combined condition. The NOT logical * numeric literal. A literal composed of one or more
operator immediately followed by a parenthesized numeric characters that can contain a decimal point or
combined condition. See also condition and combined an algebraic sign, or both. The decimal point must not
condition. be the rightmost character. The algebraic sign, if
present, must be the leftmost character.
* negated simple condition. The NOT logical operator
immediately followed by a simple condition. See also
condition and simple condition. O
nested program. A program that is directly contained object. (1) An entity that has state (its data values)
within another program. and operations (its methods). An object is a way to
encapsulate state and behavior. Each object in the class
* next executable sentence. The next sentence to is said to be an instance of the class. (2) In Visual
which control will be transferred after execution of the Builder, a computer representation of something that a
current statement is complete. user can work with to perform a task. An object can
appear as text or as an icon.
* next executable statement. The next statement to
which control will be transferred after execution of the object code. Output from a compiler or assembler that
current statement is complete. is itself executable machine code or is suitable for
processing to produce executable machine code.
* next record. The record that logically follows the
current record of a file. * OBJECT-COMPUTER. The name of an ENVIRONMENT
DIVISION paragraph in which the computer
* noncontiguous items. Elementary data items in the
environment, where the object program is run, is
WORKING-STORAGE SECTION and LINKAGE SECTION that
described.
bear no hierarchic relationship to other data items.
* object computer entry. An entry in the
nondate. Any of the following:
OBJECT-COMPUTER paragraph of the ENVIRONMENT
v A data item whose date description entry does not DIVISION; this entry contains clauses that describe the
include the DATE FORMAT clause computer environment in which the object program is
v A literal to be executed.
Glossary 715
object deck. A portion of an object program suitable * open mode. The state of a file after execution of an
as input to a linkage editor. Synonymous with object OPEN statement for that file and before the execution of
module and text deck. a CLOSE statement without the REEL or UNIT phrase for
that file. The particular open mode is specified in the
object instance. See object. OPEN statement as either INPUT, OUTPUT, I-O, or EXTEND.
object module. Synonym for object deck or text deck. * operand. (1) The general definition of operand is
“the component that is operated upon.” (2) For the
* object of entry. A set of operands and reserved purposes of this document, any lowercase word (or
words, within a DATA DIVISION entry of a COBOL words) that appears in a statement or entry format can
program, that immediately follows the subject of the be considered to be an operand and, as such, is an
entry. implied reference to the data indicated by the operand.
object-oriented programming. A programming operation. A service that can be requested of an
approach based on the concepts of encapsulation and object.
inheritance. Unlike procedural programming
techniques, object-oriented programming concentrates * operational sign. An algebraic sign that is associated
on the data objects that comprise the problem and how with a numeric data item or a numeric literal, to
they are manipulated, not on how something is indicate whether its value is positive or negative.
accomplished.
* optional file. A file that is declared as being not
* object program. A set or group of executable necessarily present each time the object program is run.
machine-language instructions and other material The object program causes an interrogation for the
designed to interact with data to provide problem presence or absence of the file.
solutions. In this context, an object program is generally
the machine language result of the operation of a * optional word. A reserved word that is included in
COBOL compiler on a source program. Where there is a specific format only to improve the readability of the
no danger of ambiguity, the word program can be used language. Its presence is optional to the user when the
in place of object program. format in which the word appears is used in a source
program.
object reference. A value that identifies an instance of
a class. If the class is not specified, the object reference * output file. A file that is opened in either output
is universal and can apply to instances of any class. mode or extend mode.
* object time. The time at which an object program is * output mode. The state of a file after execution of an
executed. Synonymous with run time. OPEN statement, with the OUTPUT or EXTEND phrase
specified, for that file and before the execution of a
* obsolete element. A COBOL language element in CLOSE statement without the REEL or UNIT phrase for
Standard COBOL that is to be deleted from the next that file.
revision of Standard COBOL.
* output procedure. A set of statements to which
ODBC. See Open Database Connectivity (ODBC). control is given during execution of a SORT statement
after the sort function is completed, or during
ODO object. In the example below, X is the object of execution of a MERGE statement after the merge function
the OCCURS DEPENDING ON clause (ODO object). reaches a point at which it can select the next record in
WORKING-STORAGE SECTION merged order when requested.
01 TABLE-1.
05 X PICS9. overflow condition. A condition that occurs when a
05 Y OCCURS 3 TIMES portion of the result of an operation exceeds the
DEPENDING ON X PIC X. capacity of the intended unit of storage.
The value of the ODO object determines how many of overload. To define a method with the same name as
the ODO subject appear in the table. another method that is available in the same class, but
with a different signature. See also signature.
ODO subject. In the example above, Y is the subject
of the OCCURS DEPENDING ON clause (ODO subject). The override. To redefine an instance method (inherited
number of Y ODO subjects that appear in the table from a parent class) in a subclass.
depends on the value of X.
* padding character. An alphanumeric character that pointer data item. A data item in which address
is used to fill the unused character positions in a values can be stored. Data items are explicitly defined
physical record. as pointers with the USAGE IS POINTER clause. ADDRESS
OF special registers are implicitly defined as pointer
page. A vertical division of output data that represents data items. Pointer data items can be compared for
a physical separation of the data. The separation is equality or moved to other pointer data items.
based on internal logical requirements or external
characteristics of the output medium or both. port. (1) To modify a computer program to enable it to
run on a different platform. (2) In the Internet suite of
* page body. That part of the logical page in which protocols, a specific logical connector between the
lines can be written or spaced or both. Transmission Control Protocol (TCP) or the User
Datagram Protocol (UDP) and a higher-level protocol
* paragraph. In the PROCEDURE DIVISION, a or application. A port is identified by a port number.
paragraph-name followed by a separator period and by
zero, one, or more sentences. In the IDENTIFICATION portability. The ability to transfer an application
DIVISION and ENVIRONMENT DIVISION, a paragraph program from one application platform to another with
header followed by zero, one, or more entries. relatively few changes to the source program.
* paragraph header. A reserved word, followed by the preinitialization. The initialization of the COBOL
separator period, that indicates the beginning of a run-time environment in preparation for multiple calls
paragraph in the IDENTIFICATION DIVISION and from programs, especially non-COBOL programs. The
ENVIRONMENT DIVISION. The permissible paragraph environment is not terminated until an explicit
headers in the IDENTIFICATION DIVISION are: termination.
PROGRAM-ID. (Program IDENTIFICATION DIVISION)
CLASS-ID. (Class IDENTIFICATION DIVISION) * prime record key. A key whose contents uniquely
METHOD-ID. (Method IDENTIFICATION DIVISION) identify a record within an indexed file.
AUTHOR.
INSTALLATION. * priority-number. A user-defined word that classifies
DATE-WRITTEN. sections in the PROCEDURE DIVISION for purposes of
DATE-COMPILED. segmentation. Segment numbers can contain only the
SECURITY. characters 0 through 9. A segment number can be
expressed as either one or two digits.
The permissible paragraph headers in the ENVIRONMENT
DIVISION are: private. As applied to factory data or instance data,
SOURCE-COMPUTER. accessible only by methods of the class that defines the
OBJECT-COMPUTER. data.
SPECIAL-NAMES.
REPOSITORY. (Program or Class * procedure. A paragraph or group of logically
CONFIGURATION SECTION) successive paragraphs, or a section or group of
FILE-CONTROL. logically successive sections, within the PROCEDURE
I-O-CONTROL. DIVISION.
* paragraph-name. A user-defined word that identifies * procedure branching statement. A statement that
and begins a paragraph in the PROCEDURE DIVISION. causes the explicit transfer of control to a statement
other than the next executable statement in the
parameter. (1) Data passed between a calling program sequence in which the statements are written in the
and a called program. (2) A data element in the USING source program. The procedure branching statements
clause of a method call. Arguments provide additional are: ALTER, CALL, EXIT, EXIT PROGRAM, GO TO, MERGE (with
information that the invoked method can use to the OUTPUT PROCEDURE phrase), PERFORM and SORT (with
perform the requested operation. the INPUT PROCEDURE or OUTPUT PROCEDURE phrase).
Persistent Reusable JVM. A JVM that can be serially PROCEDURE DIVISION. One of the four main component
reused for transaction processing by resetting the JVM parts of a COBOL program, class definition, or method
between transactions. The reset phase restores the JVM definition. The PROCEDURE DIVISION contains
to a known initialization state. instructions for solving a problem. The PROCEDURE
DIVISION for a program or method can contain
* phrase. A phrase is an ordered set of one or more imperative statements, conditional statements,
consecutive COBOL character strings that form a compiler-directing statements, paragraphs, procedures,
portion of a COBOL procedural statement or of a and sections. The PROCEDURE DIVISION for a class
COBOL clause. contains only method definitions.
Glossary 717
procedure integration. One of the functions of the Character Meaning
COBOL optimizer is to simplify calls to performed . Period (full stop)
procedures or contained programs.
“ Quotation mark
PERFORM procedure integration is the process whereby a ( Left parenthesis
PERFORM statement is replaced by its performed ) Right parenthesis
procedures. Contained program procedure integration Space
is the process where a call to a contained program is
= Equal sign
replaced by the program code.
recursion. A program calling itself or being directly or IS LESS THAN Less than
indirectly called by a one of its called programs. IS < Less than
IS NOT LESS THAN Not less than
recursively capable. A program is recursively capable IS NOT < Not less than
(can be called recursively) if the RECURSIVE attribute is
on the PROGRAM-ID statement.
IS EQUAL TO Equal to
reel. A discrete portion of a storage medium, the IS = Equal to
dimensions of which are determined by each IS NOT EQUAL TO Not equal to
implementor that contains part of a file, all of a file, or IS NOT = Not equal to
any number of files. Synonymous with unit and volume.
IS GREATER THAN OR EQUAL Greater than or equal to
reentrant. The attribute of a program or routine that TO
allows more than one user to share a single copy of a
IS >= Greater than or equal to
load module.
* reference format. A format that provides a standard IS LESS THAN OR EQUAL TO Less than or equal to
method for describing COBOL source programs. IS <= Less than or equal to
Glossary 719
ring. In the COBOL editor, a set of files that are selection structure. A program processing logic in
available for editing so that you can easily more which one or another series of statements is executed,
between them. depending on whether a condition is true or false.
routine. A set of statements in a COBOL program that * sentence. A sequence of one or more statements, the
causes the computer to perform an operation or series last of which is terminated by a separator period.
of related operations. In Language Environment, refers
to either a procedure, function, or subroutine. * separately compiled program. A program that,
together with its contained programs, is compiled
* routine-name. A user-defined word that identifies a separately from all other programs.
procedure written in a language other than COBOL.
* separator. A character or two contiguous characters
* run time. The time at which an object program is used to delimit character strings.
executed. Synonymous with object time.
* separator comma. A comma (,) followed by a space
run-time environment. The environment in which a used to delimit character strings.
COBOL program executes.
* separator period. A period (.) followed by a space
* run unit. A stand-alone object program, or several used to delimit character strings.
object programs, that interact via COBOL CALL
statements, which function at run time as an entity. * separator semicolon. A semicolon (;) followed by a
space used to delimit character strings.
scope terminator. A COBOL reserved word that marks * sequential access. An access mode in which logical
the end of certain PROCEDURE DIVISION statements. It records are obtained from or placed into a file in a
can be either explicit (END-ADD, for example) or implicit consecutive predecessor-to-successor logical record
(separator period). sequence determined by the order of records in the file.
* section. A set of zero, one or more paragraphs or * sequential file. A file with sequential organization.
entities, called a section body, the first of which is
preceded by a section header. Each section consists of * sequential organization. The permanent logical file
the section header and the related section body. structure in which a record is identified by a
predecessor-successor relationship established when the
* section header. A combination of words followed by record is placed into the file.
a separator period that indicates the beginning of a
section in any of these divisions: ENVIRONMENT, DATA, or serial search. A search in which the members of a set
PROCEDURE. In the ENVIRONMENT DIVISION and DATA are consecutively examined, beginning with the first
DIVISION, a section header is composed of reserved member and ending with the last.
words followed by a separator period. The permissible
section headers in the ENVIRONMENT DIVISION are: session bean. In EJB, an enterprise bean that is created
by a client and that usually exists only for the duration
CONFIGURATION SECTION.
of a single client/server session. (Sun)
INPUT-OUTPUT SECTION.
* 77-level-description-entry. A data description entry
The permissible section headers in the DATA DIVISION that describes a noncontiguous data item with the
are: level-number 77.
FILE SECTION.
WORKING-STORAGE SECTION. * sign condition. The proposition (for which a truth
LOCAL-STORAGE SECTION. value can be determined) that the algebraic value of a
LINKAGE SECTION. data item or an arithmetic expression is either less than,
greater than, or equal to zero.
In the PROCEDURE DIVISION, a section header is
composed of a section-name, followed by the reserved signature. (1) The name of an operation and its
word SECTION, followed by a separator period. parameters. (2) The name of a method and the number
and types of its formal parameters.
* section-name. A user-defined word that names a
section in the PROCEDURE DIVISION. * simple condition. Any single condition chosen from
the set:
Glossary 721
having a single entry point and a single exit point.
Control is passed downward through the structure
T
without unconditional branches to higher levels of the
* table. A set of logically consecutive items of data
hierarchy.
that are defined in the DATA DIVISION by means of the
* subclass. A class that inherits from another class. OCCURS clause.
When two classes in an inheritance relationship are
* table element. A data item that belongs to the set of
considered together, the subclass is the inheritor or
repeated items comprising a table.
inheriting class; the superclass is the inheritee or
inherited class. text deck. Synonym for object deck or object module.
* subject of entry. An operand or reserved word that * text-name. A user-defined word that identifies
appears immediately following the level indicator or library text.
the level-number in a DATA DIVISION entry.
* text word. A character or a sequence of contiguous
* subprogram. See called program. characters between margin A and margin R in a
COBOL library, source program, or pseudotext that is
* subscript. An occurrence number that is represented
any of the following characters:
by either an integer, a data-name optionally followed
by an integer with the operator + or -, or an v A separator, except for space; a pseudotext delimiter;
index-name optionally followed by an integer with the and the opening and closing delimiters for
operator + or -, that identifies a particular element in a nonnumeric literals. The right parenthesis and left
table. A subscript can be the word ALL when the parenthesis characters, regardless of context within
subscripted identifier is used as a function argument the library, source program, or pseudotext, are
for a function allowing a variable number of always considered text words.
arguments. v A literal including, in the case of nonnumeric literals,
the opening quotation mark and the closing
* subscripted data-name. An identifier that is quotation mark that bound the literal.
composed of a data-name followed by one or more
v Any other sequence of contiguous COBOL characters
subscripts enclosed in parentheses.
except comment lines and the word COPY bounded
* superclass. A class that is inherited by another class. by separators that are neither a separator nor a
See also subclass. literal.
surrogate pair. In the UTF-16 format of Unicode, a thread. A stream of computer instructions (initiated by
pair of encoding units that together represents a single an application within a process) that is in control of a
Unicode character. The first unit of the pair is called a process.
high surrogate and the second a low surrogate. The code
token. In the COBOL editor, a unit of meaning in a
value of a high surrogate is in the range X’D800’
program. A token can contain data, a language
through X’DBFF’. The code value of a low surrogate is
keyword, an identifier, or other part of the language
in the range X’DC00’ through X’DFFF’. Surrogate pairs
syntax.
provide for more characters than the 65,536 characters
that fit in the Unicode 16-bit coded character set. top-down design. The design of a computer program
using a hierarchic structure in which related functions
switch-status condition. The proposition (for which a
are performed at each level of the structure.
truth value can be determined) that an UPSI switch,
capable of being set to an on or off status, has been set top-down development. See structured programming.
to a specific status.
trailer-label. (1) A file or data set label that follows the
* symbolic-character. A user-defined word that data records on a unit of recording medium. (2)
specifies a user-defined figurative constant. Synonym for end-of-file label.
syntax. (1) The relationship among characters or troubleshoot. To detect, locate, and eliminate
groups of characters, independent of their meanings or problems in using computer software.
the manner of their interpretation and use. (2) The
structure of expressions in a language. (3) The rules * truth value. The representation of the result of the
governing the structure of a language. (4) The evaluation of a condition in terms of one of two values:
relationship among symbols. (5) The rules for the true or false.
construction of a statement.
typed object reference. A data-name that can refer
* system-name. A COBOL word that is used to only to an object of a specified class or any of its
communicate with the operating environment. subclasses.
UPSI switch. A program switch that performs the * word. A character string of not more than 30
functions of a hardware switch. Eight are provided: characters that forms a user-defined word, a
UPSI-0 through UPSI-7. system-name, a reserved word, or a function-name.
* user-defined word. A COBOL word that must be * WORKING-STORAGE SECTION. The section of the DATA
supplied by the user to satisfy the format of a clause or DIVISION that describes working-storage data items,
statement. composed either of noncontiguous items or
working-storage records or of both.
V workstation. A generic term for computers used by
end users including personal computers, 3270
* variable. A data item whose value can be changed terminals, intelligent workstations, and UNIX terminals.
by execution of the object program. A variable used in Often a workstation is connected to a mainframe or to
an arithmetic expression must be a numeric elementary a network.
item.
wrapper. An object that provides an interface between
* variable-length record. A record associated with a object-oriented code and procedure-oriented code.
file whose file description or sort-merge description Using wrappers allows programs to be reused and
entry permits records to contain a varying number of accessed by other systems.
character positions.
Glossary 723
it much easier to write applications to handle
document types, author and manage structured
information, and transmit and share structured
information across diverse computing systems. The use
of XML does not require the robust applications and
processing that is necessary for SGML. XML is
developed under the auspices of the World Wide Web
Consortium (W3C).
Y
year field expansion. Explicitly expanding date fields
that contain two-digit years to contain four-digit years
in files and databases and then using these fields in
expanded form in programs. This is the only method
for assuring reliable date processing for applications
that have used two-digit years.
Z
zoned decimal item. See external decimal item.
Dialog Developer’s Guide and Reference, SC34-4821 z/OS CD Collection Kit, SK3T-4269
Index 729
compilation (continued) compiler options (continued) compiling (continued)
with HFS files 240 EXIT 301, 611 control of 258
COMPILE compiler option EXPORTALL 301 data sets for 253
description 294 FASTSRT 191, 302, 563 from an assembler program 251
use NOCOMPILE to find syntax FLAG 302, 344 OO applications
errors 342 FLAGSTD 303 example 279, 283
compile-time considerations for debugging 341 under UNIX 277
compiler directed errors 266 IMS, recommended for 391 using JCL or TSO/E 281
display compile and link steps 274 in effect 359 under TSO 249
error message severity 267 INTDATE 304 under UNIX 269
executing compile and link steps after LANGUAGE 305 under z/OS 237
display 274 LIB 306 using shell script 275
compile-time dump, generating 300 LINECOUNT 306 using the cob2 command 271
compile-time error messages LIST 306, 347, 350 examples 272
choosing severity to be flagged 344 MAP 307, 346, 347, 350 with cataloged procedures 238
determining what severity level to NAME 308 compile 239
produce 302 NOCOMPILE 342 compile and link-edit 240
embedding in source listing 344 NOFASTSRT 193 compile, link-edit, run 241
compiler NSYMBOL 309 compile, load, run 242
calculation of intermediate NUMBER 309, 348 compile, prelink, link-edit 243
results 578 NUMPROC 310 compile, prelink, link-edit,
generating list of error messages 265 NUMPROC(PFD) 563 run 245
invoking in the UNIX shell 271 NUMPROC(PFD|NOPFD|MIG) 45 compile, prelink, load, run 247
examples 272 OBJECT 311 with JCL (job control language) 237
limits 12 OFFSET 312, 350 compiling and linking in the UNIX
compiler data sets on compiler invocation 350 shell 271
in the HFS 239, 248 OPTIMIZE 312, 560, 563 examples 272
input and output 253 OUTDD 313 OO applications
required for compilation 253 performance considerations 563 example 279
SYSADATA (ADATA records) 257 PGMNAME 314 completion code, sort 190
SYSDEBUG (debug records) 257 precedence of 258 complex OCCURS DEPENDING ON
SYSIN (source code) 255 QUOTE 316 basic forms of 587
SYSJAVA 257 RENT 316, 563 complex ODO item 587
SYSLIB (libraries) 255 RMODE 317 variably located data item 588
SYSLIN (object code) 256 RMODE and performance 563 variably located group 588
SYSOUT (listing) 256 SEQUENCE 318, 343 computation
SYSPUNCH (object code) 256 settings for COBOL 85 Standard 289 arithmetic data items 555
SYSTERM (messages) 256 signature bytes 359 constant data items 554
with cob2 274 SIZE 318 duplicate 555
compiler error messages SOURCE 319, 347 subscript 558
from exit modules 619 SPACE 319 COMPUTATIONAL (COMP) 41
sending to terminal 256 specifying 258 COMPUTATIONAL-1 (COMP-1) 42, 556
compiler listings PROCESS (CBL) statement 258 COMPUTATIONAL-2 (COMP-2) 42, 556
getting 347 specifying under TSO 259 COMPUTATIONAL-3 (COMP-3)
compiler messages specifying under UNIX 270 date fields, potential problems 548
analyzing 546 specifying under z/OS 259 description 42
compiler options SQL 320, 387 COMPUTATIONAL-4 (COMP-4) 41
ADATA 290 SSRANGE 321, 343, 563 COMPUTATIONAL-5 (COMP-5) 41
APOST 316 status 350 computer, describing 7
ARITH 291 TERMINAL 321 concatenating data items 87
AWO 292 TEST 322, 350, 371, 563 condition handling 132, 162, 571
AWO and performance 563 THREAD 325 in input or output procedures 185
batch hierarchy example 263 TRUNC 326 condition testing 80
BUFSIZE 292 TRUNC(STD|OPT|BIN) 563 condition-name 537
CICS 293 under CICS 378 conditional expression
CODEPAGE 294 under IMS and CICS 378 EVALUATE statement 76
COMPILE 294 VBREF 329, 347 IF statement 75
conflicting 289 WORD 329 PERFORM statement 84
CURRENCY 295 XREF 330, 345 with national data 79
DATA 296 YEARWINDOW 331 conditional statement
DATEPROC 297 ZWB 331 in EVALUATE statement 76
DBCS 298 compiler-directing statements list of 19
DECK 298 description 332 overview 19
DIAGTRUNC 299 list 20 with NOT phrase 19
DLL 299 overview 20 with object references 479
DUMP 300 compiling CONFIGURATION SECTION 7
DYNAM 301, 563 batch 261 conflicting compiler options 289
Index 731
data set (continued) DD control statement (continued) developing programs for CICS 375
SYSTERM 256 creating QSAM files 134, 135 device
used interchangeably for file 7 DCB overrides data set label 135 classes 253
data sets define file 10 requirements 253
required for compilation, z/OS 253 defining sort data sets 185 DFCOMMAREA parameter for
used for compilation 253 JAVAERR 283 CALL 377
data-definition attribute codes 352 JAVAIN 283 DFHEIBLK parameter for CALL 377
data-name JAVAOUT 283 DFSORT
cross-reference 368 RLS parameter 170 using 185
cross-reference list 259 SYSADATA 257 diagnostic messages
in MAP listing 352 SYSDEBUG 257 from millennium language
OMITTED 13 SYSIN 255 extensions 546
password for VSAM files 164 SYSJAVA 257 diagnostics, program 350
date and time operations SYSLIB 255 DIAGTRUNC compiler option 299
Language Environment callable SYSLIN 256 direct-access
services 571 SYSPRINT 256 direct indexing 63
date arithmetic 543 SYSPUNCH 256 file organization 114
date comparisons 534 ddname definition 10 storage device (DASD) 171
date field expansion deadlock directories
advantages 530 in I/O error declarative 227 adding a path to 273
description 532 Debug Tool where error listing file is written 266
date fields compiler options for maximum DISK compiler option 287
potential problems 548 support 371 DISPLAY (USAGE IS)
date operations description 337 encoding 106
intrinsic functions 33 debugging external decimal 40
date processing with internal bridges and performance 323 DISPLAY statement
advantages 530 approaches 337 directing output 313
date windowing defining data set 257 displaying data values 30
advantages 530 dynamic 323 interaction with OUTDD 30
example 536 useful compiler options 341 using in debugging 338
how to control 545 using COBOL language features 338 writing to stdout/stderr 31
MLE approach 530 debugging, language features DISPLAY-OF intrinsic function
when not supported 536 class test 339 using 108
DATE-COMPILED paragraph 5 debugging declaratives 340 with XML document 213
DATE-OF-INTEGER intrinsic file status keys 339 DLL compiler option
function 52 INITIALIZE statements 339 description 299
DATEPROC compiler option scope terminators 338 for Java interoperability 277, 281
analyzing warning-level diagnostic SET statements 339 for OO COBOL 277, 281
messages 546 DECK compiler option 298 multioption interaction 289
description 297 declarative procedures DLL igzcjava.x
DATEVAL intrinsic function 545 EXCEPTION/ERROR 227 binding with 282
DB2 with multithreading 227 example 283
COBOL language usage with SQL LABEL 142 linking with 278
statements 385, 386 USE FOR DEBUGGING 340 example 279
coding considerations 385 deferred restart 523 DLL libjvm.x
coprocessor 388 defining binding with 282
options 387 debug data set 257 example 283
return codes 387 files, overview 10, 113 linking with 278
SQL DECLARE statement 385 libraries 255 example 279
SQL INCLUDE statement 385 line-sequential files with EBCDIC services 511
SQL statements 385 to z/OS 175 DLLs (see dynamic link libraries) 437
DBCS QSAM files do loop 84
compiler option 289, 298 to z/OS 134, 135 do-until 84
converting 111, 593 sort files do-while 84
encoding 106 under z/OS 185 DOCUMENT-TYPE-DECLARATION
user-defined words in XREF VSAM files 165 XML event 203
output 345 to z/OS 165 documentation of program 7
DBCS compiler option DELETE statement DSA memory map 356
for Java interoperability 277, 281 compiler-directing 332 dump
for OO COBOL 277, 281 multithreading serialization 452 with DUMP compiler option 259
DBCSXREF 346 VSAM, coding 155 DUMP compiler option
dbg extension with cob2 274 deleting records from VSAM file 162 description 300
DCB 129 delimited scope statement multioption interaction 289
DD control statement description of 19 output 259
AMP parameter 169 nested 21 duplicate computations 555
ASCII tape files 144 DEPENDING ON option 122, 154 DYNAM compiler option
creating line-sequential files 175 depth in tables 60 description 301
Index 733
factory methods FILE SECTION (continued) fixed-length records (continued)
defining 489 RECORD IS VARYING 13 VSAM 148, 154
definition of 459 RECORDING MODE clause 13 fixed-point arithmetic
hiding 491 VALUE OF 13 comparisons 54
invoking 491 FILE STATUS clause evaluation 53
using to wrap procedural description 118 example evaluations 55
programs 497 line-sequential error processing 178 exponentiation 580
FACTORY paragraph NOFASTSRT error processing 193 fixed-point data
factory data 489 QSAM error processing 133 binary 41
factory methods 489 using 228 conversions between fixed- and
factory section, defining 488 VSAM error processing 163 floating-point data 43
FASTSRT compiler option VSAM file loading 159 external decimal 40
description 302 with VSAM return code 229 intermediate results 579
improving sort performance 191, 563 file status code packed-decimal 42
information message 191 02 160 planning use of 555
requirements 191 05 157 FLAG compiler option
FD (file description) entry 13 35 157 compiler output 344
figurative constants 37 129 description 302
definition 24 39 130, 137, 140, 157 using 344
national characters as 106 49 162 flags and switches 80
file access mode 90 128 FLAGSTD compiler option 303
dynamic 153 92 401 floating-point arithmetic
example 154 using 223 comparisons 54
for indexed files (KSDS) 153 file status key evaluation 53
for relative files (RRDS) 153 checking for successful OPEN 228, example evaluations 55
for sequential files (ESDS) 153 229 exponentiation 585
performance considerations 171 set for error handling 118, 339 floating-point data
random 153 to check for I/O errors 228 conversions between fixed- and
sequential 153 used with VSAM return code 229 floating-point data 44
summary table of 115, 149 file-name external floating point 40
file allocation 117 specification 13 intermediate results 584
file availability FILEDEF command internal 42
VSAM files under z/OS 165 ASCII tape files 144 planning use of 555
file conversion files format of record
with millennium language associating program files to external fixed-length 121, 154
extensions 533 files 7 for QSAM ASCII tape 144
file description (FD) entry 13 COBOL coding format D 122, 123, 144
file extensions DATA DIVISION entries 120, 154, format F 121, 144
for error messages listing 266 174 format S 125
file name ENVIRONMENT DIVISION format U 126, 144
change 11 entries 119, 149, 173 format V 122, 123, 144
file organization input/output statements 129, 155, spanned 125
comparison of ESDS, KSDS, 175 undefined 126
RRDS 148 overview 116 variable-length 122, 123, 154
indexed 113, 150 defining to operating system 10 formatted dump 221
line-sequential 173 describing 12 freeing object instances 483
overview 113 description of optional 130, 158 full date field expansion
QSAM 119 identifying to z/OS 134, 135, 165, advantages 530
relative 113 175 function-pointer data item
relative-record 151 improving sort performance 191 addressing JNI services 625
sequential 113, 150 labels 145 CALL statement 421
summary table of 115 overview 114 calling DLL program
VSAM 148 processing example 444
file position indicator (CRP) 157, 160 line-sequential 173 SET function-pointer 420
FILE SECTION QSAM 119 versus procedure-pointer 421
BLOCK CONTAINS clause 13 VSAM 147
CODE-SET clause 13 usage explanation 11
DATA RECORDS clause 13
description 12
used interchangeably for data set 7
with multithreading 452
G
garbage collection 483
EXTERNAL clause 13 finding
get and set methods 473
FD entry 13 date of compilation 101
GETMAIN, saving address of 612
GLOBAL clause 13 largest or smallest data item 99
GLOBAL clause for files 13, 16
LABEL RECORDS clause 13 length of data items 101
global names 418
LINAGE clause 13 fixed century window 530
GO TO MORE-LABELS 142
OMITTED 13 fixed-length records
GOBACK statement
RECORD CONTAINS clause 13 format 154
in main program 408
record description 12 QSAM 121
in subprogram 408
Index 735
intrinsic functions (continued) Java (continued) JCL
example of (continued) arrays (continued) ASCII tape files 144
NUMVAL-C 51, 97 manipulating 507 cataloged procedures 238
ORD 99 boolean array 506 checkpoint/restart sample 525
ORD-MAX 74, 100 boolean type 506 FASTSRT requirement 191
PRESENT-VALUE 52 byte array 506 for compiling 237
RANGE 53, 74 byte type 506 for compiling with HFS 240
REM 53 char array 506 for line-sequential files 175
REVERSE 97 char type 506 for OO applications 281
SQRT 53 class types 506 example 283
SUM 74 double array 507 for QSAM files 135
UPPER-CASE 97 double type 506 for Sort 185
WHEN-COMPILED 101 example for VSAM data sets 168
intermediate results 583, 585 exception handling 503 JNI
introduction to 32 J2EE client 512 accessing services 501
nesting 33 processing an array 509 comparing object references 479
numeric functions exception converting local references to
differences from Language catching 503 global 482
Environment callable example 503 EBCDIC services 510
services 50 handling 502 environment structure 501
equivalent Language Environment throwing 503 addressability for 502
callable services 49 float array 507 exception handling services 502
examples of 48 float type 506 Java array services 507
nested 49 global references 504 Java string services 510
special registers as arguments 49 JNI services 505 obtaining class object reference 502
table elements as arguments 49 managing 504 restrictions when using 502
type of integer, floating-point, object 504 Unicode services 510
mixed 48 passing 504 JNI.cpy
uses for 48 int array 506 for compiling 277
processing table elements 73 int type 506 for JNINativeInterface 501
simplifying coding 569 interoperability 501 listing 625
UNDATE 545 interoperable data types, coding 506 JNIEnvPtr special register 501
INVALID KEY phrase 231 jstring class 505 JNINativeInterface
INVOKE statement local references 504 environment structure 501
use with PROCEDURE DIVISION deleting 504 JNI.cpy 501
RETURNING 430 freeing 504 job resubmission 525
using to create objects 482 JNI services 505 job stream 407
using to invoke methods 480 managing 504 jstring Java class 505
with ON EXCEPTION 480, 492 object 504
invoking passing 504
COBOL UNIX programs 397
factory or static methods 491
per multithreading 504
saving 504
K
KSDS (key-sequenced data sets)
instance methods 480 long array 506
file access mode 153
Language Environment callable long type 506
organization 150
services 573 methods
ISAM data set 147 access control 505
ISPF (Interactive System Productivity object array 506
Facility) 683 record class 505 L
running with COBOL 279, 283 LABEL declarative
sharing data with 505 description 332
J short array 506
short type 506
GO TO MORE-LABELS 142
handling user labels 142
J2EE client
string array 506 LABEL RECORDS clause
example 512
strings FILE SECTION entry 13
running 280
declaring 506 LABEL= 144
Java
manipulating 510 labels
and COBOL 501
Java virtual machine ASCII file 145
binding 282
exceptions 503 format, standard 143
compiling under UNIX 277
initializing 280 processing, QSAM files 141
compiling using JCL or
object references 504 standard user 143
TSO/E 281
java.lang.Object LANGUAGE compiler option 305
linking 278
referring to as Base 464 Language Environment callable services
running 279, 283
javac command 277 condition handling 571
structuring applications 498
JAVAERR data set 283 corresponding intrinsic functions 49
array classes 505
JAVAIN data set 283 date and time computations 571
arrays
JAVAOUT data set 283 differences from intrinsic
declaring 506
functions 50
example 509
Index 737
MERGE statement multitasking (continued) national data (continued)
description 180 sort under 179 input with ACCEPT 29
message handling, Language multithreading joining 87
Environment callable services 571 AMODE setting 455 LENGTH intrinsic function 101
messages asynchronous signals 455 LENGTH OF special register 101
compile-time error choosing data section 449 MOVE statement 28
choosing severity to be in an OO client 478 NATIONAL-OF intrinsic 107
flagged 344 closing QSAM files 133 output with DISPLAY 30
embedding in source listing 344 closing VSAM files 163 reference modification 93
compiler error COBOL programs 449 specifying 105
sending to terminal 256 coding file I/O 452 spliting 89
compiler-directed 266 control transfer issues 451 tallying and replacing 95
determining what severity level to example of file I/O usage 453 National Language Support 305
produce 302 EXIT PROGRAM statement 408 national languages
from exit modules 619 GOBACK statement 408 run-time use 103
generating a list of 265 I/O error declaratives 227 NATIONAL-OF intrinsic function
severity levels 267 IGZBRDGE 455 using 107
METHOD-ID paragraph 468 IGZEOPT 455 with XML document 213
methods IGZETUN 455 nested COPY statement 569, 615
constructor 489 interlanguage communication 407 nested delimited scope statements 21
factory 489 limitations on COBOL 454 nested IF statement
hiding factory 491 nested programs 454 coding 76
instance 467, 487 older compilers 455 CONTINUE statement 76
invoking 480, 491 overview 449 EVALUATE statement preferred 76
invoking superclass 481 preinitializing 452 with null branches 76
Java access control 505 preparing COBOL programs for 449 nested intrinsic functions 49
obtaining passed arguments 470 recursion 451 nested program integration 561
overloading 472 recursive requirement 454 nested program map
overriding 471, 491 reentrancy 454 description 347
PROCEDURE DIVISION reentrancy requirement 454 example 356
RETURNING 431 run-time restrictions 455 nested programs
returning a value from 471 STOP RUN statement 408 calling 416
signature 468 synchronizing access to conventions for using 416
millennium language extensions resources 454 description 416
assumed century window 538 terminology 450 map 347, 356
compatible dates 535 THREAD compiler option scope of names 418
concepts 528 restrictions under 325 transfer of control 416
date windowing 527 when to choose 451 nesting level
DATEPROC compiler option 297 UPSI switches 455 program 351, 356
nondates 539 with PL/I tasks 407 statement 351
objectives 529 NOCOMPILE compiler option
principles 528 use of to find syntax errors 342
YEARWINDOW compiler option 331
MIN intrinsic function 95, 99
N NODYNAM compiler option
under CICS 377
NAME compiler option
mixed DBCS/EBCDIC literal NOFASTSRT compiler option 193, 196
description 308
alphanumeric to DBCS nondates
using 5
conversion 593 with MLE 539
name declaration
DBCS to alphanumeric Notices 699
searching for 418
conversion 595 NSYMBOL compiler option
naming
MLE 528 description 309
files 10
mnemonic-name for national data items 106
programs 5
SPECIAL-NAMES paragraph 7 for national literals 106
national
modules, exit null branch 76
literal 106
loading and invoking 613 null-terminated strings 91, 426
national condition 79
MOVE statement NUMBER compiler option
national data
using 27 description 309
comparing to alphabetic or
with national items 28, 107 for debugging 348
alphanumeric 111
MSGFILE run-time option 313 NUMCLS installation option 46
comparing to groups 111
multiple currency signs numeric class test 46
comparing to numeric 111
example 56 numeric condition 79
converting 107
using 55 numeric data
Chinese GB 18030 110
multiple inheritance, not permitted 462, binary
example 108
484 USAGE IS BINARY 41
exceptions 108
multiple thread environment, running USAGE IS COMPUTATIONAL
UTF-8 109
in 325 (COMP) 41
DISPLAY-OF intrinsic 108
multitasking USAGE IS COMPUTATIONAL-4
in conditional expression 79, 110
merge under 179 (COMP-4) 41
in XML document 213
Index 739
OUTDD compiler option password (continued) PICTURE clause
DD not allocated 30 VSAM files 164 determining symbol used 295
description 313 PASSWORD clause 164 numeric data 37
interaction with DISPLAY 30 PATH environment variable 282, 399 PL/I tasking
output path name POSIX run-time option 454
coding for line-sequential files 175 for copybook search 273, 332 with COBOL 407
coding for QSAM files 129 PERFORM statement pointer data item
coding for VSAM files 155 . . .THRU 85 description 33
coding in CICS 376 coding loops 82 incrementing addresses with 428
data set 256 for a table 66 NULL value 427
files 113 indexing 63 used to pass addresses 427
from compiler, under z/OS 253 inline 83 used to process chained list 427, 428
output file with cob2 274 out-of-line 83 porting your program 38
output procedure performed a definite number of POSIX
FASTSRT option not effective 191 times 84 calling APIs 400
requires RETURN or RETURN INTO TEST AFTER 84 threads 454
statement 183 TEST BEFORE 84 POSIX run-time option
restrictions 185 TIMES 84 affect on DLL search order 442
using 183 UNTIL 84 use in OO applications 283
overflow condition 222, 233 VARYING 85 potential problems with date fields 548
overloading instance methods 472 VARYING WITH TEST AFTER 85 precedence
overriding WITH TEST AFTER . . . UNTIL 84 arithmetic operators 48, 579
factory methods 491 WITH TEST BEFORE . . . UNTIL 84 compiler options under z/OS 258
instance methods 471 performance preferred sign 45
AIXBLD run-time option 567 preinitializing
and debugging 323 with multithreading 452
P APPLY WRITE-ONLY clause 12
arithmetic expressions 556
prelinking cataloged procedure
compile, prelink, link-edit 243
PACKED-DECIMAL
blocking QSAM files 127 compile, prelink, link-edit, run 245
synonym 39
CBLPSHPOP run-time option 383 compile, prelink, load, run 247
packed-decimal data item
CICS environment 566 prelink and link-edit 246
date fields, potential problems 548
coding 553 PRESENT-VALUE intrinsic function 52
description 42
coding tables 557 preserving original sequence in a
using efficiently 42, 556
compiler option sort 189
page
AWO 563 priority numbers, segmentation 563
control 132
DYNAM 563 procedure and data name cross-reference,
depth 13
FASTSRT 563 description 345
header 350
NUMPROC 45, 563 PROCEDURE DIVISION
customized 350, 351
OPTIMIZE 560, 563 additional information 363
paragraph
RENT 563 client 476
grouping 85
RMODE 563 description 17
introduction 18
SSRANGE 563 in subprograms 426
parameter list
TEST 563 instance method 470
for ADEXIT 618
THREAD 326 RETURNING 17
for INEXIT 613
TRUNC 326, 563 signature bytes 362, 363
for LIBEXIT 616
data usage 555 statements
for PRTEXIT 617
effect of compiler options on 562 compiler-directing 20
main program in UNIX 402
effects of buffer size 292 conditional 19
parameters
exponentiations 556 delimited scope 19
describing in called program 425
IMS environment 391, 567 imperative 19
parsing
OCCURS DEPENDING ON 558 terminology 17
XML documents 199, 201
of calls 413 USING 17
passing data between programs
optimizer 560, 562 verbs present in 362
addresses 427
planning arithmetic evaluations 555 PROCEDURE DIVISION RETURNING
BY CONTENT 423
programming style 553 methods, use of 431
BY REFERENCE 423
run-time considerations 383, 553 procedure integration 561
BY VALUE 423
table handling 558 procedure-pointer data item
called program 424
tape, QSAM 128 entry address for entry point 420
calling program 424
variable subscript data format 62 passing parameters to callable
EXTERNAL data 431
VSAM file considerations 171 services 420
JNI services 502
worksheet 566 SET procedure-pointer 420
language used 424
period, as scope terminator 20 versus function-pointer 421
OMITTED arguments 425
PGMNAME compiler option 314 with DLLs 443
options considerations 34
physical PROCESS (CBL) statement
with Java 505
block 113 batch compiling 262
password
record 13, 113 conflicting options in 289
alternate index 164
precedence 258
example 164
Index 741
restrictions (continued) run-time options (continued) SET statement
using EXEC SQL under IMS 394 CHECK(OFF) 563 for function-pointer data items 420
resubmitting a job 525 COBOL 85 Standard for procedure-pointer data items 420
return code conformance 289 handling of programs name in 314
compiler 267 ENVAR 283 setting object references 479
feedback code from Language MSGFILE 313 using for debugging 339
Environment services 573 POSIX setting
from CICS ECI 378 DLL search order 442 switches and flags 81
from DB2 387 use in OO applications 283 sharing
RETURN-CODE special register 430, SIMVRD 152 data 418, 431
573 specifying under UNIX 397 with Java 505
VSAM files 229 TRAP files 13, 418, 432
when control returns to operating closing files in line-sequential 177 short listing, example 348
system 430 closing files in QSAM 132 sign condition 79, 541
RETURN INTO statement 183 closing files in VSAM 162 sign representation 45
RETURN statement 183 ON SIZE ERROR 223 signature
RETURN-CODE special register running OO applications definition of 468
considerations for DB2 387 under UNIX 279 must be unique 468
not set by INVOKE 480 using JCL or TSO/E 283 signature bytes
value after call to Language compiler options in effect 359
Environment service 573 DATA DIVISION 361
when control returns to operating
system 430
S ENVIRONMENT DIVISION 361
PROCEDURE DIVISION 362, 363
S format record 125
RETURNING phrase SIMVRD run-time option 152
S-level error message 267, 344
INVOKE statement 481 SIZE compiler option 318
sample programs 679
methods, use of 431 size of printed page, control 132
scope of names 418
PROCEDURE DIVISION header 471 skip a block of records 127
scope terminator
REVERSE intrinsic function 97 sliding century window 530
aids in debugging 338
reverse order of tape files 130 sort
explicit 19, 20
reversing characters 97 alternate collating sequence 188
implicit 20
REWRITE statement checkpoint/restart 196
SEARCH ALL statement
multithreading serialization 452 completion code 190
binary search 72
QSAM 129 concepts 180
indexing 63, 71
VSAM 155 controlling behavior of 193
ordered table 72
RLS parameter 170 criteria 186
search order
RMODE data sets needed, z/OS 185
DLLs in the HFS 442
assigned for EXIT modules 613 DD statements, defining z/OS data
SEARCH statement
description 34 sets 185
examples 71
RMODE compiler option description 179
indexing 63
description 317 FASTSRT compiler option 191
nesting 71
influencing addressability 34 files, describing 181
serial search 71
multioption interaction 34 input procedures 182
searching a table 71
performance considerations 563 line-sequential files 179
searching for name declarations 418
when passing data 34 more than one 180
section
Rotational Position Sensing feature 129 NOFASTSRT compiler option 193
declarative 21
ROUNDED phrase 578 output procedures 183
description of 18
rows in tables 60 pass control statements to 195
grouping 85
RRDS (relative-record data sets) performance 191
segmentation 563
file access mode 153 preserving original sequence 189
SELECT clause
fixed-length records 148 restrictions on input/output
ASSIGN clause 10
organization 150, 151 procedures 185
naming files 10
performance considerations 171 special registers 193
vary input-output file 11
simulating variable-length storage use 195
SELECT OPTIONAL 130, 157
records 152 successful 190
SELF 479
variable-length records 148 terminating 190
sending field 89
run time under CICS 197
sentence 18
changing file-name 11 under z/OS 185
separate digit sign 38
multithreading restrictions 455 variable-length records 186
SEQUENCE compiler option 318, 343
performance considerations 553 windowed date fields 189
sequential file organization 113
run unit with multitasking 179
sequential storage device 114
description 407 workspace 196
serial search 71
role in multithreading 450 Sort File Description (SD) entry
serialization
run-time options example 181
of files with multithreading 452
affecting DATA compiler option 35 SORT statement
SERVICE LABEL statement 332
AIXBLD 567 description 186
SET condition-name TO TRUE statement
ALL31 413 restrictions for CICS applications 197
example 83, 85
CBLPSHPOP 383 under CICS 197
switches and flags 81
Index 743
T transferring control (continued)
between COBOL programs 410, 416
UNIX APIs
calling 400
table called program 408 UNKNOWN-REFERENCE-IN-
assigning values 65 calling program 408 ATTRIBUTE XML event 207
columns 59 main and subprograms 408 UNKNOWN-REFERENCE-IN-CONTENT
compare to array 33 nested programs 416 XML event 207
defining 59 TRAP run-time option unreachable code 561
depth 60 closing line-sequential files 177 UNSTRING statement
description 33 closing QSAM files 132 example 89
dynamically loading 64 closing VSAM files 162 overflow condition 222
efficient coding 557, 558 ON SIZE ERROR 223 using 89
handling 59 TRUNC compiler option with DBCS data 593
identical element specifications 557 description 326 updating VSAM records 160
index 62 performance considerations 563 UPPER-CASE intrinsic function 97
initialize 64 TSO uppercase 97
intrinsic functions 73 ALLOCATE command 249 UPSI switches
loading values in 64 CALL command 249 with multithreading 455
looping through 85 compiling under 249 USAGE clause
making reference 61 SYSTERM for compiler messages 256 incompatible data 46
one-dimensional 59 tuning considerations, performance 562, IS INDEX 63
reference modification 62 563 OBJECT REFERENCE 478
referencing table entry substrings 93 typed object references 478 USE . . . LABEL declarative 142
rows 60 USE AFTER STANDARD LABEL 145
searching 71 USE FOR DEBUGGING declaratives 340
subscripts 61
three-dimensional 60 U USE statement 332
user label
two-dimensional 60 U format record 126
exits 145
variable-length 68 U-level error message 267, 344
QSAM 145
TALLYING option 95 UNDATE intrinsic function 545
standard 143
tape files undefined record format
user-defined condition 79
performance 128 description 126
user-exit work area 612
reverse order 130 layout 126
user-label track 142
TERMINAL compiler option 321 QSAM 144
USING phrase
terminal, sending messages to 321 requesting 126
INVOKE statement 480
termination 408 unfilled tracks 129
PROCEDURE DIVISION header 470
terminology Unicode
UTF-16
VSAM 147 description 105
encoding for national data 105
terms used in MAP output 354 encoding 106
UTF-8 data
test JNI services 510
converting 109
conditions 84 run-time support 103
for ASCII invariant characters 105
data 79 using with DB2 385
processing 109
numeric operand 79 universal object references 478
UPSI switch 79 UNIX
TEST AFTER 84 accessing environment variables 398
TEST BEFORE 84 example 400 V
TEST compiler option accessing main parms 402 V format record 122, 123
description 322 example 402 valid data
for full advantage of Debug Tool 371 calling APIs 400 numeric 46
multioption interaction 289 compiler environment variables 269 VALUE clause
performance considerations 563 compiling from script 275 assigning table values 65
text-name environment variable 270 compiling OO applications 277 data description entry 65
TGT memory map example 279 large literals with COMP-5 42
description 356 compiling under 269 large, with TRUNC(BIN) 327
example 366 copybook search order 270, 273, 333 VALUE IS NULL 427
THREAD compiler option copybooks 333 VALUE OF clause 13
and the LINKAGE SECTION 16 developing programs 397 variable
description 325 execution environments 397 as reference modifier 93
for Java interoperability 277, 281 linking OO applications 278 description 23
for OO COBOL 277, 281 example 279 variable-length records
threading consideration 397 preparing OO applications 278 OCCURS DEPENDING ON (ODO)
TITLE statement example 279 clause 558
controlling header on listing 7 running OO applications 279 QSAM 122, 123
top-down programming running programs 397 sorting 186
constructs to avoid 554 setting environment variables 398 VSAM 148, 154
TRACK OVERFLOW option 129 example 400 variable-length table 68
transferring control sort and merge 179 variables, environment
between COBOL and non-COBOL specifying compiler options 270 library-name 332
programs 407 variably located data item 588
Index 745
746 Programming Guide
Readers’ Comments — We’d Like to Hear from You
Enterprise COBOL for z/OS and OS/390
Programming Guide
Version 3 Release 2
Overall, how satisfied are you with the information in this book?
How satisfied are you that the information in this book is:
When you send comments to IBM, you grant IBM a nonexclusive right to use or distribute your comments in any
way it believes appropriate without incurring any obligation to you.
Name Address
Company or Organization
Phone No.
___________________________________________________________________________________________________
Readers’ Comments — We’d Like to Hear from You Cut or Fold
SC27-1412-01 Along Line
_ _ _ _ _ _ _Fold
_ _ _and
_ _ _Tape
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _Please
_ _ _ _ _do
_ _not
_ _ staple
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _Fold
_ _ _and
_ _ Tape
______
NO POSTAGE
NECESSARY
IF MAILED IN THE
UNITED STATES
IBM Corporation
H150/090
555 Bailey Avenue
San Jose, CA
U.S.A. 95141-9989
_________________________________________________________________________________________
Fold and Tape Please do not staple Fold and Tape
Cut or Fold
SC27-1412-01 Along Line
Printed in U.S.A.
SC27-1412-01