COBOL - 快速指南


COBOL - 概述

COBOL 简介

COBOL 是一种高级语言。人们必须了解 COBOL 的工作方式。计算机只能理解机器码,即由 0 和 1 组成的二进制流。必须使用编译器将 COBOL 代码转换为机器代码。通过编译器运行程序源。编译器首先检查任何语法错误,然后将其转换为机器语言。编译器创建一个称为加载模块的输出文件。该输出文件包含 0 和 1 形式的可执行代码。

COBOL 的演变

20世纪50年代,当世界西部地区的业务不断增长时,需要将各种流程自动化以方便操作,这就催生了一种用于业务数据处理的高级编程语言。

  • 1959年,CODASYL(数据系统语言会议)开发了COBOL。

  • 下一个版本 COBOL-61 于 1961 年发布,并进行了一些修订。

  • 1968年,COBOL被ANSI批准为商业用途的标准语言(COBOL-68)。

  • 1974年和1985年再次修订,开发了后续版本,分别命名为COBOL-74和COBOL-85。

  • 2002年,面向对象的COBOL发布,它可以使用封装的对象作为COBOL编程的正常部分。

COBOL 的重要性

  • COBOL 是第一个广泛使用的高级编程语言。它是一种类似英语的语言,用户友好。所有指令都可以用简单的英文单词编码。

  • COBOL 也用作自文档语言。

  • COBOL可以处理海量数据。

  • COBOL 与其以前的版本兼容。

  • COBOL 具有有效的错误消息,因此解决错误更容易。

COBOL的特点

标准语言

COBOL是一种标准语言,可以在IBM AS/400、个人计算机等机器上编译和执行。

商业导向

COBOL 专为与金融领域、国防领域等相关的面向业务的应用程序而设计。由于其先进的文件处理能力,它可以处理大量数据。

强大的语言

COBOL 是一种强大的语言,因为它的众多调试和测试工具可用于几乎所有计算机平台。

结构化语言

COBOL 中提供了逻辑控制结构,使其更易于阅读和修改。COBOL有不同的划分,因此很容易调试。

COBOL - 环境设置

我们在线搭建了COBOL编程环境,以便您可以在线编译和执行所有可用的示例。它使您对所阅读的内容充满信心,并使您能够使用不同的选项验证程序。请随意修改任何示例并在线执行。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

PROCEDURE DIVISION.
   DISPLAY 'Hello World'.
STOP RUN.

对于本教程中给出的大多数示例,您将在我们网站右上角的代码部分中找到“试用”选项,该选项将带您进入在线编译器。因此,请充分利用它并享受学习的乐趣。

在 Windows/Linux 上安装 COBOL

有许多适用于 Windows 的免费大型机模拟器,可用于编写和学习简单的 COBOL 程序。

Hercules 就是这样的模拟器之一,它可以通过以下几个简单步骤轻松安装在 Windows 上 -

  • 下载并安装 Hercules 模拟器,可从 Hercules 的主页获取:www.hercules-390.eu

  • 在 Windows 计算机上安装该软件包后,它将创建一个类似C:/hercules/mvs/cobol的文件夹。

  • 运行命令提示符 (CMD) 并在 CMD 上到达目录 C:/hercules/mvs/cobol。

  • 有关编写和执行 JCL 和 COBOL 程序的各种命令的完整指南可以在以下位置找到:

    www.jaymoseley.com/hercules/installmvs/instmvs2.htm

Hercules 是大型机 System/370 和 ESA/390 架构以及最新 64 位 z/Architecture 的开源软件实现。Hercules 在 Linux、Windows、Solaris、FreeBSD 和 Mac OS X 下运行。

用户可以通过多种方式连接到大型机服务器,例如瘦客户端、虚拟终端、虚拟客户端系统 (VCS) 或虚拟桌面系统 (VDS)。每个有效用户都会获得一个登录 ID 来进入 Z/OS 界面(TSO/E 或 ISPF)。

编译 COBOL 程序

为了使用 JCL 以批处理模式执行 COBOL 程序,需要编译该程序,并使用所有子程序创建一个加载模块。JCL 使用加载模块而不是执行时的实际程序。加载库在执行时使用JCLLIBSTEPLIB连接并提供给 JCL 。

有许多大型机编译器实用程序可用于编译 COBOL 程序。一些公司使用Endevor等变更管理工具,它编译并存储程序的每个版本。这对于跟踪对程序所做的更改很有用。

//COMPILE   JOB ,CLASS=6,MSGCLASS=X,NOTIFY=&SYSUID             
//*            
//STEP1     EXEC IGYCRCTL,PARM=RMODE,DYNAM,SSRANGE
//SYSIN     DD DSN=MYDATA.URMI.SOURCES(MYCOBB),DISP=SHR
//SYSLIB    DD DSN=MYDATA.URMI.COPYBOOK(MYCOPY),DISP=SHR
//SYSLMOD   DD DSN=MYDATA.URMI.LOAD(MYCOBB),DISP=SHR
//SYSPRINT  DD SYSOUT=*
//*

IGYCRCTL 是一个 IBM COBOL 编译器实用程序。编译器选项使用 PARM 参数传递。在上面的例子中,RMODE指示编译器在程序中使用相对寻址模式。COBOL 程序使用 SYSIN 参数传递。Copybook是SYSLIB中程序使用的库。

执行 COBOL 程序

下面给出了一个 JCL 示例,其中使用输入文件 MYDATA.URMI.INPUT 执行程序 MYPROG,并生成两个写入假脱机的输出文件。

//COBBSTEP  JOB CLASS=6,NOTIFY=&SYSUID
//
//STEP10    EXEC PGM=MYPROG,PARM=ACCT5000
//STEPLIB   DD DSN=MYDATA.URMI.LOADLIB,DISP=SHR
//INPUT1    DD DSN=MYDATA.URMI.INPUT,DISP=SHR
//OUT1      DD SYSOUT=*
//OUT2      DD SYSOUT=*
//SYSIN     DD *
//CUST1     1000
//CUST2     1001
/*

MYPROG的加载模块位于MYDATA.URMI.LOADLIB中。值得注意的是,上述 JCL 只能用于非 DB2 COBOL 模块。

执行 COBOL-DB2 程序

为了运行 COBOL-DB2 程序,JCL 和程序中使用了专门的 IBM 实用程序;DB2 区域和所需参数作为输入传递到实用程序。

运行 COBOL-DB2 程序的步骤如下 -

  • 编译 COBOL-DB2 程序时,会创建 DBRM(数据库请求模块)和加载模块。DBRM 包含 COBOL 程序的 SQL 语句,并检查其语法是否正确。

  • DBRM 绑定到 COBOL 将在其中运行的 DB2 区域(环境)。这可以使用 JCL 中的 IKJEFT01 实用程序来完成。

  • 绑定步骤之后,COBOL-DB2 程序(再次)使用 IKJEFT01 运行,并将加载库和 DBRM 库作为 JCL 的输入。

//STEP001  EXEC PGM=IKJEFT01
//*
//STEPLIB  DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR
//*
//input files
//output files
//SYSPRINT DD SYSOUT=*
//SYSABOUT DD SYSOUT=*
//SYSDBOUT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//DISPLAY  DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(MYCOBB) PLAN(PLANNAME) PARM(parameters to cobol program) -
   LIB('MYDATA.URMI.LOADLIB')
   END
/*

在上面的示例中,MYCOBB 是使用 IKJEFT01 运行的 COBOL-DB2 程序。请注意,程序名称、DB2 子系统 ID (SSID) 和 DB2 计划名称是在 SYSTSIN DD 语句中传递的。DBRM 库在 STEPLIB 中指定。

COBOL - 程序结构

COBOL 程序结构由如下图所示的部分组成 -

程序结构

这些部门的简要介绍如下 -

  • 是程序逻辑的逻辑细分。节是段落的集合。

  • 段落是节或部门的细分。它是用户定义的或预定义的名称,后跟句点,由零个或多个句子/条目组成。

  • 句子是一个或多个陈述的组合。句子仅出现在程序部分。句子必须以句号结束。

  • 语句是执行某些处理的有意义的 COBOL 语句。

  • 字符是层次结构中最低的并且不能被分割。

您可以在以下示例中将上述术语与 COBOL 程序关联起来 -

PROCEDURE DIVISION.
A0000-FIRST-PARA SECTION.
FIRST-PARAGRAPH.
ACCEPT WS-ID            - Statement-1  -----|
MOVE '10' TO WS-ID      - Statement-2       |-- Sentence - 1
DISPLAY WS-ID           - Statement-3  -----|
.

部门

COBOL 程序由四个部分组成。

鉴定科

它是每个 COBOL 程序的第一个也是唯一一个强制划分。程序员和编译器使用这种划分来识别程序。在此部分中,PROGRAM-ID 是唯一的强制段落。PROGRAM-ID 指定程序名称,可以包含 1 到 30 个字符。

使用在线实时演示选项尝试以下示例。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
DISPLAY 'Welcome to Tutorialspoint'.
STOP RUN.

下面给出的是执行上述 COBOL 程序的JCL 。

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

当您编译并执行上述程序时,它会产生以下结果 -

Welcome to Tutorialspoint

环境科

环境划分用于指定程序的输入和输出文件。它由两部分组成 -

  • 配置部分提供有关编写和执行程序的系统的信息。它由两段组成 -

    • 源计算机- 用于编译程序的系统。

    • 对象计算机- 用于执行程序的系统。

  • 输入-输出部分提供有关程序中使用的文件的信息。它由两段组成 -

    • 文件控制- 提供程序中使用的外部数据集的信息。

    • IO 控制 - 提供程序中使用的文件的信息。

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
   SOURCE-COMPUTER. XXX-ZOS.
   OBJECT-COMPUTER. XXX-ZOS.

INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT FILEN ASSIGN TO DDNAME
   ORGANIZATION IS SEQUENTIAL.

数据部

数据划分用于定义程序中使用的变量。它由四个部分组成 -

  • 文件部分用于定义文件的记录结构。

  • 工作存储部分用于声明程序中使用的临时变量和文件结构。

  • 本地存储部分与工作存储部分类似。唯一的区别是每次程序开始执行时都会分配并初始化变量。

  • 链接部分用于描述从外部程序接收的数据名称。

COBOL程序

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT FILEN ASSIGN TO INPUT.
      ORGANIZATION IS SEQUENTIAL.
      ACCESS IS SEQUENTIAL.

DATA DIVISION.
   FILE SECTION.
   FD FILEN
   01 NAME PIC A(25).
   
   WORKING-STORAGE SECTION.
   01 WS-STUDENT PIC A(30).
   01 WS-ID PIC 9(5).

   LOCAL-STORAGE SECTION.
   01 LS-CLASS PIC 9(3).
   
   LINKAGE SECTION.
   01 LS-ID PIC 9(5).
   
PROCEDURE DIVISION.
   DISPLAY 'Executing COBOL program using JCL'.
STOP RUN.

执行上述 COBOL 程序的 JCL如下-

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//INPUT DD DSN = ABC.EFG.XYZ,DISP = SHR

当您编译并执行上述程序时,它会产生以下结果 -

Executing COBOL program using JCL

程序科

过程划分用于包含程序的逻辑。它由使用数据部门中定义的变量的可执行语句组成。在此部分中,段落和章节名称是用户定义的。

过程划分中必须至少有一条语句。结束该部分执行的最后一条语句是调用程序中使用的STOP RUN或被调用程序中使用的EXIT PROGRAM 。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NAME PIC A(30).
   01 WS-ID PIC 9(5) VALUE '12345'.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   DISPLAY 'Hello World'.
   MOVE 'TutorialsPoint' TO WS-NAME.
   DISPLAY "My name is : "WS-NAME.
   DISPLAY "My ID is : "WS-ID.
STOP RUN.

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

Hello World
My name is : TutorialsPoint
My ID is : 12345

COBOL - 基本语法

字符集

“角色”在层次结构中处于最低位置,无法进一步划分。COBOL 字符集包括 78 个字符,如下所示 -

先生。 特征及描述
1

AZ

字母(大写)

2

阿兹

字母(小写)

3

0-9

数字

4

 

空间

5

+

加号

6

-

减号或连字符

7

*

星号

8

/

正斜杠

9

$

货币符号

10

,

逗号

11

;

分号

12

小数点或句点

13

引号

14

左括号

15

右括号

16

>

比...更棒

17 号

<

少于

18

:

冒号

19

'

撇号

20

=

等号

编码表

COBOL的源程序必须以编译器可接受的格式编写。COBOL 程序是在 COBOL 编码表上编写的。编码表的每行有 80 个字符位置。

角色位置分为以下五个字段 -

职位 场地 描述
1-6 列号 保留用于行号。
7 指标 它可以有星号 (*) 表示注释,连字符 (-) 表示继续,斜杠 (/) 表示换页。
8-11 A区 所有 COBOL 划分、部分、段落和一些特殊条目必须从区域 A 开始。
12-72 B区 所有 COBOL 语句必须从区域 B 开始。
73-80 识别区 程序员可以根据需要使用它。

例子

以下示例显示了 COBOL 编码表 -

000100 IDENTIFICATION DIVISION.                                         000100
000200 PROGRAM-ID. HELLO.                                               000101
000250* THIS IS A COMMENT LINE                                          000102
000300 PROCEDURE DIVISION.                                              000103
000350 A000-FIRST-PARA.                                                 000104
000400     DISPLAY “Coding Sheet”.                                      000105
000500 STOP RUN.                                                        000106

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

Coding Sheet

字符串

字符串是通过组合各个字符而形成的。一个字符串可以是

  • 评论,
  • 字面意思,或者
  • COBOL 词。

所有字符串必须以分隔符结束。分隔符用于分隔字符串。

常用分隔符 - 空格、逗号、句号、撇号、左/右括号和引号。

评论

注释是不影响程序执行的字符串。它可以是任意字符组合。

有两种类型的评论 -

评论专线

注释行可以写在任何列中。编译器不会检查注释行的语法,而是将其视为文档。

评论输入

注释条目是那些包含在识别部门的可选段落中的条目。它们写在B区,供程序员参考。

以粗体突出显示的文本是以下示例中的注释条目 -

000100 IDENTIFICATION DIVISION.                                         000100
000150 PROGRAM-ID. HELLO.                                               000101 
000200 AUTHOR. TUTORIALSPOINT.                                          000102
000250* THIS IS A COMMENT LINE                                          000103
000300 PROCEDURE DIVISION.                                              000104
000350 A000-FIRST-PARA.                                                 000105  
000360/ First Para Begins - Documentation Purpose                       000106
000400     DISPLAY “Comment line”.                                      000107
000500 STOP RUN.                                                        000108

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

Comment Line

文字

文字是直接硬编码在程序中的常量。在下面的示例中,“Hello World”是一个文字。

PROCEDURE DIVISION.
DISPLAY 'Hello World'.

有两种类型的文字,如下所述 -

字母数字文字

字母数字文字用引号或撇号括起来。长度最多可达 160 个字符。撇号或引号只有在配对时才可以成为文字的一部分。文字的开头和结尾应该相同,可以是撇号,也可以是引号。

例子

以下示例显示了有效和无效的字母数字文字 -

Valid:
   ‘This is valid’
   "This is valid"
   ‘This isn’’t invalid’

Invalid:
   ‘This is invalid”
   ‘This isn’t valid’

数字文字

数字文字是 0 到 9 的数字、+、- 或小数点的组合。长度最多可达 18 个字符。符号不能是最右边的字符。小数点不应出现在末尾。

例子

以下示例显示了有效和无效的数字文字 -

Valid:
   100
   +10.9
   -1.9

Invalid:
   1,00
   10.
   10.9-

COBOL 字

COBOL Word 是一个字符串,可以是保留字或用户定义字。长度最多可达 30 个字符。

用户自定义

用户定义的单词用于命名文件、数据、记录、段落名称和部分。形成用户定义的单词时允许使用字母、数字和连字符。不能使用 COBOL 保留字。

保留字

保留字是 COBOL 中预定义的字。我们经常使用的不同类型的保留字如下 -

  • 关键字如 ADD、ACCEPT、MOVE 等。

  • 特殊字符单词,如 +、-、*、<、<= 等

  • 图形常量是诸如零、空格等常量值。下表列出了图形常量的所有常量值。

形象常数

先生。 图形常数和描述
1

高价值

一个或多个字符将按降序排列在最高位置。

2

低值

一个或多个字符在二进制表示中包含零。

3

零/零

一个或多个零取决于变量的大小。

4

空间

一个或多个空格。

5

引号

单引号或双引号。

6

所有字面量

用文字填充数据项。

COBOL - 数据类型

数据划分用于定义程序中使用的变量。要在 COBOL 中描述数据,必须理解以下术语 -

  • 数据名称
  • 等级数
  • 图片条款
  • 价值条款
01            TOTAL-STUDENTS            PIC9(5)            VALUE '125'.
|                    |                    |                    |
|                    |                    |                    |
|                    |                    |                    | 
Level Number     Data Name           Picture Clause       Value Clause

数据名称

数据名称必须在数据部门中定义,然后才能在过程部门中使用。它们必须有一个用户定义的名称;不能使用保留字。数据名称引用了存储实际数据的内存位置。它们可以是基本类型或团体类型。

例子

以下示例显示了有效和无效的数据名称 -

Valid:
   WS-NAME
   TOTAL-STUDENTS
   A100
   100B

Invalid:
   MOVE            (Reserved Words)
   COMPUTE         (Reserved Words)
   100             (No Alphabet)
   100+B           (+ is not allowed) 

等级数

级别编号用于指定记录中数据的级别。它们用于区分基本项目和团体项目。基本项目可以组合在一起以创建组项目。

先生。 级别编号和描述
1

01

记录描述条目

2

02 至 49

团体和基本项目

3

66

重命名子句项目

4

77

不可再分的项目

5

88

条件名称输入

  • 基本项目不能进一步划分。级别编号、数据名称、图片子句和值子句(可选)用于描述基本项。

  • 组项目由一个或多个基本项目组成。级别编号、数据名称和值子句(可选)用于描述组项目。组级别编号始终为 01。

例子

以下示例显示了组和基本项目 -

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME    PIC X(25).                               ---> 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

图片条款

图片子句用于定义以下项目 -

  • 数据类型可以是数字、字母或字母数字。数字类型仅包含数字 0 到 9。字母类型包含字母 A 到 Z 和空格。字母数字类型由数字、字母和特殊字符组成。

  • 符号可与数字数据一起使用。它可以是 + 或 –。

  • 小数点位置可与数值数据一起使用。假定位置是小数点位置,不包含在数据中。

  • 长度定义数据项使用的字节数。

图片子句中使用的符号 -

先生。 符号及说明
1

9

数字

2

A

按字母顺序

3

X

字母数字

4

V

隐式小数

5

S

符号

6

假设十进制

例子

以下示例显示了 PIC 子句的使用 -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC S9(3)V9(2).
   01 WS-NUM2 PIC PPP999.
   01 WS-NUM3 PIC S9(3)V9(2) VALUE -123.45.
   01 WS-NAME PIC A(6) VALUE 'ABCDEF'.
   01 WS-ID PIC X(5) VALUE 'A121$'.

PROCEDURE DIVISION.
   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.
STOP RUN.

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

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

价值条款

Value 子句是一个可选子句,用于初始化数据项。这些值可以是数字文字、字母数字文字或图形常量。它可以与团体项目和基本项目一起使用。

例子

以下示例显示了 VALUE 子句的使用 -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 99V9 VALUE IS 3.5.
   01 WS-NAME PIC A(6) VALUE 'ABCD'.
   01 WS-ID PIC 99 VALUE ZERO.

PROCEDURE DIVISION.
   DISPLAY "WS-NUM1 : "WS-NUM1.
   DISPLAY "WS-NAME : "WS-NAME.
   DISPLAY "WS-ID   : "WS-ID.
STOP RUN.

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

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

COBOL - 基本动词

COBOL 动词用于数据处理的过程划分。语句始终以 COBOL 动词开头。有多种具有不同类型动作的 COBOL 动词。

输入/输出动词

输入/输出动词用于从用户获取数据并显示 COBOL 程序的输出。此过程使用以下两个动词 -

接受动词

Accept 动词用于从操作系统或直接从用户获取日期、时间和日期等数据。如果程序正在接受来自用户的数据,那么它需要通过 JCL 传递。从操作系统获取数据时,包含 FROM 选项,如下例所示 -

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

显示动词

显示动词用于显示 COBOL 程序的输出。

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

COBOL计划

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STUDENT-NAME PIC X(25).
   01 WS-DATE PIC X(10).

PROCEDURE DIVISION.
   ACCEPT WS-STUDENT-NAME.
   ACCEPT WS-DATE FROM DATE.
   DISPLAY "Name :  " WS-STUDENT-NAME.
   DISPLAY "Date : " WS-DATE.

STOP RUN.

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

Name : TutorialsPoint
Date : 2014-08-30

初始化动词

初始化动词用于初始化组项目或基本项目。无法初始化带有 RENAME 子句的数据名称。数字数据项被零替换。字母数字或字母数据项被空格替换。如果我们包含 REPLACING 项,则数据项可以初始化为给定的替换值,如下例所示 -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NAME PIC A(30) VALUE 'ABCDEF'.
   01 WS-ID PIC 9(5).
   01 WS-ADDRESS. 
   05 WS-HOUSE-NUMBER PIC 9(3).
   05 WS-COUNTRY PIC X(15).
   05 WS-PINCODE PIC 9(6) VALUE 123456.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   INITIALIZE WS-NAME, WS-ADDRESS.
   INITIALIZE WS-ID REPLACING NUMERIC DATA BY 12345.
   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.

STOP RUN.

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

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

移动动词

Move动词用于将数据从源数据复制到目标数据。它可用于基本数据项和组数据项。对于组数据项,使用 MOVE CORRESPONDING/CORR。在尝试选项中,MOVE CORR 不起作用;但在大型机服务器上,它可以工作。

要从字符串中移动数据,请使用 MOVE(x:l),其中 x 是起始位置,l 是长度。如果目标数据项 PIC 子句小于源数据项 PIC 子句,则数据将被截断。如果目标数据项 PIC 子句多于源数据项 PIC 子句,则将在额外字节中添加 ZEROS 或 SPACES。下面的例子就很清楚了。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9).
   01 WS-NUM2 PIC 9(9).
   01 WS-NUM3 PIC 9(5).
   01 WS-NUM4 PIC 9(6).
   01 WS-ADDRESS. 
   05 WS-HOUSE-NUMBER PIC 9(3).
   05 WS-COUNTRY PIC X(5).
   05 WS-PINCODE PIC 9(6).
   01 WS-ADDRESS1. 
   05 WS-HOUSE-NUMBER1 PIC 9(3).
   05 WS-COUNTRY1 PIC X(5).
   05 WS-PINCODE1 PIC 9(6).

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 123456789 TO WS-NUM1.
   MOVE WS-NUM1 TO WS-NUM2 WS-NUM3.
   MOVE WS-NUM1(3:6) TO WS-NUM4.
   MOVE 123 TO WS-HOUSE-NUMBER.
   MOVE 'INDIA' TO WS-COUNTRY.
   MOVE 112233 TO 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

STOP RUN.

JCL来执行上面的COBOL程序。

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

当您编译并执行上述程序时,它会产生以下结果 -

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

合法的举动

下表提供了有关合法举措的信息 -

按字母顺序 字母数字 数字
按字母顺序 可能的 可能的 不可能
字母数字 可能的 可能的 可能的
数字 不可能 可能的 可能的

添加动词

Add 动词用于将两个或多个数字相加并将结果存储在目标操作数中。

句法

下面给出的是添加两个或多个数字的语法 -

ADD A B TO C D

ADD A B C TO D GIVING E

ADD CORR WS-GROUP1 TO WS-GROUP2

在语法 1 中,A、B、C 相加,结果存储在 C 中(C=A+B+C)。A、B、D 相加,结果存储在 D 中 (D = A + B + D)。

在语法2中,A、B、C、D相加,结果存储在E中(E=A+B+C+D)。

在语法 3 中,添加 WS-GROUP1 和 WS-GROUP2 内的子组项,并将结果存储在 WS-GROUP2 中。

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9) VALUE 10 .
   01 WS-NUM2 PIC 9(9) VALUE 10.
   01 WS-NUM3 PIC 9(9) VALUE 10.
   01 WS-NUM4 PIC 9(9) VALUE 10.
   01 WS-NUMA PIC 9(9) VALUE 10.
   01 WS-NUMB PIC 9(9) VALUE 10.
   01 WS-NUMC PIC 9(9) VALUE 10.
   01 WS-NUMD PIC 9(9) VALUE 10.
   01 WS-NUME PIC 9(9) VALUE 10.

PROCEDURE DIVISION.
   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

STOP RUN.

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

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 A B FROM C D

SUBTRACT A B C FROM D GIVING E

SUBTRACT CORR WS-GROUP1 TO WS-GROUP2

在语法 1 中,A 和 B 与 C 相加或相减。结果存储在 C 中 (C = C-(A+B))。A 和 B 与 D 相加或相减。结果存储在 D 中 (D = D-(A+B))。

在语法 2 中,A、B、C 与 D 相加或相减。结果存储在 E 中 (E = D-(A+B+C))

在语法 3 中,将 WS-GROUP1 和 WS-GROUP2 内的子组项相减,并将结果存储在 WS-GROUP2 中。

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9) VALUE 10 .
   01 WS-NUM2 PIC 9(9) VALUE 10.
   01 WS-NUM3 PIC 9(9) VALUE 100.
   01 WS-NUM4 PIC 9(9) VALUE 100.
   01 WS-NUMA PIC 9(9) VALUE 10.
   01 WS-NUMB PIC 9(9) VALUE 10.
   01 WS-NUMC PIC 9(9) VALUE 10.
   01 WS-NUMD PIC 9(9) VALUE 100.
   01 WS-NUME PIC 9(9) VALUE 10.

PROCEDURE DIVISION.
   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

STOP RUN.

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

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 A BY B C

MULTIPLY A BY B GIVING E

在语法 1 中,A 和 B 相乘,结果存储在 B 中 (B=A*B)。A 和 C 相乘,结果存储在 C 中 (C = A * C)。

在语法 2 中,A 和 B 相乘,结果存储在 E 中 (E=A*B)。

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9) VALUE 10 .
   01 WS-NUM2 PIC 9(9) VALUE 10.
   01 WS-NUM3 PIC 9(9) VALUE 10.
   01 WS-NUMA PIC 9(9) VALUE 10.
   01 WS-NUMB PIC 9(9) VALUE 10.
   01 WS-NUMC PIC 9(9) VALUE 10.

PROCEDURE DIVISION.
   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
   
STOP RUN.

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

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

划分动词

除法动词用于除法运算。

句法

下面给出的是除法运算的语法 -

DIVIDE A INTO B

DIVIDE A BY B GIVING C REMAINDER R

在语法 1 中,B 除以 A,结果存储在 B 中 (B=B/A)。

在语法 2 中,A 除以 B,结果存储在 C (C=A/B) 中,余数存储在 R 中。

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9) VALUE 5.
   01 WS-NUM2 PIC 9(9) VALUE 250.
   01 WS-NUMA PIC 9(9) VALUE 100.
   01 WS-NUMB PIC 9(9) VALUE 15.
   01 WS-NUMC PIC 9(9).
   01 WS-REM PIC 9(9). 

PROCEDURE DIVISION.
   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
   
STOP RUN.

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

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

计算语句

计算语句用于在 COBOL 中编写算术表达式。这是加法、减法、乘法和除法的替代。

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9) VALUE 10 .
   01 WS-NUM2 PIC 9(9) VALUE 10.
   01 WS-NUM3 PIC 9(9) VALUE 10.
   01 WS-NUMA PIC 9(9) VALUE 50.
   01 WS-NUMB PIC 9(9) VALUE 10.
   01 WS-NUMC PIC 9(9).

PROCEDURE DIVISION.
   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

STOP RUN.

JCL来执行上面的COBOL程序。

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

当您编译并执行上述程序时,它会产生以下结果 -

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

COBOL - 数据布局

COBOL 布局是对每个字段的使用及其中存在的值的描述。以下是 COBOL 中使用的数据描述条目 -

  • 重新定义条款
  • 重命名条款
  • 使用条款
  • 字帖

重新定义条款

Redefines子句用于定义具有不同数据描述的存储。如果一个或多个数据项不同时使用,则相同的存储可用于另一数据项。因此,相同的存储可以被不同的数据项引用。

句法

以下是 Redefines 子句的语法 -

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

以下是所使用参数的详细信息 -

  • WS-OLD 是重新定义的项目
  • WS-NEW1和WS-NEW2正在重新定义项目

重定义项和重定义项的级别号必须相同,且不能是66或88级号。不要将 VALUE 子句与重新定义项一起使用。在文件部分中,不要使用级别号为 01 的 redefines 子句。重新定义定义必须是您要重新定义的下一个数据描述。重新定义的项目将始终具有与重新定义的项目相同的值。

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-DESCRIPTION.
   05 WS-DATE1 VALUE '20140831'.
   10 WS-YEAR PIC X(4).
   10 WS-MONTH PIC X(2).
   10 WS-DATE PIC X(2).
   05 WS-DATE2 REDEFINES WS-DATE1 PIC 9(8).

PROCEDURE DIVISION.
   DISPLAY "WS-DATE1 : "WS-DATE1.
   DISPLAY "WS-DATE2 : "WS-DATE2.

STOP RUN.

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

WS-DATE1 : 20140831
WS-DATE2 : 20140831

重命名条款

Renames 子句用于为现有数据项指定不同的名称。它用于重新组合数据名称并为其赋予新名称。新的数据名称可以跨组或基本项目重命名。级别编号 66 保留用于重命名。

句法

以下是重命名子句的语法 -

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.

重命名只能在同一级别进行。在上面的示例中,WS-A、WS-B 和 WS-C 处于同一级别。重命名定义必须是您要重命名的下一个数据描述。请勿使用 01、77 或 66 级别编号的重命名。用于重命名的数据名称必须按顺序出现。无法重命名带有发生子句的数据项。

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-DESCRIPTION.
   05 WS-NUM.
   10 WS-NUM1 PIC 9(2) VALUE 20.
   10 WS-NUM2 PIC 9(2) VALUE 56.
   05 WS-CHAR.
   10 WS-CHAR1 PIC X(2) VALUE 'AA'.
   10 WS-CHAR2 PIC X(2) VALUE 'BB'.
   66 WS-RENAME RENAMES WS-NUM2 THRU WS-CHAR2.

PROCEDURE DIVISION.
   DISPLAY "WS-RENAME : " WS-RENAME.
   
STOP RUN.

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

WS-RENAME : 56AABB

使用条款

使用子句指定存储格式数据的操作系统。它不能与级别号 66 或 88 一起使用。如果在组上指定了用法子句,则所有基本项将具有相同的用法子句。使用子句可用的不同选项如下 -

展示

数据项以 ASCII 格式存储,每个字符占用 1 个字节。这是默认用法。

以下示例计算所需的字节数 -

01 WS-NUM PIC S9(5)V9(3) USAGE IS DISPLAY.
It requires 8 bytes as sign and decimal doesn't require any byte.

01 WS-NUM PIC 9(5) USAGE IS DISPLAY.
It requires 5 bytes as sign.

计算/COMP

数据项以二进制格式存储。这里,数据项必须是整数。

以下示例计算所需的字节数 -

01 WS-NUM PIC S9(n) USAGE IS COMP.

If 'n' = 1 to 4, it takes 2 bytes.
If 'n' = 5 to 9, it takes 4 bytes.
If 'n' = 10 to 18, it takes 8 bytes.

康普-1

数据项与 Real 或 Float 类似,表示为单精度浮点数。在内部,数据以十六进制格式存储。COMP-1 不接受 PIC 条款。这里1个字等于4个字节。

康普-2

数据项与Long或Double类似,表示为双精度浮点数。在内部,数据以十六进制格式存储。COMP-2 未指定 PIC 子句。这里2个字等于8个字节。

康普-3

数据项以压缩十进制格式存储。每个数字占据半个字节(1 个半字节),符号存储在最右边的半字节中。

以下示例计算所需的字节数 -

01 WS-NUM PIC 9(n) USAGE IS COMP.
Number of bytes = n/2 (If n is even)
Number of bytes = n/2 + 1(If n is odd, consider only integer part)

01 WS-NUM PIC 9(4) USAGE IS COMP-3 VALUE 21.
It requires 2 bytes of storage as each digit occupies half a byte.

01 WS-NUM PIC 9(5) USAGE IS COMP-3 VALUE 21.
It requires 3 bytes of storage as each digit occupies half a byte.

字帖

COBOL copybook 是定义数据结构的代码选择。如果某个特定的数据结构在许多程序中使用,那么我们可以使用copybook,而不是再次编写相同的数据结构。我们使用 COPY 语句在程序中包含抄写本。COPY 语句用于WorkingStorage 部分。

以下示例在 COBOL 程序中包含一本抄写本 -

DATA DIVISION.
WORKING-STORAGE SECTION.
COPY ABC.

这里ABC是字帖名称。ABC copybook 中的以下数据项可以在程序内使用。

01 WS-DESCRIPTION.
   05 WS-NUM.
      10 WS-NUM1 PIC 9(2) VALUE 20.
      10 WS-NUM2 PIC 9(2) VALUE 56.
   05 WS-CHAR.
      10 WS-CHAR1 PIC X(2) VALUE 'AA'.
      10 WS-CHAR2 PIC X(2) VALUE 'BB'.

COBOL - 条件语句

条件语句用于根据程序员指定的某些条件来更改执行流程。条件语句将始终评估为 true 或 false。条件用于 IF、Evaluate 和 Perform 语句。不同类型的条件如下 -

  • IF 条件语句
  • 关系条件
  • 签署条件
  • 班级条件
  • 条件名称 条件
  • 否定条件
  • 组合条件

IF 条件语句

IF 语句检查条件。如果条件为真,则执行 IF 块;如果条件为假,则执行 ELSE 块。

END-IF用于结束 IF 块。要结束 IF 块,可以使用句点代替 END-IF。但对于多个 IF 块,最好使用 END-IF。

Nested-IF - IF 块出现在另一个 IF 块内。嵌套 IF 语句的深度没有限制。

句法

以下是 IF 条件语句的语法 -

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

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9).
   01 WS-NUM2 PIC 9(9).
   01 WS-NUM3 PIC 9(5).
   01 WS-NUM4 PIC 9(6).

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 25 TO WS-NUM1 WS-NUM3.
   MOVE 15 TO WS-NUM2 WS-NUM4.
   
   IF WS-NUM1 > WS-NUM2 THEN
      DISPLAY 'IN LOOP 1 - IF BLOCK'
      
      IF WS-NUM3 = WS-NUM4 THEN
         DISPLAY 'IN LOOP 2 - IF BLOCK'
      ELSE
         DISPLAY 'IN LOOP 2 - ELSE BLOCK'
      END-IF
      
   ELSE
      DISPLAY 'IN LOOP 1 - ELSE BLOCK'
   END-IF.
   
STOP RUN.

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

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

关系条件

关系条件比较两个操作数,其中任何一个操作数都可以是标识符、文字或算术表达式。无论大小和用法子句如何,都会进行数字字段的代数比较。

对于非数字操作数

如果比较两个大小相等的非数字操作数,则从左侧开始将字符与相应位置进行比较,直到到达末尾。包含较多字符的操作数被声明为较大。

如果比较两个大小不相等的非数字操作数,则较短的数据项会在末尾附加空格,直到操作数的大小相等,然后根据上一点提到的规则进行比较。

句法

下面给出的是关系条件语句的语法 -

[Data Name/Arithmetic Operation]

   [IS] [NOT] 

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

[Data Name/Arithmetic Operation] 

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9).
   01 WS-NUM2 PIC 9(9).

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 25 TO WS-NUM1.
   MOVE 15 TO WS-NUM2.
   
   IF WS-NUM1 IS GREATER THAN OR EQUAL TO WS-NUM2 THEN
      DISPLAY 'WS-NUM1 IS GREATER THAN WS-NUM2'
   ELSE
      DISPLAY 'WS-NUM1 IS LESS THAN WS-NUM2'
   END-IF.
   
STOP RUN.

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

WS-NUM1 IS GREATER THAN WS-NUM2

签署条件

符号条件用于检查数字操作数的符号。它确定给定的数值是否大于、小于或等于 0。

句法

以下是 Sign 条件语句的语法 -

[Data Name/Arithmetic Operation] 

   [IS] [NOT] 

[Positive, Negative or Zero]

[Data Name/Arithmetic Operation]

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC S9(9) VALUE -1234.
   01 WS-NUM2 PIC S9(9) VALUE 123456.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   IF WS-NUM1 IS POSITIVE THEN
      DISPLAY 'WS-NUM1 IS POSITIVE'.
      
   IF WS-NUM1 IS NEGATIVE THEN
      DISPLAY 'WS-NUM1 IS NEGATIVE'.
      
   IF WS-NUM1 IS ZERO THEN
      DISPLAY 'WS-NUM1 IS ZERO'.
      
   IF WS-NUM2 IS POSITIVE THEN
      DISPLAY 'WS-NUM2 IS POSITIVE'.

STOP RUN.

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

WS-NUM1 IS NEGATIVE
WS-NUM2 IS POSITIVE

班级条件

类条件用于检查操作数是否仅包含字母或数字数据。空格按 ALPHABETIC、ALPHABETIC-LOWER 和 ALPHABETIC-UPPER 考虑。

句法

以下是类条件语句的语法 -

[Data Name/Arithmetic Operation>]

   [IS] [NOT] 

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

[Data Name/Arithmetic Operation]

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC X(9) VALUE 'ABCD '.
   01 WS-NUM2 PIC 9(9) VALUE 123456789.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   
   IF WS-NUM1 IS ALPHABETIC THEN
      DISPLAY 'WS-NUM1 IS ALPHABETIC'.
      
   IF WS-NUM1 IS NUMERIC THEN
      DISPLAY 'WS-NUM1 IS NUMERIC'.
      
   IF WS-NUM2 IS NUMERIC THEN
      DISPLAY 'WS-NUM2 IS NUMERIC'.
   
STOP RUN.

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

WS-NUM1 IS ALPHABETIC
WS-NUM2 IS NUMERIC

条件名称 条件

条件名称是用户定义的名称。它包含一组由用户指定的值。它的Behave类似于布尔变量。它们是用级别号 88 定义的。它不会有 PIC 子句。

句法

以下是用户定义的条件语句的语法 -

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

例子

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM PIC 9(3).
   88 PASS VALUES ARE 041 THRU 100.
   88 FAIL VALUES ARE 000 THRU 40.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 65 TO WS-NUM.
   
   IF PASS 
      DISPLAY 'Passed with ' WS-NUM ' marks'.
      
   IF FAIL 
      DISPLAY 'FAILED with ' WS-NUM 'marks'.
      
STOP RUN.

JCL执行上述 COBOL 程序 -

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

当您编译并执行上述程序时,它会产生以下结果 -

Passed with 065 marks

否定条件

否定条件是通过使用 NOT 关键字给出的。如果一个条件为 true 并且我们在它前面给出了 NOT,那么它的最终值将为 false。

句法

以下是否定条件语句的语法