Quick Guide

Introduction to COBOL

COBOL is a high-level language. One must understand the way COBOL works. Computers only understand machine code, a binary stream of 0s and 1s. COBOL code must be converted into machine code using a compiler. Run the program source through a compiler. The compiler first checks for any syntax errors and then converts it into machine language. The compiler creates an output file which is known as load module. This output file contains executable code in the form of 0s and 1s.

Evolution of COBOL

During 1950s, when the businesses were growing in the western part of the world, there was a need to automate various processes for ease of operation and this gave birth to a high-level programming language meant for business data processing.

  • In 1959, COBOL was developed by CODASYL (Conference on Data Systems Language).
  • The next version, COBOL-61, was released in 1961 with some revisions.
  • In 1968, COBOL was approved by ANSI as a standard language for commercial use (COBOL-68).
  • It was again revised in 1974 and 1985 to develop subsequent versions named COBOL-74 and COBOL-85 respectively.
  • In 2002, Object-Oriented COBOL was released, which could use encapsulated objects as a normal part of COBOL programming.

Importance of COBOL

  • COBOL was the first widely used high-level programming language. It is an English-like language which is user friendly. All the instructions can be coded in simple English words.
  • COBOL is also used as a self-documenting language.
  • COBOL can handle huge data processing.
  • COBOL is compatible with its previous versions.
  • COBOL has effective error messages and so, resolution of bugs is easier.

Features of COBOL

Standard Language

COBOL is a standard language that can be compiled and executed on machines such as IBM AS/400, personal computers, etc.

Business Oriented

COBOL was designed for business-oriented applications related to financial domain, defense domain, etc. It can handle huge volumes of data because of its advanced file handling capabilities.

Robust Language

COBOL is a robust language as its numerous debugging and testing tools are available for almost all computer platforms.

Structured Language

Logical control structures are available in COBOL which makes it easier to read and modify. COBOL has different divisions, so it is easy to debug.

COBOL – Environment Setup

We have set up the COBOL Programming environment online, so that you can compile and execute all the available examples online. It gives you confidence in what you are reading and enables you to verify the programs with different options. Feel free to modify any example and execute it online.ELEMENTARY ITEM 01 WS-CLASS PIC 9(2) VALUE ’10’. —> ELEMENTARY ITEM 01 WS-ADDRESS. —> GROUP ITEM 05 WS-HOUSE-NUMBER PIC 9(3). —> ELEMENTARY ITEM 05 WS-STREET PIC X(15). —> ELEMENTARY ITEM 05 WS-CITY PIC X(15). —> ELEMENTARY ITEM 05 WS-COUNTRY PIC X(15) VALUE ‘INDIA’. —> ELEMENTARY ITEM

Picture Clause

Picture clause is used to define the following items −

  • Data type can be numeric, alphabetic, or alphanumeric. Numeric type consists of only digits 0 to 9. Alphabetic type consists of letters A to Z and spaces. Alphanumeric type consists of digits, letters, and special characters.
  • Sign can be used with numeric data. It can be either + or .
  • Decimal point position can be used with numeric data. Assumed position is the position of decimal point and not included in the data.
  • Length defines the number of bytes used by the data item.

Symbols used in a Picture clause −

Sr.No.Symbol & Description
19Numeric
2AAlphabetic
3XAlphanumeric
4VImplicit Decimal
5SSign
6PAssumed Decimal

Example

The following example shows the use of PIC clause −

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-NUM1 PICS9(3)V9(2).01 WS-NUM2 PICPPP999.01 WS-NUM3 PICS9(3)V9(2)VALUE-123.45.01 WS-NAME PICA(6)VALUE'ABCDEF'.01 WS-ID PICX(5)VALUE'A121$'.PROCEDUREDIVISION.DISPLAY"WS-NUM1 : "WS-NUM1.DISPLAY"WS-NUM2 : "WS-NUM2.DISPLAY"WS-NUM3 : "WS-NUM3.DISPLAY"WS-NAME : "WS-NAME.DISPLAY"WS-ID : "WS-ID.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

WS-NUM1 : +000.00
WS-NUM2 : .000000
WS-NUM3 : -123.45
WS-NAME : ABCDEF
WS-ID : A121$

Value Clause

Value clause is an optional clause which is used to initialize the data items. The values can be numeric literal, alphanumeric literal, or figurative constant. It can be used with both group and elementary items.

Example

The following example shows the use of VALUE clause −

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-NUM1 PIC99V9VALUEIS3.5.01 WS-NAME PICA(6)VALUE'ABCD'.01 WS-ID PIC99VALUEZERO.PROCEDUREDIVISION.DISPLAY"WS-NUM1 : "WS-NUM1.DISPLAY"WS-NAME : "WS-NAME.DISPLAY"WS-ID   : "WS-ID.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

WS-NUM1 : 03.5
WS-NAME : ABCD
WS-ID   : 00

COBOL – Basic Verbs

COBOL verbs are used in the procedure division for data processing. A statement always start with a COBOL verb. There are several COBOL verbs with different types of actions.

Input / Output Verbs

Input/Output verbs are used to get data from the user and display the output of COBOL programs. The following two verbs are used for this process −

Accept Verb

Accept verb is used to get data such as date, time, and day from the operating system or directly from the user. If a program is accepting data from the user, then it needs to be passed through JCL. While getting data from the operating system, FROM option is included as shown in the following example −

ACCEPT WS-STUDENT-NAME.
ACCEPT WS-DATE FROM SYSTEM-DATE.

Display Verb

Display verb is used to display the output of a COBOL program.

DISPLAY WS-STUDENT-NAME.
DISPLAY "System date is : " WS-DATE.

COBOL PROGRAM

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-STUDENT-NAME PICX(25).01 WS-DATE PICX(10).PROCEDUREDIVISION.ACCEPT WS-STUDENT-NAME.ACCEPT WS-DATE FROMDATE.DISPLAY"Name :  " WS-STUDENT-NAME.DISPLAY"Date : " WS-DATE.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//INPUT DD DSN=PROGRAM.DIRECTORY,DISP=SHR
//SYSIN DD *
TutorialsPoint
/*

When you compile and execute the above program, it produces the following result −

Name : TutorialsPoint
Date : 2014-08-30

Initialize Verb

Initialize verb is used to initialize a group item or an elementary item. Data names with RENAME clause cannot be initialized. Numeric data items are replaced by ZEROES. Alphanumeric or alphabetic data items are replaced by SPACES. If we include REPLACING term, then data items can be initialized to the given replacing value as shown in the following example −

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-NAME PICA(30)VALUE'ABCDEF'.01 WS-ID PIC9(5).01 WS-ADDRESS.05 WS-HOUSE-NUMBER PIC9(3).05 WS-COUNTRY PICX(15).05 WS-PINCODE PIC9(6)VALUE123456.PROCEDUREDIVISION.
   A000-FIRST-PARA.INITIALIZE WS-NAME, WS-ADDRESS.INITIALIZE WS-ID REPLACINGNUMERICDATABY12345.DISPLAY"My name is   : "WS-NAME.DISPLAY"My ID is     : "WS-ID.DISPLAY"Address      : "WS-ADDRESS.DISPLAY"House Number : "WS-HOUSE-NUMBER.DISPLAY"Country      : "WS-COUNTRY.DISPLAY"Pincode      : "WS-PINCODE.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

My name is   :                               
My ID is     : 12345
Address      : 000               000000
House Number : 000
Country      :                
Pincode      : 000000

Move Verb

Move verb is used to copy data from source data to destination data. It can be used on both elementary and group data items. For group data items, MOVE CORRESPONDING/CORR is used. In try it option, MOVE CORR is not working; but on a mainframe server, it will work.

For moving data from a string, MOVE(x:l) is used where x is the starting position and l is the length. Data will be truncated if the destination data item PIC clause is less than the source data item PIC clause. If the destination data item PIC clause is more than the source data item PIC clause, then ZEROS or SPACES will be added in the extra bytes. The following example makes it clear.

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-NUM1 PIC9(9).01 WS-NUM2 PIC9(9).01 WS-NUM3 PIC9(5).01 WS-NUM4 PIC9(6).01 WS-ADDRESS.05 WS-HOUSE-NUMBER PIC9(3).05 WS-COUNTRY PICX(5).05 WS-PINCODE PIC9(6).01 WS-ADDRESS1.05 WS-HOUSE-NUMBER1 PIC9(3).05 WS-COUNTRY1 PICX(5).05 WS-PINCODE1 PIC9(6).PROCEDUREDIVISION.
   A000-FIRST-PARA.MOVE123456789TO WS-NUM1.MOVE WS-NUM1 TO WS-NUM2 WS-NUM3.MOVE WS-NUM1(3:6)TO WS-NUM4.MOVE123TO WS-HOUSE-NUMBER.MOVE'INDIA'TO WS-COUNTRY.MOVE112233TO WS-PINCODE.MOVE WS-ADDRESS TO WS-ADDRESS1.DISPLAY"WS-NUM1     : " WS-NUM1
   DISPLAY"WS-NUM2     : " WS-NUM2
   DISPLAY"WS-NUM3     : " WS-NUM3
   DISPLAY"WS-NUM4     : " WS-NUM4
   DISPLAY"WS-ADDRESS  : " WS-ADDRESS
   DISPLAY"WS-ADDRESS1 : " WS-ADDRESS1

STOPRUN.

JCL to execute the above COBOL program.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

WS-NUM1     : 123456789
WS-NUM2     : 123456789
WS-NUM3     : 56789
WS-NUM4     : 345678
WS-ADDRESS  : 123INDIA112233
WS-ADDRESS1 : 123INDIA112233

Legal Moves

The following table gives information about the legal moves −

AlphabeticAlphanumericNumeric
AlphabeticPossiblePossibleNot Possible
AlphanumericPossiblePossiblePossible
NumericNot PossiblePossiblePossible

Add Verb

Add verb is used to add two or more numbers and store the result in the destination operand.

Syntax

Given below is the syntax to Add two or more numbers −

ADD A B TO C D

ADD A B C TO D GIVING E

ADD CORR WS-GROUP1 TO WS-GROUP2

In syntax-1, A, B, C are added and the result is stored in C (C=A+B+C). A, B, D are added and the result is stored in D (D = A + B + D).

In syntax-2, A, B, C, D are added and the result is stored in E (E=A+B+C+D).

In syntax-3, sub-group items within WS-GROUP1 and WS-GROUP2 are added and the result is stored in WS-GROUP2.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-NUM1 PIC9(9)VALUE10.01 WS-NUM2 PIC9(9)VALUE10.01 WS-NUM3 PIC9(9)VALUE10.01 WS-NUM4 PIC9(9)VALUE10.01 WS-NUMA PIC9(9)VALUE10.01 WS-NUMB PIC9(9)VALUE10.01 WS-NUMC PIC9(9)VALUE10.01 WS-NUMD PIC9(9)VALUE10.01 WS-NUME PIC9(9)VALUE10.PROCEDUREDIVISION.ADD WS-NUM1 WS-NUM2 TO WS-NUM3 WS-NUM4.ADD WS-NUMA WS-NUMB WS-NUMC TO WS-NUMD GIVING WS-NUME.DISPLAY"WS-NUM1     : " WS-NUM1
   DISPLAY"WS-NUM2     : " WS-NUM2
   DISPLAY"WS-NUM3     : " WS-NUM3
   DISPLAY"WS-NUM4     : " WS-NUM4
   DISPLAY"WS-NUMA     : " WS-NUMA
   DISPLAY"WS-NUMB     : " WS-NUMB
   DISPLAY"WS-NUMC     : " WS-NUMC
   DISPLAY"WS-NUMD     : " WS-NUMD
   DISPLAY"WS-NUME     : " WS-NUME

STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

WS-NUM1     : 000000010
WS-NUM2     : 000000010
WS-NUM3     : 000000030
WS-NUM4     : 000000030
WS-NUMA     : 000000010
WS-NUMB     : 000000010
WS-NUMC     : 000000010
WS-NUMD     : 000000010
WS-NUME     : 000000040

Subtract Verb

Subtract verb is used for subtraction operations.

Syntax

Given below is the syntax for Subtract operations −

SUBTRACT A B FROM C D

SUBTRACT A B C FROM D GIVING E

SUBTRACT CORR WS-GROUP1 TO WS-GROUP2

In syntax-1, A and B are added and subtracted from C. The result is stored in C (C = C-(A+B)). A and B are added and subtracted from D. The result is stored in D (D = D-(A+B)).

In syntax-2, A, B, C are added and subtracted from D. The result is stored in E (E = D-(A+B+C))

In syntax-3, sub-group items within WS-GROUP1 and WS-GROUP2 are subtracted and the result is stored in WS-GROUP2.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-NUM1 PIC9(9)VALUE10.01 WS-NUM2 PIC9(9)VALUE10.01 WS-NUM3 PIC9(9)VALUE100.01 WS-NUM4 PIC9(9)VALUE100.01 WS-NUMA PIC9(9)VALUE10.01 WS-NUMB PIC9(9)VALUE10.01 WS-NUMC PIC9(9)VALUE10.01 WS-NUMD PIC9(9)VALUE100.01 WS-NUME PIC9(9)VALUE10.PROCEDUREDIVISION.SUBTRACT WS-NUM1 WS-NUM2 FROM WS-NUM3 WS-NUM4.SUBTRACT WS-NUMA WS-NUMB WS-NUMC FROM WS-NUMD GIVING WS-NUME.DISPLAY"WS-NUM1     : " WS-NUM1
   DISPLAY"WS-NUM2     : " WS-NUM2
   DISPLAY"WS-NUM3     : " WS-NUM3
   DISPLAY"WS-NUM4     : " WS-NUM4
   DISPLAY"WS-NUMA     : " WS-NUMA
   DISPLAY"WS-NUMB     : " WS-NUMB
   DISPLAY"WS-NUMC     : " WS-NUMC
   DISPLAY"WS-NUMD     : " WS-NUMD
   DISPLAY"WS-NUME     : " WS-NUME

STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

WS-NUM1     : 000000010
WS-NUM2     : 000000010
WS-NUM3     : 000000080
WS-NUM4     : 000000080
WS-NUMA     : 000000010
WS-NUMB     : 000000010
WS-NUMC     : 000000010
WS-NUMD     : 000000100
WS-NUME     : 000000070

Multiply Verb

Multiply verb is used for multiplication operations.

Syntax

Given below is the syntax to multiply two or more numbers −

MULTIPLY A BY B C

MULTIPLY A BY B GIVING E

In syntax-1, A and B are multipled and the result is stored in B (B=A*B). A and C are multipled and the result is stored in C (C = A * C).

In syntax-2, A and B are multipled and the result is stored in E (E=A*B).

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-NUM1 PIC9(9)VALUE10.01 WS-NUM2 PIC9(9)VALUE10.01 WS-NUM3 PIC9(9)VALUE10.01 WS-NUMA PIC9(9)VALUE10.01 WS-NUMB PIC9(9)VALUE10.01 WS-NUMC PIC9(9)VALUE10.PROCEDUREDIVISION.MULTIPLY WS-NUM1 BY WS-NUM2 WS-NUM3.MULTIPLY WS-NUMA BY WS-NUMB GIVING WS-NUMC.DISPLAY"WS-NUM1     : " WS-NUM1
   DISPLAY"WS-NUM2     : " WS-NUM2
   DISPLAY"WS-NUM3     : " WS-NUM3
   DISPLAY"WS-NUMA     : " WS-NUMA
   DISPLAY"WS-NUMB     : " WS-NUMB
   DISPLAY"WS-NUMC     : " WS-NUMC
   
STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

WS-NUM1     : 000000010
WS-NUM2     : 000000100
WS-NUM3     : 000000100
WS-NUMA     : 000000010
WS-NUMB     : 000000010
WS-NUMC     : 000000100

Divide Verb

Divide verb is used for division operations.

Syntax

Given below is the syntax for division operations −

DIVIDE A INTO B

DIVIDE A BY B GIVING C REMAINDER R

In syntax-1, B is divided by A and the result is stored in B (B=B/A).

In syntax-2, A is divided by B and the result is stored in C (C=A/B) and the remainder is stored in R.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-NUM1 PIC9(9)VALUE5.01 WS-NUM2 PIC9(9)VALUE250.01 WS-NUMA PIC9(9)VALUE100.01 WS-NUMB PIC9(9)VALUE15.01 WS-NUMC PIC9(9).01 WS-REM PIC9(9).PROCEDUREDIVISION.DIVIDE WS-NUM1 INTO WS-NUM2.DIVIDE WS-NUMA BY WS-NUMB GIVING WS-NUMC REMAINDER WS-REM.DISPLAY"WS-NUM1     : " WS-NUM1
   DISPLAY"WS-NUM2     : " WS-NUM2
   DISPLAY"WS-NUMA     : " WS-NUMA
   DISPLAY"WS-NUMB     : " WS-NUMB
   DISPLAY"WS-NUMC     : " WS-NUMC
   DISPLAY"WS-REM      : " WS-REM
   
STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

WS-NUM1     : 000000005
WS-NUM2     : 000000050
WS-NUMA     : 000000100
WS-NUMB     : 000000015
WS-NUMC     : 000000006
WS-REM      : 000000010

Compute Statement

Compute statement is used to write arithmetic expressions in COBOL. This is a replacement for Add, Subtract, Multiply, and Divide.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-NUM1 PIC9(9)VALUE10.01 WS-NUM2 PIC9(9)VALUE10.01 WS-NUM3 PIC9(9)VALUE10.01 WS-NUMA PIC9(9)VALUE50.01 WS-NUMB PIC9(9)VALUE10.01 WS-NUMC PIC9(9).PROCEDUREDIVISION.COMPUTE WS-NUMC=(WS-NUM1 * WS-NUM2)-(WS-NUMA / WS-NUMB)+ WS-NUM3.DISPLAY"WS-NUM1     : " WS-NUM1
   DISPLAY"WS-NUM2     : " WS-NUM2
   DISPLAY"WS-NUM3     : " WS-NUM3
   DISPLAY"WS-NUMA     : " WS-NUMA
   DISPLAY"WS-NUMB     : " WS-NUMB
   DISPLAY"WS-NUMC     : " WS-NUMC

STOPRUN.

JCL to execute the above COBOL program.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

WS-NUM1     : 000000010
WS-NUM2     : 000000010
WS-NUM3     : 000000010
WS-NUMA     : 000000050
WS-NUMB     : 000000010
WS-NUMC     : 000000105

COBOL – Data Layout

COBOL layout is the description of use of each field and the values present in it. Following are the data description entries used in COBOL −

  • Redefines Clause
  • Renames Clause
  • Usage Clause
  • Copybooks

Redefines Clause

Redefines clause is used to define a storage with different data description. If one or more data items are not used simultaneously, then the same storage can be utilized for another data item. So the same storage can be referred with different data items.

Syntax

Following is the syntax for Redefines clause −

01 WS-OLD PIC X(10).
01 WS-NEW1 REDEFINES WS-OLD PIC 9(8).
01 WS-NEW2 REDEFINES WS-OLD PIC A(10).

Following are the details of the used parameters −

  • WS-OLD is Redefined Item
  • WS-NEW1 and WS-NEW2 are Redefining Item

Level numbers of redefined item and redefining item must be the same and it cannot be 66 or 88 level number. Do not use VALUE clause with a redefining item. In File Section, do not use a redefines clause with 01 level number. Redefines definition must be the next data description you want to redefine. A redefining item will always have the same value as a redefined item.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-DESCRIPTION.05 WS-DATE1 VALUE'20140831'.10 WS-YEAR PICX(4).10 WS-MONTH PICX(2).10 WS-DATE PICX(2).05 WS-DATE2 REDEFINES WS-DATE1 PIC9(8).PROCEDUREDIVISION.DISPLAY"WS-DATE1 : "WS-DATE1.DISPLAY"WS-DATE2 : "WS-DATE2.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program it produces the following result −

WS-DATE1 : 20140831
WS-DATE2 : 20140831

Renames Clause

Renames clause is used to give different names to existing data items. It is used to re-group the data names and give a new name to them. The new data names can rename across groups or elementary items. Level number 66 is reserved for renames.

Syntax

Following is the syntax for Renames clause −

01 WS-OLD.
10 WS-A PIC 9(12).
10 WS-B PIC X(20).
10 WS-C PIC A(25).
10 WS-D PIC X(12).
66 WS-NEW RENAMES WS-A THRU WS-C.

Renaming is possible at same level only. In the above example, WS-A, WS-B, and WS-C are at the same level. Renames definition must be the next data description you want to rename. Do not use Renames with 01, 77, or 66 level number. The data names used for renames must come in sequence. Data items with occur clause cannot be renamed.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-DESCRIPTION.05 WS-NUM.10 WS-NUM1 PIC9(2)VALUE20.10 WS-NUM2 PIC9(2)VALUE56.05 WS-CHAR.10 WS-CHAR1 PICX(2)VALUE'AA'.10 WS-CHAR2 PICX(2)VALUE'BB'.66 WS-RENAME RENAMES WS-NUM2 THRU WS-CHAR2.PROCEDUREDIVISION.DISPLAY"WS-RENAME : " WS-RENAME.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

WS-RENAME : 56AABB

Usage Clause

Usage clause specifies the operating system in which the format data is stored. It cannot be used with level numbers 66 or 88. If usage clause is specified on a group, then all the elementary items will have the same usage clause. The different options available with Usage clause are as follows −

Display

Data item is stored in ASCII format and each character will take 1 byte. It is default usage.

The following example calculates the number of bytes required −

01 WS-NUM PICS9(5)V9(3)USAGEISDISPLAY.
It requires 8 bytes assignand decimal doesn't require any byte.01 WS-NUM PIC9(5)USAGEISDISPLAY.
It requires 5 bytes assign.

COMPUTATIONAL / COMP

Data item is stored in binary format. Here, data items must be integer.

The following example calculates the number of bytes required −

01 WS-NUM PICS9(n)USAGEISCOMP.If'n'=1to4, it takes 2 bytes.If'n'=5to9, it takes 4 bytes.If'n'=10to18, it takes 8 bytes.

COMP-1

Data item is similar to Real or Float and is represented as a single precision floating point number. Internally, data is stored in hexadecimal format. COMP-1 does not accept PIC clause. Here 1 word is equal to 4 bytes.

COMP-2

Data item is similar to Long or Double and is represented as double precision floating point number. Internally, data is stored in hexadecimal format. COMP-2 does not specify PIC clause. Here 2 word is equal to 8 bytes.

COMP-3

Data item is stored in packed decimal format. Each digit occupies half a byte (1 nibble) and the sign is stored at the rightmost nibble.

The following example calculates the number of bytes required −

01 WS-NUM PIC9(n)USAGEISCOMP.Numberof bytes = n/2(If n is even)Numberof bytes = n/2+1(If n is odd, consider only integer part)01 WS-NUM PIC9(4)USAGEISCOMP-3VALUE21.
It requires 2 bytes of storage as each digit occupies half a byte.01 WS-NUM PIC9(5)USAGEISCOMP-3VALUE21.
It requires 3 bytes of storage as each digit occupies half a byte.

Copybooks

A COBOL copybook is a selection of code that defines data structures. If a particular data structure is used in many programs, then instead of writing the same data structure again, we can use copybooks. We use the COPY statement to include a copybook in a program. COPY statement is used in the WorkingStorage Section.

The following example includes a copybook inside a COBOL program −

DATADIVISION.WORKING-STORAGESECTION.COPY ABC.

Here ABC is the copybook name. The following data items in ABC copybook can be used inside a program.

01 WS-DESCRIPTION.05 WS-NUM.10 WS-NUM1 PIC9(2)VALUE20.10 WS-NUM2 PIC9(2)VALUE56.05 WS-CHAR.10 WS-CHAR1 PICX(2)VALUE'AA'.10 WS-CHAR2 PICX(2)VALUE'BB'.

COBOL – Conditional Statements

Conditional statements are used to change the execution flow depending on certain conditions specified by the programmer. Conditional statements will always evaluate to true or false. Conditions are used in IF, Evaluate, and Perform statements. The different types of conditions are as follows −

  • IF Condition Statement
  • Relation Condition
  • Sign Condition
  • Class Condition
  • Condition-Name Condition
  • Negated Condition
  • Combined Condition

IF Condition Statement

IF statement checks for conditions. If a condition is true, the IF block is executed; and if the condition is false, the ELSE block is executed.

END-IF is used to end the IF block. To end the IF block, a period can be used instead of END-IF. But it is always preferable to use END-IF for multiple IF blocks.

Nested-IF − IF blocks appearing inside another IF block. There is no limit to the depth of nested IF statements.

Syntax

Following is the syntax of IF condition statements −

IF [condition] THEN
   [COBOL statements]
ELSE
   [COBOL statements]
END-IF.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-NUM1 PIC9(9).01 WS-NUM2 PIC9(9).01 WS-NUM3 PIC9(5).01 WS-NUM4 PIC9(6).PROCEDUREDIVISION.
   A000-FIRST-PARA.MOVE25TO WS-NUM1 WS-NUM3.MOVE15TO WS-NUM2 WS-NUM4.IF WS-NUM1 > WS-NUM2 THENDISPLAY'IN LOOP 1 - IF BLOCK'IF WS-NUM3 = WS-NUM4 THENDISPLAY'IN LOOP 2 - IF BLOCK'ELSEDISPLAY'IN LOOP 2 - ELSE BLOCK'END-IFELSEDISPLAY'IN LOOP 1 - ELSE BLOCK'END-IF.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

IN LOOP 1 - IF BLOCK
IN LOOP 2 - ELSE BLOCK

Relation Condition

Relation condition compares two operands, either of which can be an identifier, literal, or arithmetic expression. Algebraic comparison of numeric fields is done regardless of size and usage clause.

For non-numeric operands

If two non-numeric operands of equal size are compared, then the characters are compared from left with the corresponding positions till the end is reached. The operand containing greater number of characters is declared greater.

If two non-numeric operands of unequal size are compared, then the shorter data item is appended with spaces at the end till the size of the operands becomes equal and then compared according to the rules mentioned in the previous point.

Syntax

Given below is the syntax of Relation condition statements −

[Data Name/Arithmetic Operation]

   [IS] [NOT] 

[Equal to (=),Greater than (>), Less than (<), 
Greater than or Equal (>=), Less than or equal (<=) ]

[Data Name/Arithmetic Operation] 

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-NUM1 PIC9(9).01 WS-NUM2 PIC9(9).PROCEDUREDIVISION.
   A000-FIRST-PARA.MOVE25TO WS-NUM1.MOVE15TO WS-NUM2.IF WS-NUM1 ISGREATERTHANOREQUALTO WS-NUM2 THENDISPLAY'WS-NUM1 IS GREATER THAN WS-NUM2'ELSEDISPLAY'WS-NUM1 IS LESS THAN WS-NUM2'END-IF.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program it produces the following result −

WS-NUM1 IS GREATER THAN WS-NUM2

Sign Condition

Sign condition is used to check the sign of a numeric operand. It determines whether a given numeric value is greater than, less than, or equal to ZERO.

Syntax

Following is the syntax of Sign condition statements −

[Data Name/Arithmetic Operation] 

   [IS] [NOT] 

[Positive, Negative or Zero]

[Data Name/Arithmetic Operation]

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-NUM1 PICS9(9)VALUE-1234.01 WS-NUM2 PICS9(9)VALUE123456.PROCEDUREDIVISION.
   A000-FIRST-PARA.IF WS-NUM1 ISPOSITIVETHENDISPLAY'WS-NUM1 IS POSITIVE'.IF WS-NUM1 ISNEGATIVETHENDISPLAY'WS-NUM1 IS NEGATIVE'.IF WS-NUM1 ISZEROTHENDISPLAY'WS-NUM1 IS ZERO'.IF WS-NUM2 ISPOSITIVETHENDISPLAY'WS-NUM2 IS POSITIVE'.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program it produces the following result −

WS-NUM1 IS NEGATIVE
WS-NUM2 IS POSITIVE

Class Condition

Class condition is used to check if an operand contains only alphabets or numeric data. Spaces are considered in ALPHABETIC, ALPHABETIC-LOWER, and ALPHABETIC-UPPER.

Syntax

Following is the syntax of Class condition statements −

[Data Name/Arithmetic Operation>]

   [IS] [NOT] 

[NUMERIC, ALPHABETIC, ALPHABETIC-LOWER, ALPHABETIC-UPPER]

[Data Name/Arithmetic Operation]

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-NUM1 PICX(9)VALUE'ABCD '.01 WS-NUM2 PIC9(9)VALUE123456789.PROCEDUREDIVISION.
   A000-FIRST-PARA.IF WS-NUM1 ISALPHABETICTHENDISPLAY'WS-NUM1 IS ALPHABETIC'.IF WS-NUM1 ISNUMERICTHENDISPLAY'WS-NUM1 IS NUMERIC'.IF WS-NUM2 ISNUMERICTHENDISPLAY'WS-NUM2 IS NUMERIC'.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

WS-NUM1 IS ALPHABETIC
WS-NUM2 IS NUMERIC

Condition-name Condition

A condition-name is a user-defined name. It contains a set of values specified by the user. It behaves like Boolean variables. They are defined with level number 88. It will not have a PIC clause.

Syntax

Following is the syntax of user-defined condition statements −

88 [Condition-Name] VALUE [IS, ARE] [LITERAL] [THRU LITERAL].

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-NUM PIC9(3).88 PASS VALUESARE041THRU100.88 FAIL VALUESARE000THRU40.PROCEDUREDIVISION.
   A000-FIRST-PARA.MOVE65TO WS-NUM.IF PASS 
  DISPLAY'Passed with ' WS-NUM ' marks'.IF FAIL 
  DISPLAY'FAILED with ' WS-NUM 'marks'.STOPRUN.</pre>

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

Passed with 065 marks

Negated Condition

Negated condition is given by using the NOT keyword. If a condition is true and we have given NOT in front of it, then its final value will be false.

Syntax

Following is the syntax of Negated condition statements −

IF NOT [CONDITION] 
   COBOL Statements
END-IF.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-NUM1 PIC9(2)VALUE20.01 WS-NUM2 PIC9(9)VALUE25.PROCEDUREDIVISION.
   A000-FIRST-PARA.IFNOT WS-NUM1 ISLESSTHAN WS-NUM2 THENDISPLAY'IF-BLOCK'ELSEDISPLAY'ELSE-BLOCK'END-IF.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

ELSE-BLOCK

Combined Condition

A combined condition contains two or more conditions connected using logical operators AND or OR.

Syntax

Following is the syntax of combined condition statements −

IF [CONDITION] AND [CONDITION]
   COBOL Statements
END-IF.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-NUM1 PIC9(2)VALUE20.01 WS-NUM2 PIC9(2)VALUE25.01 WS-NUM3 PIC9(2)VALUE20.PROCEDUREDIVISION.
   A000-FIRST-PARA.IF WS-NUM1 ISLESSTHAN WS-NUM2 AND WS-NUM1=WS-NUM3 THENDISPLAY'Both condition OK'ELSEDISPLAY'Error'END-IF.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

Both condition OK

Evaluate Verb

Evaluate verb is a replacement of series of IF-ELSE statement. It can be used to evaluate more than one condition. It is similar to SWITCH statement in C programs.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-A PIC9VALUE0.PROCEDUREDIVISION.MOVE3TO WS-A.EVALUATETRUEWHEN WS-A >2DISPLAY'WS-A GREATER THAN 2'WHEN WS-A <0DISPLAY'WS-A LESS THAN 0'WHENOTHERDISPLAY'INVALID VALUE OF WS-A'END-EVALUATE.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

WS-A GREATER THAN 2

COBOL - Loop Statements

There are some tasks that need to be done over and over again like reading each record of a file till its end. The loop statements used in COBOL are −

  • Perform Thru
  • Perform Until
  • Perform Times
  • Perform Varying

Perform Thru

Perform Thru is used to execute a series of paragraph by giving the first and last paragraph names in the sequence. After executing the last paragraph, the control is returned back.

In-line Perform

Statements inside the PERFORM will be executed till END-PERFORM is reached.

Syntax

Following is the syntax of In-line perform −

PERFORM 
   DISPLAY 'HELLO WORLD'
END-PERFORM.

Out-of-line Perform

Here, a statement is executed in one paragraph and then the control is transferred to other paragraph or section.

Syntax

Following is the syntax of Out-of-line perform −

PERFORM PARAGRAPH1 THRU PARAGRAPH2

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.PROCEDUREDIVISION.
   A-PARA.PERFORMDISPLAY'IN A-PARA'END-PERFORM.PERFORM C-PARA THRU E-PARA.
   
   B-PARA.DISPLAY'IN B-PARA'.STOPRUN.
   
   C-PARA.DISPLAY'IN C-PARA'.
   
   D-PARA.DISPLAY'IN D-PARA'.
   
   E-PARA.DISPLAY'IN E-PARA'.

JCL to execute the above COBOL program.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

IN A-PARA
IN C-PARA
IN D-PARA
IN E-PARA
IN B-PARA

Perform Until

In perform until, a paragraph is executed until the given condition becomes true. With test before is the default condition and it indicates that the condition is checked before the execution of statements in a paragraph.

Syntax

Following is the syntax of perform until −

PERFORM A-PARA UNTILCOUNT=5PERFORM A-PARA WITHTESTBEFOREUNTILCOUNT=5PERFORM A-PARA WITHTESTAFTERUNTILCOUNT=5

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-CNT PIC9(1)VALUE0.PROCEDUREDIVISION.
   A-PARA.PERFORM B-PARA WITHTESTAFTERUNTIL WS-CNT>3.STOPRUN.
   
   B-PARA.DISPLAY'WS-CNT : 'WS-CNT.ADD1TO WS-CNT.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

WS-CNT : 0
WS-CNT : 1
WS-CNT : 2
WS-CNT : 3

Perform Times

In perform times, a paragraph will be executed the number of times specified.

Syntax

Following is the syntax of perform times −

PERFORM A-PARA 5 TIMES.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.PROCEDUREDIVISION.
   A-PARA.PERFORM B-PARA 3TIMES.STOPRUN.
   
   B-PARA.DISPLAY'IN B-PARA'.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

IN B-PARA
IN B-PARA
IN B-PARA

Perform Varying

In perform varying, a paragraph will be executed till the condition in Until phrase becomes true.

Syntax

Following is the syntax of perform varying −

PERFORM A-PARA VARYING A FROM 1 BY 1 UNTIL A = 5.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-A PIC9VALUE0.PROCEDUREDIVISION.
   A-PARA.PERFORM B-PARA VARYING WS-A FROM1BY1UNTIL WS-A=5STOPRUN.
   
   B-PARA.DISPLAY'IN B-PARA ' WS-A.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

IN B-PARA 1
IN B-PARA 2
IN B-PARA 3
IN B-PARA 4

GO TO Statement

GO TO statement is used to change the flow of execution in a program. In GO TO statements, transfer goes only in the forward direction. It is used to exit a paragraph. The different types of GO TO statements used are as follows −

Unconditional GO TO

GO TO para-name.

Conditional GO TO

GO TO para-1 para-2 para-3 DEPENDING ON x.

If 'x' is equal to 1, then the control will be transferred to the first paragraph; and if 'x' is equal to 2, then the control will be transferred to the second paragraph, and so on.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-A PIC9VALUE2.PROCEDUREDIVISION.
   A-PARA.DISPLAY'IN A-PARA'GOTO B-PARA.
   
   B-PARA.DISPLAY'IN B-PARA '.GOTO C-PARA D-PARA DEPENDINGON WS-A.
   
   C-PARA.DISPLAY'IN C-PARA '.
   
   D-PARA.DISPLAY'IN D-PARA '.STOPRUN.

JCL to execute the above COBOL program:

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result:

IN A-PARA
IN B-PARA 
IN D-PARA 

COBOL - String Handling

String handling statements in COBOL are used to do multiple functional operations on strings. Following are the string handling statements −

  • Inspect
  • String
  • Unstring

Inspect

Inspect verb is used to count or replace the characters in a string. String operations can be performed on alphanumeric, numeric, or alphabetic values. Inspect operations are performed from left to right. The options used for the string operations are as follows −

Tallying

Tallying option is used to count the string characters.

Syntax

Following is the syntax of Tallying option −

INSPECT input-string
TALLYING output-count FOR ALL CHARACTERS

The parameters used are −

  • input-string − The string whose characters are to be counted.
  • output-count − Data item to hold the count of characters.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-CNT1 PIC9(2)VALUE0.01 WS-CNT2 PIC9(2)VALUE0.01 WS-STRING PICX(15)VALUE'ABCDACDADEAAAFF'.PROCEDUREDIVISION.INSPECT WS-STRING TALLYING WS-CNT1 FORCHARACTER.DISPLAY"WS-CNT1 : "WS-CNT1.INSPECT WS-STRING TALLYING WS-CNT2 FORALL'A'.DISPLAY"WS-CNT2 : "WS-CNT2
   
STOPRUN.

JCL to execute the above COBOL program.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

WS-CNT1 : 15
WS-CNT2 : 06

Replacing

Replacing option is used to replace the string characters.

Syntax

Following is the syntax of Replacing option −

INSPECT input-string REPLACING ALL char1 BY char2.

The parameter used is −

  • input-string − The string whose characters are to be replaced from char1 to char2.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-STRING PICX(15)VALUE'ABCDACDADEAAAFF'.PROCEDUREDIVISION.DISPLAY"OLD STRING : "WS-STRING.INSPECT WS-STRING REPLACINGALL'A'BY'X'.DISPLAY"NEW STRING : "WS-STRING.STOPRUN.

JCL to execute the above COBOL program.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

OLD STRING : ABCDACDADEAAAFF
NEW STRING : XBCDXCDXDEXXXFF

String

String verb is used to concatenate the strings. Using STRING statement, two or more strings of characters can be combined to form a longer string. Delimited By clause is compulsory.

Syntax

Following is the syntax of String verb −

STRING ws-string1 DELIMITEDBYSPACE
   ws-string2 DELIMITEDBYSIZEINTO ws-destination-string
   WITHPOINTER ws-count
   ONOVERFLOWDISPLAY message1
   NOTONOVERFLOWDISPLAY message2
END-STRING.

Following are the details of the used parameters −

  • ws-string1 and ws-string2 : Input strings to be concatenated
  • ws-string : Output string
  • ws-count : Used to count the length of new concatenated string
  • Delimited specifies the end of string
  • Pointer and Overflow are optional

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-STRING PICA(30).01 WS-STR1 PICA(15)VALUE'Tutorialspoint'.01 WS-STR2 PICA(7)VALUE'Welcome'.01 WS-STR3 PICA(7)VALUE'To AND'.01 WS-COUNT PIC99VALUE1.PROCEDUREDIVISION.STRING WS-STR2 DELIMITEDBYSIZE
  WS-STR3 DELIMITEDBYSPACE
  WS-STR1 DELIMITEDBYSIZEINTO WS-STRING 
  WITHPOINTER WS-COUNT
  ONOVERFLOWDISPLAY'OVERFLOW!'END-STRING.DISPLAY'WS-STRING : 'WS-STRING.DISPLAY'WS-COUNT : 'WS-COUNT.STOPRUN.</pre>

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

WS-STRING : WelcomeToTutorialspoint       
WS-COUNT : 25

Unstring

Unstring verb is used to split one string into multiple sub-strings. Delimited By clause is compulsory.

Syntax

Following is the syntax of Unstring verb −

UNSTRING ws-string DELIMITEDBYSPACEINTO ws-str1, ws-str2
WITHPOINTER ws-count
ONOVERFLOWDISPLAYmessageNOTONOVERFLOWDISPLAYmessageEND-UNSTRING.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-STRING PICA(30)VALUE'WELCOME TO TUTORIALSPOINT'.01 WS-STR1 PICA(7).01 WS-STR2 PICA(2).01 WS-STR3 PICA(15).01 WS-COUNT PIC99VALUE1.PROCEDUREDIVISION.UNSTRING WS-STRING DELIMITEDBYSPACEINTO WS-STR1, WS-STR2, WS-STR3
   END-UNSTRING.DISPLAY'WS-STR1 : 'WS-STR1.DISPLAY'WS-STR2 : 'WS-STR2.DISPLAY'WS-STR3 : 'WS-STR3.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

WS-STR1 : WELCOME
WS-STR2 : TO
WS-STR3 : TUTORIALSPOINT 

COBOL - Table Processing

Arrays in COBOL are known as tables. An array is a linear data structure and is a collection of individual data items of same type. Data items of a table are internally sorted.

Table Declaration

Table is declared in Data Division. Occurs clause is used to define a table. Occurs clause indicates the repetition of data name definition. It can be used only with level numbers starting from 02 to 49. Do not use occurs clause with Redefines. Description of one-dimensional and two-dimensional table is as follows −

One-Dimensional Table

In a one-dimensional table, occurs clause is used only once in declaration. WSTABLE is the group item that contains table. WS-B names the table elements that occur 10 times.

Syntax

Following is the syntax for defining a one-dimensional table −

01 WS-TABLE.
   05 WS-A PIC A(10) OCCURS 10 TIMES.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-TABLE.05 WS-A PICA(10)VALUE'TUTORIALS'OCCURS5TIMES.PROCEDUREDIVISION.DISPLAY"ONE-D TABLE : "WS-TABLE.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS

Two-Dimensional Table

A two-dimensional table is created with both data elements being variable length. For reference, go through the syntax and then try to analyze the table. The first array (WS-A) can occur from 1 to 10 times and the inner array (WS-C) can occur from 1 to 5 times. For each entry of WS-A, there will be corresponding 5 entries of WS-C.

Syntax

Following is the syntax for defining a two-dimensional table −

01 WS-TABLE.
   05 WS-A OCCURS 10 TIMES.
  10 WS-B PIC A(10).
  10 WS-C OCCURS 5 TIMES.
     15 WS-D PIC X(6).

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-TABLE.05 WS-A OCCURS2TIMES.10 WS-B PICA(10)VALUE' TUTORIALS'.10 WS-C OCCURS2TIMES.15 WS-D PICX(6)VALUE' POINT'.PROCEDUREDIVISION.DISPLAY"TWO-D TABLE : "WS-TABLE.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

TWO-D TABLE :  TUTORIALS POINT POINT TUTORIALS POINT POINT

Subscript

Table individual elements can be accessed by using subscript. Subscript values can range from 1 to the number of times the table occurs. A subscript can be any positive number. It does not require any declaration in data division. It is automatically created with occurs clause.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-TABLE.05 WS-A OCCURS3TIMES.10 WS-B PICA(2).10 WS-C OCCURS2TIMES.15 WS-D PICX(3).PROCEDUREDIVISION.MOVE'12ABCDEF34GHIJKL56MNOPQR'TO WS-TABLE.DISPLAY'WS-TABLE  : ' WS-TABLE.DISPLAY'WS-A(1)   : ' WS-A(1).DISPLAY'WS-C(1,1) : ' WS-C(1,1).DISPLAY'WS-C(1,2) : ' WS-C(1,2).DISPLAY'WS-A(2)   : ' WS-A(2).DISPLAY'WS-C(2,1) : ' WS-C(2,1).DISPLAY'WS-C(2,2) : ' WS-C(2,2).DISPLAY'WS-A(3)   : ' WS-A(3).DISPLAY'WS-C(3,1) : ' WS-C(3,1).DISPLAY'WS-C(3,2) : ' WS-C(3,2).STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

WS-TABLE  : 12ABCDEF34GHIJKL56MNOPQR
WS-A(1)   : 12ABCDEF
WS-C(1,1) : ABC
WS-C(1,2) : DEF
WS-A(2)   : 34GHIJKL
WS-C(2,1) : GHI
WS-C(2,2) : JKL
WS-A(3)   : 56MNOPQR
WS-C(3,1) : MNO
WS-C(3,2) : PQR

Index

Table elements can also be accessed using index. An index is a displacement of element from the start of the table. An index is declared with Occurs clause using INDEXED BY clause. The value of index can be changed using SET statement and PERFORM Varying option.

Syntax

Following is the syntax for defining Index in a table −

01 WS-TABLE.
   05 WS-A PIC A(10) OCCURS 10 TIMES INDEXED BY I.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-TABLE.05 WS-A OCCURS3TIMESINDEXEDBY I.10 WS-B PICA(2).10 WS-C OCCURS2TIMESINDEXEDBY J.15 WS-D PICX(3).PROCEDUREDIVISION.MOVE'12ABCDEF34GHIJKL56MNOPQR'TO WS-TABLE.PERFORM A-PARA VARYING I FROM1BY1UNTIL I >3STOPRUN.
   
   A-PARA.PERFORM C-PARA VARYING J FROM1BY1UNTIL J>2.
   
   C-PARA.DISPLAY WS-C(I,J).

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

ABC
DEF
GHI
JKL
MNO
PQR

Set Statement

Set statement is used to change the index value. Set verb is used to initialize, increment, or decrement the index value. It is used with Search and Search All to locate elements in table.

Syntax

Following is the syntax for using a Set statement −

SET I J TO positive-number
SET I TO J
SET I TO 5
SET I J UP BY 1
SET J DOWN BY 5

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-TABLE.05 WS-A OCCURS3TIMESINDEXEDBY I.10 WS-B PICA(2).10 WS-C OCCURS2TIMESINDEXEDBY J.15 WS-D PICX(3).PROCEDUREDIVISION.MOVE'12ABCDEF34GHIJKL56MNOPQR'TO WS-TABLE.SET I J TO1.DISPLAY WS-C(I,J).SET I J UPBY1.DISPLAY WS-C(I,J).STOPRUN.

JCL to execute the above COBOL program.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

ABC
JKL

Search

Search is a linear search method, which is used to find elements inside the table. It can be performed on sorted as well as unsorted table. It is used only for tables declared by Index phrase. It starts with the initial value of index. If the searched element is not found, then the index is automatically incremented by 1 and it continues till the end of table.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-TABLE.05 WS-A PICX(1)OCCURS18TIMESINDEXEDBY I.01 WS-SRCH PICA(1)VALUE'M'.PROCEDUREDIVISION.MOVE'ABCDEFGHIJKLMNOPQR'TO WS-TABLE.SET I TO1.SEARCH WS-A
  ATENDDISPLAY'M NOT FOUND IN TABLE'WHEN WS-A(I)= WS-SRCH
  DISPLAY'LETTER M FOUND IN TABLE'END-SEARCH.STOPRUN.</pre>

JCL to execute the above COBOL program.

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

LETTER M FOUND IN TABLE

Search All

Search All is a binary search method, which is used to find elements inside the table. Table must be in sorted order for Search All option. The index does not require initialization. In binary search, the table is divided into two halves and it determines in which half the searched element is present. This process repeats till the element is found or the end is reached.

Example

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.01 WS-TABLE.05 WS-RECORD OCCURS10TIMESASCENDINGKEYIS WS-NUM INDEXEDBY I.10 WS-NUM PIC9(2).10 WS-NAME PICA(3).PROCEDUREDIVISION.MOVE'12ABC56DEF34GHI78JKL93MNO11PQR'TO WS-TABLE.SEARCHALL WS-RECORD
 ATENDDISPLAY'RECORD NOT FOUND'WHEN WS-NUM(I)=93DISPLAY'RECORD FOUND 'DISPLAY WS-NUM(I)DISPLAY WS-NAME(I)END-SEARCH.</pre>

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

When you compile and execute the above program, it produces the following result −

RECORD FOUND 
93
MNO

COBOL - File Handling

The concept of files in COBOL is different from that in C/C++. While learning the basics of 'File' in COBOL, the concepts of both languages should not be corelated. Simple text files cannot be used in COBOL, instead PS (Physical Sequential) and VSAM files are used. PS files will be discussed in this module.

To understand file handling in COBOL, one must know the basic terms. These terms only serve to understand the fundamentals of file handling. Further in depth terminology would be discussed in the chapter 'File Handling Verbs'. Following are the basic terms −

  • Field
  • Record
  • Physical Record
  • Logical Record
  • File

The following example helps in understanding these terms −

Program Structure

Field

Field is used to indicate the data stored about an element. It represents a single element as shown in the above example such as student id, name, marks, total marks, and percentage. The number of characters in any field is known as field size, for example, student name can have 10 characters. Fields can have the following attributes −

  • Primary keys are those fields that are unique to each record and are used to identify a particular record. For example, in students marks file, each student will be having a unique student id which forms the primary key.
  • Secondary keys are unique or non-unique fields that are used to search for related data. For example, in students marks file, full name of student can be used as secondary key when student id is not known.
  • Descriptors fields are used to describe an entity. For example, in students marks file, marks and percentage fields that add meaning to the record are known descriptors.

Record

Record is a collection of fields that is used to describe an entity. One or more fields together form a record. For example, in students marks file, student id, name, marks, total marks, and percentage form one record. The cumulative size of all the fields in a record is known as the record size. The records present in a file may be of fixed length or variable length.

Physical Record

Physical record is the information that exists on the external device. It is also known as a block.

Logical Record

Logical record is the information used by the program. In COBOL programs, only one record can be handled at any point of time and it is called as logical record.

File

File is a collection of related records. For example, the students marks file consists of records of all the students.

COBOL - File Organization

File organization indicates how the records are organized in a file. There are different types of organizations for files so as to increase their efficiency of accessing the records. Following are the types of file organization schemes −

  • Sequential file organization
  • Indexed sequential file organization
  • Relative file organization

The syntaxes in this module, mentioned along with their respective terms, only refer to their usage in the program. The complete programs using these syntaxes would be discussed in the chapter 'File handling Verbs'.

Sequential File Organization

A sequential file consists of records that are stored and accessed in sequential order. Following are the key attributes of sequential file organization −

  • Records can be read in sequential order. For reading the 10th record, all the previous 9 records should be read.
  • Records are written in sequential order. A new record cannot be inserted in between. A new record is always inserted at the end of the file.
  • After placing a record into a sequential file, it is not possible to delete, shorten, or lengthen a record.
  • Order of the records, once inserted, can never be changed.
  • Updation of record is possible. A record can be overwritten, if the new record length is same as the old record length.
  • Sequential output files are good option for printing.

Syntax

Following is the syntax of sequential file organization −

INPUT-OUTPUT SECTION.
FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name-jcl
   ORGANIZATION IS SEQUENTIAL

Indexed Sequential File Organization

An indexed sequential file consists of records that can be accessed sequentially. Direct access is also possible. It consists of two parts −

  • Data File contains records in sequential scheme.
  • Index File contains the primary key and its address in the data file.

Following are the key attributes of sequential file organization −

  • Records can be read in sequential order just like in sequential file organization.
  • Records can be accessed randomly if the primary key is known. Index file is used to get the address of a record and then the record is fetched from the data file.
  • Sorted index is maintained in this file system which relates the key value to the position of the record in the file.
  • Alternate index can also be created to fetch the records.

Syntax

Following is the syntax of indexed sequential file organization −

INPUT-OUTPUTSECTION.FILE-CONTROL.SELECT file-name ASSIGNTO dd-name-jcl
   ORGANIZATIONISINDEXEDRECORDKEYIS primary-key
   ALTERNATERECORDKEYIS rec-key

Relative File Organization

A relative file consists of records ordered by their relative address. Following are the key attributes of relative file organization −

  • Records can be read in sequential order just like in sequential and indexed file organization.
  • Records can be accessed using relative key. Relative key represents the records location relative to the address of the start of the file.
  • Records can be inserted using relative key. Relative address is calculated using relative key.
  • Relative file provides the fastest access to the records.
  • The main disadvantage of this file system is that if some intermediate records are missing, they will also occupy space.

Syntax

Following is the syntax of relative file organization −

INPUT-OUTPUTSECTION.FILE-CONTROL.SELECT file-name ASSIGNTO dd-name-jcl
   ORGANIZATIONISRELATIVERELATIVEKEYIS rec-key

COBOL - File Access Mode

Till now, file organization schemes have been discussed. For each file organization scheme, different access modes can be used. Following are the types of file access modes −

  • Sequential Access
  • Random Access
  • Dynamic Access

The syntaxes in this module, mentioned along with their respective terms, only refer to their usage in the program. The complete programs using these syntaxes would be discussed in the next chapter.

Sequential Access

When the access mode is sequential, the method of record retrieval changes as per the selected file organization.

  • For sequential files, records are accessed in the same order in which they were inserted.
  • For indexed files, the parameter used to fetch the records are the record key values.
  • For relative files, relative record keys are used to retrieve the records.

Syntax

Following is the syntax of sequential access mode −

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS SEQUENTIAL
   ACCESS MODE IS SEQUENTIAL
	
	
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS INDEXED
   ACCESS MODE IS SEQUENTIAL
   RECORD KEY IS rec-key1
   ALTERNATE RECORD KEY IS rec-key2

		
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS RELATIVE
   ACCESS MODE IS SEQUENTIAL
   RELATIVE KEY IS rec-key1

Random Access

When the access mode is RANDOM, the method of record retrieval changes as per the selected file organization.

  • For indexed files, records are accessed according to the value placed in a key field which can be primary or alternate key. There can be one or more alternate indexes.
  • For relative files , records are retrieved through relative record keys.

Syntax

Following is the syntax of random access mode −

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS INDEXED
   ACCESS MODE IS RANDOM
   RECORD KEY IS rec-key1
   ALTERNATE RECORD KEY IS rec-key2

		
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS RELATIVE
   ACCESS MODE IS RANDOM
   RELATIVE KEY IS rec-key1

Dynamic Access

Dynamic access supports both sequential and random access in the same program. With dynamic access, one file definition is used to perform both sequential and random processing like accessing some records in sequential order and other records by their keys.

With relative and indexed files, the dynamic access mode allows you to switch back and forth between sequential access mode and random access mode while reading a file by using the NEXT phrase on the READ statement. NEXT and READ functionalities will be discussed in the next chapter.

Syntax

Following is the syntax of dynamic access mode −

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS SEQUENTIAL
   ACCESS MODE IS DYNAMIC
   RECORD KEY IS rec-key1
   ALTERNATE RECORD KEY IS rec-key2

		
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS RELATIVE
   ACCESS MODE IS DYNAMIC
   RELATIVE KEY IS rec-key1

COBOL - File Handling Verbs

File handling verbs are used to perform various operations on files. Following are the file handling verbs −

  • Open
  • Read
  • Write
  • Rewrite
  • Delete
  • Start
  • Close

Open Verb

Open is the first file operation that must be performed. If Open is successful, then only further operations are possible on a file. Only after opening a file, the variables in the file structure are available for processing. FILE STATUS variable is updated after each file operation.

Syntax

OPEN "mode" file-name.

Here, file-name is string literal, which you will use to name your file. A file can be opened in the following modes −

Sr.No.Mode & Description
1InputInput mode is used for existing files. In this mode, we can only read the file, no other operations are allowed on the file.
2OutputOutput mode is used to insert records in files. If a sequential file is used and the file is holding some records, then the existing records will be deleted first and then new records will be inserted in the file. It will not happen so in case of an indexed file or a relative file.
3ExtendExtend mode is used to append records in a sequential file. In this mode, records are inserted at the end. If file access mode is Random or Dynamic, then extend mode cannot be used.
4I-OInput-Output mode is used to read and rewrite the records of a file.

Read Verb

Read verb is used to read the file records. The function of read is to fetch records from a file. At each read verb, only one record can be read into the file structure. To perform a read operation, open the file in INPUT or I-O mode. At each read statement, the file pointer is incremented and hence the successive records are read.

Syntax

Following is the syntax to read the records when the file access mode is sequential −

READ file-name NEXT RECORD INTO ws-file-structure
   AT END DISPLAY 'End of File'
   NOT AT END DISPLAY 'Record Details:' ws-file-structure
END-READ.

Following are the parameters used −

  • NEXT RECORD is optional and is specified when an indexed sequential file is being read sequentially.
  • INTO clause is optional. ws-file-structure is defined in the WorkingStorage Section to get the values from the READ statement.
  • AT END condition becomes True when the end of file is reached.

Example − The following example reads an existing file using line sequential organization. This program can be compiled and executed using Live Demo option where it will display all the records present in the file.

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.ENVIRONMENTDIVISION.INPUT-OUTPUTSECTION.FILE-CONTROL.SELECT STUDENT ASSIGNTO'input.txt'ORGANIZATIONISLINESEQUENTIAL.DATADIVISION.FILESECTION.FD STUDENT.01 STUDENT-FILE.05 STUDENT-ID PIC9(5).05 NAME PICA(25).WORKING-STORAGESECTION.01 WS-STUDENT.05 WS-STUDENT-ID PIC9(5).05 WS-NAME PICA(25).01 WS-EOF PICA(1).PROCEDUREDIVISION.OPENINPUT STUDENT.PERFORMUNTIL WS-EOF='Y'READ STUDENT INTO WS-STUDENT
        ATENDMOVE'Y'TO WS-EOF
        NOTATENDDISPLAY WS-STUDENT
     END-READEND-PERFORM.CLOSE STUDENT.STOPRUN.</pre>

Suppose the input file data available in the input.txt file contains the following −

20003 Mohtashim M.
20004 Nishant Malik
20005 Amitabh Bachhan

When you compile and execute the above program, it produces the following result −

20003 Mohtashim M.            
20004 Nishant Malik           
20005 Amitabh Bachhan 

Syntax

Following is the syntax to read a record when the file access mode is random −

READ file-name RECORD INTO ws-file-structure
   KEY IS rec-key
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'Record Details: ' ws-file-structure
END-READ.

Example − The following example reads an existing file using indexed organization. This program can be compiled and executed using JCL on Mainframes where it will display all the records present in the file. On Mainframes server, we do not use text files; instead we use PS files.

Let's assume that the file present on Mainframes have same content as input.txt file in the above example.

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.ENVIRONMENTDIVISION.INPUT-OUTPUTSECTION.FILE-CONTROL.SELECT STUDENT ASSIGNTO IN1
  ORGANIZATIONISINDEXEDACCESSISRANDOMRECORDKEYIS STUDENT-ID
  FILESTATUSIS FS.DATADIVISION.FILESECTION.FD STUDENT.01 STUDENT-FILE.05 STUDENT-ID PIC9(5).05 NAME PICA(25).WORKING-STORAGESECTION.01 WS-STUDENT.05 WS-STUDENT-ID PIC9(5).05 WS-NAME PICA(25).PROCEDUREDIVISION.OPENINPUT STUDENT.MOVE20005TO STUDENT-ID.READ STUDENT RECORDINTO WS-STUDENT-FILE
     KEYIS STUDENT-ID
     INVALIDKEYDISPLAY'Invalid Key'NOTINVALIDKEYDISPLAY WS-STUDENT-FILE
  END-READ.CLOSE STUDENT.STOPRUN.</pre>

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN1 DD DSN = STUDENT-FILE-NAME,DISP=SHR

When you compile and execute the above program, it produces the following result −

20005 Amitabh Bachhan 

Write Verb

Write verb is used to insert records in a file. Once the record is written, it is no longer available in the record buffer. Before inserting records into the file, move the values into the record buffer and then perform write verb.

Write statement can be used with FROM option to directly write records from the working storage variables. From is an optional clause. If the access mode is sequential, then to write a record, the file must open in Output mode or Extend mode. If the access mode is random or dynamic, then to write a record, the file must open in Output mode or I-O mode.

Syntax

Following is the syntax to read a record when the file organization is sequential −

WRITE record-buffer [FROM ws-file-structure]
END-WRITE.

Following is the syntax to read a record when the file organization is indexed or relative −

WRITE record-buffer [FROM ws-file-structure]
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'Record Inserted'
END-WRITE.

Example − The following example shows how to insert a new record in a new file when the organization is sequential.

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.ENVIRONMENTDIVISION.INPUT-OUTPUTSECTION.FILE-CONTROL.SELECT STUDENT ASSIGNTO OUT1
  ORGANIZATIONISSEQUENTIALACCESSISSEQUENTIALFILESTATUSIS FS.DATADIVISION.FILESECTION.FD STUDENT
01 STUDENT-FILE.05 STUDENT-ID PIC9(5).05 NAME PICA(25).05CLASSPICX(3).WORKING-STORAGESECTION.01 WS-STUDENT.05 WS-STUDENT-ID PIC9(5).05 WS-NAME PICA(25).05 WS-CLASS PICX(3).PROCEDUREDIVISION.OPENEXTEND STUDENT.MOVE1000TO STUDENT-ID.MOVE'Tim'TO NAME.MOVE'10'TOCLASS.WRITE STUDENT-FILE
  END-WRITE.CLOSE STUDENT.STOPRUN.</pre>

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//OUT1 DD DSN = OUTPUT-FILE-NAME,DISP =(NEW,CATALOG,DELETE)

When you compile and execute the above program, it will add a new record to the output file.

1000 Tim         10

Rewrite Verb

Rewrite verb is used to update the records. File should be opened in I-O mode for rewrite operations. It can be used only after a successful Read operation. Rewrite verb overwrites the last record read.

Syntax

Following is the syntax to read a record when the file organization is sequential −

REWRITE record-buffer [FROM ws-file-structure]
END-REWRITE.

Following is the syntax to read a record when the file organization is indexed or relative −

REWRITE record-buffer [FROM ws-file-structure]
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'Record Updated'
END-REWRITE.

Example − The following example shows how to update an existing record which we have inserted in the previous Write step −

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.ENVIRONMENTDIVISION.INPUT-OUTPUTSECTION.FILE-CONTROL.SELECT STUDENT ASSIGNTO IN1
  ORGANIZATIONISINDEXEDACCESSISRANDOMRECORDKEYIS STUDENT-ID
  FILESTATUSIS FS.DATADIVISION.FILESECTION.FD STUDENT
01 STUDENT-FILE.05 STUDENT-ID PIC9(4).05 NAME PICA(12).05CLASSPICX(3).WORKING-STORAGESECTION.01 WS-STUDENT.05 WS-STUDENT-ID PIC9(5).05 WS-NAME PICA(25).05 WS-CLASS PICX(3).PROCEDUREDIVISION.OPENI-O STUDENT.MOVE'1000'TO STUDENT-ID.READ STUDENT
  KEYIS STUDENT-ID
  INVALIDKEYDISPLAYKEYISNOT EXISTING
END-READ.MOVE'Tim Dumais'TO NAME.REWRITE STUDENT-FILE END-REWRITE.CLOSE STUDENT.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR

When you compile and execute the above program, it will update the record −

1000 Tim Dumais  10

Delete Verb

Delete verb can be performed only on indexed and relative files. The file must be opened in I-O mode. In sequential file organization, records cannot be deleted. The record last read by the Read statement is deleted in case of sequential access mode. In random access mode, specify the record key and then perform the Delete operation.

Syntax

Following is the syntax to delete a record −

DELETE file-name RECORD
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'Record Deleted'
END-DELETE.

Example − to delete an existing record −

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.ENVIRONMENTDIVISION.INPUT-OUTPUTSECTION.FILE-CONTROL.SELECT STUDENT ASSIGNTO OUT1
  ORGANIZATIONISINDEXEDACCESSISRANDOMRECORDKEYIS STUDENT-ID
  FILESTATUSIS FS.DATADIVISION.FILESECTION.FD STUDENT
01 STUDENT-FILE.05 STUDENT-ID PIC9(4).05 NAME PICA(12).05CLASSPICX(3).WORKING-STORAGESECTION.01 WS-STUDENT.05 WS-STUDENT-ID PIC9(5).05 WS-NAME PICA(25).05 WS-CLASS PICX(3).PROCEDUREDIVISION.OPENI-O STUDENT.MOVE'1000'TO STUDENT-ID.DELETE STUDENT RECORDINVALIDKEYDISPLAY'Invalid Key'NOTINVALIDKEYDISPLAY'Record Deleted'END-DELETE.CLOSE STUDENT.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//OUT1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR

When you compile and execute the above program, it produces the following result −

Record Deleted

Start Verb

Start verb can be performed only on indexed and relative files. It is used to place the file pointer at a specific record. The access mode must be sequential or dynamic. File must be opened in I-O or Input mode.

Syntax

Following is the syntax to place the pointer at a specific record −

START file-name KEY IS [=, >, <, NOT, <= or >=] rec-key
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'File Pointer Updated'
END-START.

Close Verb

Close verb is used to close a file. After performing Close operation, the variables in the file structure will not be available for processing. The link between program and file is lost.

Syntax

Following is the syntax to close a file −

CLOSE file-name.

COBOL - Subroutines

Cobol subroutine is a program that can be compiled independently but cannot be executed independently. There are two types of subroutines: internal subroutines like Perform statements and external subroutines like CALL verb.

Call Verb

Call verb is used to transfer the control from one program to another program. The program that contains the CALL verb is the Calling Program and the program being called is known as the Called Program. Calling program execution will halt until the called program finishes the execution. Exit Program statement is used in the Called program to transfer the control back.

Called Program Constraints

Following are the called program requirements −

  • Linkage section must be defined in the called program. It consists of data elements passed in the program. The data items should not have Value clause. PIC clause must be compatible with the variables passed through the calling program.
  • Procedure division using has a list of variables passed from the calling program and the order must be same as mentioned in the Call verb.
  • Exit program statement is used in the called program to transfer the control back. It must be the last statement in the called program.

The parameters can be passed between programs in two ways −

  • By Reference
  • By Content

Call By Reference

If the values of variables in the called program are modified, then their new values will reflect in the calling program. If BY clause is not specified, then variables are always passed by reference.

Syntax

Following is the syntax of calling subroutine by reference −

CALL sub-prog-name USING variable-1, variable-2.

Example

Following example is the MAIN calling program and UTIL is the called program −

IDENTIFICATIONDIVISION.PROGRAM-ID. MAIN.DATADIVISION.WORKING-STORAGESECTION.01 WS-STUDENT-ID PIC9(4)VALUE1000.01 WS-STUDENT-NAME PICA(15)VALUE'Tim'.PROCEDUREDIVISION.CALL'UTIL'USING WS-STUDENT-ID, WS-STUDENT-NAME.DISPLAY'Student Id : ' WS-STUDENT-ID
   DISPLAY'Student Name : ' WS-STUDENT-NAME
STOPRUN.

Called Program

IDENTIFICATIONDIVISION.PROGRAM-ID. UTIL.DATADIVISION.LINKAGESECTION.01 LS-STUDENT-ID PIC9(4).01 LS-STUDENT-NAME PICA(15).PROCEDUREDIVISIONUSING LS-STUDENT-ID, LS-STUDENT-NAME.DISPLAY'In Called Program'.MOVE1111TO LS-STUDENT-ID.EXITPROGRAM.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = MAIN

When you compile and execute the above program, it produces the following result −

In Called Program
Student Id : 1111
Student Name : Tim

Call By Content

If the values of variables in the called program are modified, then their new values will not reflect in the calling program.

Syntax

Following is the syntax of calling subroutine by content −

CALL sub-prog-name USING 
BY CONTENT variable-1, BY CONTENT variable-2.

Example

Following example is the MAIN calling program and UTIL is the called program −

IDENTIFICATIONDIVISION.PROGRAM-ID. MAIN.DATADIVISION.WORKING-STORAGESECTION.01 WS-STUDENT-ID PIC9(4)VALUE1000.01 WS-STUDENT-NAME PICA(15)VALUE'Tim'.PROCEDUREDIVISION.CALL'UTIL'USINGBYCONTENT WS-STUDENT-ID,BYCONTENT WS-STUDENT-NAME.DISPLAY'Student Id : ' WS-STUDENT-ID
   DISPLAY'Student Name : ' WS-STUDENT-NAME
STOPRUN.

Called Program

IDENTIFICATIONDIVISION.PROGRAM-ID. UTIL.DATADIVISION.LINKAGESECTION.01 LS-STUDENT-ID PIC9(4).01 LS-STUDENT-NAME PICA(15).PROCEDUREDIVISIONUSING LS-STUDENT-ID, LS-STUDENT-NAME.DISPLAY'In Called Program'.MOVE1111TO LS-STUDENT-ID.EXITPROGRAM.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = MAIN

When you compile and execute the above program, it produces the following result −

In Called Program
Student Id : 1000
Student Name : Tim

Types of Call

There are two types of calls −

  • Static Call occurs when a program is compiled with the NODYNAM compiler option. A static called program is loaded into storage at compile time.
  • Dynamic Call occurs when a program is compiled with the DYNAM and NODLL compiler option. A dynamic called program is loaded into storage at runtime.

COBOL - Internal Sort

Sorting of data in a file or merging of two or more files is a common necessity in almost all business-oriented applications. Sorting is used for arranging records either in ascending or descending order, so that sequential processing can be performed. There are two techniques which are used for sorting files in COBOL −

  • External sort is used to sort files by using the SORT utility in JCL. We have discussed this in the JCL chapter. As of now, we will focus on internal sort.
  • Internal sort is used to sort files within a COBOL program. SORT verb is used to sort a file.

Sort Verb

Three files are used in the sort process in COBOL −

  • Input file is the file which we have to sort either in ascending or descending order.
  • Work file is used to hold records while the sort process is in progress. Input file records are transferred to the work file for the sorting process. This file should be defined in the File-Section under SD entry.
  • Output file is the file which we get after the sorting process. It is the final output of the Sort verb.

Syntax

Following is the syntax to sort a file −

SORT work-file ON ASCENDING KEY rec-key1
   [ON DESCENDING KEY rec-key2]
USING input-file GIVING output-file.

SORT performs the following operations −

  • Opens work-file in I-O mode, input-file in the INPUT mode and output-file in the OUTPUT mode.
  • Transfers the records present in the input-file to the work-file.
  • Sorts the SORT-FILE in ascending/descending sequence by rec-key.
  • Transfers the sorted records from the work-file to the output-file.
  • Closes the input-file and the output-file and deletes the work-file.

Example

In the following example, INPUT is the input file which needs to be sorted in ascending order −

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.ENVIRONMENTDIVISION.INPUT-OUTPUTSECTION.FILE-CONTROL.SELECTINPUTASSIGNTOIN.SELECTOUTPUTASSIGNTO OUT.SELECT WORK ASSIGNTO WRK.DATADIVISION.FILESECTION.FDINPUT.01 INPUT-STUDENT.05 STUDENT-ID-I PIC9(5).05 STUDENT-NAME-I PICA(25).FDOUTPUT.01 OUTPUT-STUDENT.05 STUDENT-ID-O PIC9(5).05 STUDENT-NAME-O PICA(25).SD WORK.01 WORK-STUDENT.05 STUDENT-ID-W PIC9(5).05 STUDENT-NAME-W PICA(25).PROCEDUREDIVISION.SORT WORK ONASCENDINGKEY STUDENT-ID-O
   USINGINPUTGIVINGOUTPUT.DISPLAY'Sort Successful'.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN DD DSN = INPUT-FILE-NAME,DISP = SHR
//OUT DD DSN = OUTPUT-FILE-NAME,DISP = SHR
//WRK DD DSN =&&TEMP

When you compile and execute the above program, it produces the following result −

Sort Successful

Merge Verb

Two or more identically sequenced files are combined using Merge statement. Files used in the merge process −

  • Input Files − Input-1, Input-2
  • Work File
  • Output File

Syntax

Following is the syntax to merge two or more files −

MERGE work-file ONASCENDINGKEY rec-key1
   [ONDESCENDINGKEY rec-key2]

USING input-1, input-2 GIVING output-file.

Merge performs the following operations −

  • Opens the work-file in I-O mode, input-files in the INPUT mode and output-file in the OUTPUT mode.
  • Transfers the records present in the input-files to the work-file.
  • Sorts the SORT-FILE in ascending/descending sequence by rec-key.
  • Transfers the sorted records from the work-file to the output-file.
  • Closes the input-file and the output-file and deletes the work-file.

Example

In the following example, INPUT1 and INPUT2 are the input files which are to be merged in ascending order −

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.ENVIRONMENTDIVISION.INPUT-OUTPUTSECTION.FILE-CONTROL.SELECT INPUT1 ASSIGNTO IN1.SELECT INPUT2 ASSIGNTO IN2.SELECTOUTPUTASSIGNTO OUT.SELECT WORK ASSIGNTO WRK.DATADIVISION.FILESECTION.FD INPUT1.01 INPUT1-STUDENT.05 STUDENT-ID-I1 PIC9(5).05 STUDENT-NAME-I1 PICA(25).FD INPUT2.01 INPUT2-STUDENT.05 STUDENT-ID-I2 PIC9(5).05 STUDENT-NAME-I2 PICA(25).FDOUTPUT.01 OUTPUT-STUDENT.05 STUDENT-ID-O PIC9(5).05 STUDENT-NAME-O PICA(25).SD WORK.01 WORK-STUDENT.05 STUDENT-ID-W PIC9(5).05 STUDENT-NAME-W PICA(25).PROCEDUREDIVISION.MERGE WORK ONASCENDINGKEY STUDENT-ID-O
   USING INPUT1, INPUT2 GIVINGOUTPUT.DISPLAY'Merge Successful'.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN1 DD DSN=INPUT1-FILE-NAME,DISP=SHR
//IN2 DD DSN=INPUT2-FILE-NAME,DISP=SHR
//OUT DD DSN = OUTPUT-FILE-NAME,DISP=SHR
//WRK DD DSN =&&TEMP

When you compile and execute the above program, it produces the following result −

Merge Successful

COBOL - Database Interface

As of now, we have learnt the use of files in COBOL. Now, we will discuss how a COBOL program interacts with DB2. It involves the following terms −

  • Embedded SQL
  • DB2 Application Programming
  • Host Variables
  • SQLCA
  • SQL Queries
  • Cursors

Embedded SQL

Embedded SQL statements are used in COBOL programs to perform standard SQL operations. Embedded SQL statements are preprocessed by the SQL processor before the application program is compiled. COBOL is known as the Host Language. COBOL-DB2 applications are those applications that include both COBOL and DB2.

Embedded SQL statements work like normal SQL statements with some minor changes. For example, the output of a query is directed to a predefined set of variables which are referred as Host Variables. An additional INTO clause is placed in the SELECT statement.

DB2 Application Programming

Following are rules to be followed while coding a COBOL-DB2 program −

  • All the SQL statements must be delimited between EXEC SQL and ENDEXEC..
  • SQL statements must be coded in Area B.
  • All the tables that are used in a program must be declared in the WorkingStorage Section. This is done by using the INCLUDE statement.
  • All SQL statements other than INCLUDE and DECLARE TABLE must appear in the Procedure Division.

Host Variables

Host variables are used for receiving data from a table or inserting data in a table. Host variables must be declared for all values that are to be passed between the program and the DB2. They are declared in the Working-Storage Section.

Host variables cannot be group items, but they may be grouped together in host structure. They cannot be Renamed or Redefined. Using host variables with SQL statements, prefix them with a colon (:)..

Syntax

Following is the syntax to declare host variables and include tables in the Working-Storage section −

DATADIVISION.WORKING-STORAGESECTION.
   
   EXEC SQL
   INCLUDE table-name
   END-EXEC.

   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.01 STUDENT-REC.05 STUDENT-ID PIC9(4).05 STUDENT-NAME PICX(25).05 STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

SQLCA

SQLCA is a SQL communication area through which DB2 passes the feedback of SQL execution to the program. It tells the program whether an execution was successful or not. There are a number of predefined variables under SQLCA like SQLCODE which contains the error code. The value '000' in SQLCODE states a successful execution.

Syntax

Following is the syntax to declare an SQLCA in the Working-Storage section −

DATA DIVISION.
WORKING-STORAGE SECTION.
	EXEC SQL
	INCLUDE SQLCA
	END-EXEC.

SQL Queries

Lets assume we have one table named as 'Student' that contains Student-Id, Student-Name, and Student-Address.

The STUDENT table contains the following data −

Student Id		Student Name		Student Address
1001 			   Mohtashim M.		Hyderabad
1002			   Nishant Malik		Delhi
1003 			   Amitabh Bachan		Mumbai
1004			   Chulbul Pandey		Lucknow

The following example shows the usage of SELECT query in a COBOL program −

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.
   EXEC SQL
  INCLUDE SQLCA
END-EXEC. EXEC SQL
  INCLUDE STUDENT
END-EXEC. EXEC SQL BEGIN DECLARE SECTION END-EXEC.01 WS-STUDENT-REC.05 WS-STUDENT-ID PIC9(4).05 WS-STUDENT-NAME PICX(25).05 WS-STUDENT-ADDRESS X(50). EXEC SQL END DECLARE SECTION END-EXEC.PROCEDUREDIVISION. EXEC SQL
  SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS
  INTO:WS-STUDENT-ID,:WS-STUDENT-NAME, WS-STUDENT-ADDRESS FROM STUDENT
  WHERE STUDENT-ID=1004
END-EXEC.IF SQLCODE =0DISPLAY WS-STUDENT-RECORD ELSEDISPLAY'Error'END-IF.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP001  EXEC PGM = IKJEFT01
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP = SHR
//SYSPRINT DD SYSOUT=*//SYSUDUMP DD SYSOUT=*//SYSOUT   DD SYSOUT=*//SYSTSIN  DD *
   DSN SYSTEM(SSID)RUNPROGRAM(HELLO) PLAN(PLANNAME)-END/*

When you compile and execute the above program, it produces the following result −

1004 Chulbul Pandey		Lucknow

The following example shows the usage of INSERT query in a COBOL program −

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.
   EXEC SQL
   INCLUDE SQLCA
   END-EXEC.
   
   EXEC SQL
   INCLUDE STUDENT
   END-EXEC.
   
   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.01 WS-STUDENT-REC.05 WS-STUDENT-ID PIC9(4).05 WS-STUDENT-NAME PICX(25).05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.PROCEDUREDIVISION.MOVE1005TO WS-STUDENT-ID.MOVE'TutorialsPoint'TO WS-STUDENT-NAME.MOVE'Hyderabad'TO WS-STUDENT-ADDRESS.
   
   EXEC SQL
  INSERT INTO STUDENT(STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS)VALUES(:WS-STUDENT-ID,:WS-STUDENT-NAME, WS-STUDENT-ADDRESS)
END-EXEC.IF SQLCODE =0DISPLAY'Record Inserted Successfully'DISPLAY WS-STUDENT-REC ELSEDISPLAY'Error'END-IF.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP001  EXEC PGM = IKJEFT01
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT =*//SYSUDUMP DD SYSOUT =*//SYSOUT   DD SYSOUT =*//SYSTSIN  DD *
   DSN SYSTEM(SSID)RUNPROGRAM(HELLO) PLAN(PLANNAME)-END/*

When you compile and execute the above program, it produces the following result −

Record Inserted Successfully
1005 TutorialsPoint		Hyderabad

The following example shows the usage of UPDATE query in a COBOL program −

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.
   
   EXEC SQL
   INCLUDE SQLCA
   END-EXEC.
   
   EXEC SQL
   INCLUDE STUDENT
   END-EXEC.
   
   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.01 WS-STUDENT-REC.05 WS-STUDENT-ID PIC9(4).05 WS-STUDENT-NAME PICX(25).05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.PROCEDUREDIVISION.MOVE'Bangalore'TO WS-STUDENT-ADDRESS.
   EXEC SQL
  UPDATE STUDENT SET STUDENT-ADDRESS=:WS-STUDENT-ADDRESS
  WHERE STUDENT-ID =1003
END-EXEC.IF SQLCODE =0DISPLAY'Record Updated Successfully'ELSEDISPLAY'Error'END-IF.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP001  EXEC PGM = IKJEFT01
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP = SHR
//SYSPRINT DD SYSOUT =*//SYSUDUMP DD SYSOUT =*//SYSOUT   DD SYSOUT =*//SYSTSIN  DD *
   DSN SYSTEM(SSID)RUNPROGRAM(HELLO) PLAN(PLANNAME)-END/*

When you compile and execute the above program, it produces the following result −

Record Updated Successfully

The following example shows the usage of DELETE query in a COBOL program −

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.

   EXEC SQL
   INCLUDE SQLCA
   END-EXEC.
   
   EXEC SQL
   INCLUDE STUDENT
   END-EXEC.
   
   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.01 WS-STUDENT-REC.05 WS-STUDENT-ID PIC9(4).05 WS-STUDENT-NAME PICX(25).05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.PROCEDUREDIVISION.MOVE1005TO WS-STUDENT-ID.
   
   EXEC SQL
  DELETEFROM STUDENT
  WHERE STUDENT-ID=:WS-STUDENT-ID
END-EXEC.IF SQLCODE =0DISPLAY'Record Deleted Successfully'ELSEDISPLAY'Error'END-IF.STOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP001  EXEC PGM = IKJEFT01
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT =*//SYSUDUMP DD SYSOUT =*//SYSOUT   DD SYSOUT =*//SYSTSIN  DD *
   DSN SYSTEM(SSID)RUNPROGRAM(HELLO) PLAN(PLANNAME)-END/*

When you compile and execute the above program, it produces the following result −

Record Deleted Successfully

Cursors

Cursors are used to handle multiple row selections at a time. They are data structures that hold all the results of a query. They can be defined in the Working-Storage Section or the Procedure Division. Following are the operations associated with Cursor −

  • Declare
  • Open
  • Close
  • Fetch

Declare Cursor

Cursor declaration can be done in the Working-Storage Section or the Procedure Division. The first statement is the DECLARE statement which is a nonexecutable statement.

EXEC SQL
   DECLARE STUDCUR CURSORFORSELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
   WHERE STUDENT-ID >:WS-STUDENT-ID
END-EXEC.

Open

Before using a cursor, Open statement must be performed. The Open statement prepares the SELECT for execution.

EXEC SQL
   OPEN STUDCUR
END-EXEC.

Close

Close statement releases all the memory occupied by the cursor. It is mandatory to close a cursor before ending a program.

EXEC SQL
   CLOSE STUDCUR
END-EXEC.

Fetch

Fetch statement identifies the cursor and puts the value in the INTO clause. A Fetch statement is coded in loop as we get one row at a time.

EXEC SQL
   FETCH STUDCUR
   INTO:WS-STUDENT-ID,:WS-STUDENT-NAME, WS-STUDENT-ADDRESS
END-EXEC.

The following example shows the usage of cursor to fetch all the records from the STUDENT table −

IDENTIFICATIONDIVISION.PROGRAM-ID. HELLO.DATADIVISION.WORKING-STORAGESECTION.
   
   EXEC SQL
   INCLUDE SQLCA
   END-EXEC.
   
   EXEC SQL
   INCLUDE STUDENT
   END-EXEC.
   
   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.01 WS-STUDENT-REC.05 WS-STUDENT-ID PIC9(4).05 WS-STUDENT-NAME PICX(25).05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.
   
   EXEC SQL
  DECLARE STUDCUR CURSORFORSELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
  WHERE STUDENT-ID &gt;:WS-STUDENT-ID
END-EXEC.PROCEDUREDIVISION.MOVE1001TO WS-STUDENT-ID.PERFORMUNTIL SQLCODE =100 EXEC SQL
  FETCH STUDCUR
  INTO:WS-STUDENT-ID,:WS-STUDENT-NAME, WS-STUDENT-ADDRESS
END-EXEC DISPLAY WS-STUDENT-REC END-PERFORMSTOPRUN.

JCL to execute the above COBOL program −

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS= A,MSGCLASS = C
//STEP001  EXEC PGM=IKJEFT01
//STEPLIB  DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT=*//SYSUDUMP DD SYSOUT=*//SYSOUT   DD SYSOUT=*//SYSTSIN  DD *
   DSN SYSTEM(SSID)RUNPROGRAM(HELLO) PLAN(PLANNAME)-END/*

When you compile and execute the above program, it produces the following result −

1001 Mohtashim M.		Hyderabad
1002 Nishant Malik		Delhi
1003 Amitabh Bachan		Mumbai
1004 Chulbul Pandey		Lucknow

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *