目录

COBOL - 快速指南

COBOL - Overview

COBOL简介

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

COBOL的演变

在20世纪50年代,当企业在世界西部地区发展时,需要自动化各种流程以便于操作,这就形成了一种用于业务数据处理的高级编程语言。

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

  • 下一个版本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 - Environment Setup

在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

除了最新的64位z/Architecture之外,Hercules还是大型机System/370和ESA/390架构的开源软件实现。 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指示编译器在程序中使用相对寻址模式。 使用SYSIN参数传递COBOL程序。 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实用程序来完成。

  • 在绑定步骤之后,使用IKJEFT01(再次)运行COBOL-DB2程序,其中加载库和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子系统标识(SSID)和DB2计划名称在SYSTSIN DD语句中传递。 DBRM库在STEPLIB中指定。

COBOL - Program Structure

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

计划结构

下面简要介绍这些部门 -

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

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

  • Sentences是一个或多个陈述的组合。 句子只出现在程序部门。 句子必须以句号结尾。

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

  • Characters是层次结构中最低的,不能被整除。

您可以在以下示例中将上述术语与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  -----|
.

分部(Divisions)

COBOL计划由四个部门组成。

鉴定科

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

在线使用Live Demo选项尝试以下示例。

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

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

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

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

Welcome to IoWiki

环境科

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

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

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

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

  • Input-Output section提供有关要在程序中使用的文件的信息。 它由两段组成 -

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

    • 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.

数据部门

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

  • File section用于定义文件的记录结构。

  • Working-Storage section用于声明程序中使用的临时变量和文件结构。

  • Local-Storage section类似于Working-Storage部分。 唯一的区别是每次程序开始执行时都会分配和初始化变量。

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

COBOL Program

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 'IoWiki' 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 : IoWiki
My ID is : 12345

COBOL - Basic Syntax

字符集

“字符”在层次结构中最低,不能进一步划分。 COBOL字符集包含78个字符,如下所示 -

Sr.No. 字符和描述
1

AZ

字母(大写字母)

2

az

字母(小写字母)

3

0-9

数字

4

 

Space

5

+

加号

6

-

减号或连字符

7

*

星号

8

/

Forward Slash

9

$

Currency Sign

10

,

逗号

11

;

分号

12

.

小数点或周期

13

"

引号

14

(

左括号

15

)

右括号

16

>

Greater than

17

<

Less than

18

:

Colon

19

'

Apostrophe

20

=

等号

编码表

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

字符位置分为以下五个字段 -

位置 领域 描述
1-6Column NumbersReserved for line numbers.
7Indicator 它可以有星号(*)表示注释,连字符( - )表示延续,斜杠(/)表示换页。
8-11 A区 所有COBOL部门,部分,段落和一些特殊条目必须从A区开始。
12-72 B区 所有COBOL语句必须从区域B开始。
73-80 识别区域 它可以根据程序员的需要使用。

例子 (Example)

以下示例显示了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

字符串

通过组合各个字符来形成字符串。 字符串可以是a

  • Comment,
  • Literal, or
  • COBOL word.

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

经常使用的分隔符 - 空格,逗号,句点,撇号,左/右括号和引号。

Comment

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

评论有两种类型 -

评论行

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

评论条目

评论条目是标识部分的可选段落中包含的条目。 它们写在B区,程序员用它作为参考。

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

000100 IDENTIFICATION DIVISION.                                         000100
000150 PROGRAM-ID. HELLO.                                               000101 
000200 AUTHOR. <b class="notranslate">IOWIKI</b>.                                          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

Literal

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

PROCEDURE DIVISION.
DISPLAY 'Hello World'.

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

字母数字文字

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

Example

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

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

数字文字

数字文字是0到9,+, - 或小数点的数字组合。 长度最多为18个字符。 标志不能是最右边的角色。 小数点不应出现在最后。

Example

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

Valid:
   100
   +10.9
   -1.9
Invalid:
   1,00
   10.
   10.9-

COBOL Word

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

User-Defined

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

保留字

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

  • 像ADD,ACCEPT,MOVE等Keywords

  • Special characters词,如+, - ,*,“,”=等

  • 图形Figurative constants是常数值,如ZERO,SPACES等。图形常量的所有常数值都在下表中提到。

比喻常数

Sr.No. 比喻常数和描述
1

HIGH-VALUES

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

2

LOW-VALUES

一个或多个字符在二进制表示中具有零。

3

ZERO/ZEROES

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

4

SPACES

一个或多个空格。

5

QUOTES

单引号或双引号。

6

ALL literal

使用Literal填充数据项。

COBOL - Data Types

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

  • 数据名称
  • Level Number
  • Picture Clause
  • Value Clause
01            TOTAL-STUDENTS            PIC9(5)            VALUE '125'.
|                    |                    |                    |
|                    |                    |                    |
|                    |                    |                    | 
Level Number     Data Name           Picture Clause       Value Clause

数据名称

在程序部门中使用数据名称之前,必须在数据部门中定义数据名称。 它们必须具有用户定义的名称; 保留字不能使用。 数据名称提供存储实际数据的存储器位置。 它们可以是基本类型或组类型。

例子 (Example)

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

Valid:
   WS-NAME
   TOTAL-STUDENTS
   A100
   100B
Invalid:
   MOVE            (Reserved Words)
   COMPUTE         (Reserved Words)
   100             (No Alphabet)
   100+B           (+ is not allowed) 

级别编号

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

Sr.No. 级别编号和描述
1

01

记录描述条目

2

02 to 49

小组和基本项目

3

66

重命名子句项目

4

77

不能细分的项目

5

88

条件名称输入

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

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

例子 (Example)

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

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

图片条款

Picture子句用于定义以下项目 -

  • Data type可以是数字,字母或字母数字。 数字类型仅由数字0到9组成。字母类型由字母A到Z和空格组成。 字母数字类型由数字,字母和特殊字符组成。

  • Sign可以与数字数据一起使用。 它可以是+或 - 。

  • Decimal point position可与数字数据一起使用。 假设位置是小数点的位置,不包括在数据中。

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

Picture子句中使用的符号 -

Sr.No. 符号和描述
1

9

数字

2

A

拼音

3

X

字母数字

4

V

隐含的十进制

5

S

标志

6

P

假设十进制

例子 (Example)

以下示例显示了使用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子句是一个可选子句,用于初始化数据项。 值可以是数字文字,字母数字文字或图形常量。 它可以与组和基本项一起使用。

例子 (Example)

以下示例显示了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 - Basic Verbs

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 PROGRAM

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 *
IoWiki
/*

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

Name : IoWiki
Date : 2014-08-30

初始化动词

Initialize动词用于初始化组项或基本项。 无法初始化具有RENAME子句的数据名称。 数字数据项由ZEROES替换。 字母数字或字母数据项由SPACES替换。 如果我们包含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 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

法律动议

下表提供了有关法律行动的信息 -

拼音 字母数字 数字
拼音 PossiblePossible 不可能
字母数字 PossiblePossiblePossible
数字 不可能 PossiblePossible

添加动词

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

语法 (Syntax)

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

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中。

Example

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

减去动词

减法动词用于减法运算。

语法 (Syntax)

下面给出了Subtract操作的语法 -

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中。

Example

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

乘以动词

乘法动词用于乘法运算。

语法 (Syntax)

下面给出了两个或多个数字相乘的语法 -

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)中。

Example

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

划分动词

除法动词用于除法运算。

语法 (Syntax)

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

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中。

Example

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

Compute 语句

Compute语句用于在COBOL中编写算术表达式。 这是Add,Subtract,Multiply和Divide的替代品。

Example

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 - Data Layout

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

  • 重新定义条款
  • Renames Clause
  • 用法条款
  • Copybooks

重新定义条款

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

语法 (Syntax)

以下是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是Redefined Item
  • WS-NEW1和WS-NEW2是重新定义项目

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

Example

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保留用于重命名。

Syntax

以下是Renames子句的语法 -

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级别号码一起使用。 用于重命名的数据名称必须按顺序排列。 带有occurrence子句的数据项无法重命名。

Example

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

用法条款

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

Display

数据项以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.

COMPUTATIONAL/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.

COMP-1

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

COMP-2

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

COMP-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.

抄写本(Copybooks)

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

以下示例包含COBOL程序中的副本 -

DATA DIVISION.
WORKING-STORAGE SECTION.
COPY ABC.

这里ABC是副本名称。 ABC副本中的以下数据项可以在程序中使用。

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 - Conditional Statements

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

  • IF条件声明
  • 关系条件
  • Sign Condition
  • Class Condition
  • Condition-Name Condition
  • 否定条件
  • 综合条件

IF Condition 语句

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

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

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

语法 (Syntax)

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

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

Example

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

关系条件

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

For non-numeric operands

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

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

语法 (Syntax)

以下是关系条件语句的语法 -

[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

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

签署条件

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

语法 (Syntax)

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

[Data Name/Arithmetic Operation] 
   [IS] [NOT] 
[Positive, Negative or Zero]
[Data Name/Arithmetic Operation]

Example

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

class条件

类条件用于检查操作数是否仅包含字母或数字数据。 空间被认为是ALPHABETIC,ALPHABETIC-LOWER和ALPHABETIC-UPPER。

语法 (Syntax)

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

[Data Name/Arithmetic Operation>]
   [IS] [NOT] 
[NUMERIC, ALPHABETIC, ALPHABETIC-LOWER, ALPHABETIC-UPPER]
[Data Name/Arithmetic Operation]

Example

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-NUM1 IS NUMERIC

Condition-name Condition

条件名称是用户定义的名称。 它包含用户指定的一组值。 它的行为类似于布尔变量。 它们的级别为88.它没有PIC条款。

语法 (Syntax)

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

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

Example

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关键字给出否定条件。 如果条件为真且我们在它前面给出了NOT,那么它的最终值将为false。

语法 (Syntax)

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

IF NOT [CONDITION] 
   COBOL Statements
END-IF.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(2) VALUE 20.
   01 WS-NUM2 PIC 9(9) VALUE 25.
PROCEDURE DIVISION.
   A000-FIRST-PARA.
   IF NOT WS-NUM1 IS LESS THAN WS-NUM2 THEN
      DISPLAY 'IF-BLOCK'
   ELSE
      DISPLAY 'ELSE-BLOCK'
   END-IF.
STOP RUN.

JCL执行上述COBOL程序 -

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

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

ELSE-BLOCK

综合条件

组合条件包含使用逻辑运算符AND或OR连接的两个或多个条件。

语法 (Syntax)

以下是组合条件语句的语法 -

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

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(2) VALUE 20.
   01 WS-NUM2 PIC 9(2) VALUE 25.
   01 WS-NUM3 PIC 9(2) VALUE 20.
PROCEDURE DIVISION.
   A000-FIRST-PARA.
   IF WS-NUM1 IS LESS THAN WS-NUM2 AND WS-NUM1=WS-NUM3 THEN
      DISPLAY 'Both condition OK'
   ELSE
      DISPLAY 'Error'
   END-IF.
STOP RUN.

JCL执行上述COBOL程序 -

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

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

Both condition OK

评估动词

评估动词是IF-ELSE系列语句的替代。 它可用于评估多个条件。 它类似于C程序中的SWITCH语句。

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-A PIC 9 VALUE 0.
PROCEDURE DIVISION.
   MOVE 3 TO WS-A.
   EVALUATE TRUE
      WHEN WS-A > 2
         DISPLAY 'WS-A GREATER THAN 2'
      WHEN WS-A < 0
         DISPLAY 'WS-A LESS THAN 0'
      WHEN OTHER
         DISPLAY 'INVALID VALUE OF WS-A'
   END-EVALUATE.
STOP RUN.

JCL执行上述COBOL程序 -

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

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

WS-A GREATER THAN 2

COBOL - Loop Statements

有些任务需要一遍又一遍地完成,比如读取文件的每个记录直到结束。 COBOL中使用的循环语句是 -

  • 通过执行
  • 执行直到
  • 执行时间
  • 执行变化

通过执行

Perform Thru用于通过给出序列中的第一个和最后一个段落名称来执行一系列段落。 执行最后一段后,将返回控件。

In-line Perform

PERFORM中的语句将被执行,直到达到END-PERFORM。

语法 (Syntax)

以下是在线执行的语法 -

PERFORM 
   DISPLAY 'HELLO WORLD'
END-PERFORM.

Out-of-line Perform

这里,语句在一个段落中执行,然后控件转移到其他段落或部分。

语法 (Syntax)

以下是外线表演的语法 -

PERFORM PARAGRAPH1 THRU PARAGRAPH2

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
   A-PARA.
   PERFORM DISPLAY 'IN A-PARA'
   END-PERFORM.
   PERFORM C-PARA THRU E-PARA.
   B-PARA.
   DISPLAY 'IN B-PARA'.
   STOP RUN.
   C-PARA.
   DISPLAY 'IN C-PARA'.
   D-PARA.
   DISPLAY 'IN D-PARA'.
   E-PARA.
   DISPLAY 'IN E-PARA'.

JCL执行上面的COBOL程序。

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

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

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

执行直到

在'perform until'中,执行段落直到给定条件变为真。 'with test before'是默认条件,它表示在段落中的语句执行之前检查条件。

语法 (Syntax)

以下是执行的语法,直到 -

PERFORM A-PARA UNTIL COUNT=5
PERFORM A-PARA WITH TEST BEFORE UNTIL COUNT=5
PERFORM A-PARA WITH TEST AFTER UNTIL COUNT=5

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-CNT PIC 9(1) VALUE 0. 
PROCEDURE DIVISION.
   A-PARA.
   PERFORM B-PARA WITH TEST AFTER UNTIL WS-CNT>3.
   STOP RUN.
   B-PARA.
   DISPLAY 'WS-CNT : 'WS-CNT.
   ADD 1 TO WS-CNT.

JCL执行上述COBOL程序 -

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

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

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

执行时间

在'执行时间'中,段落将被执行指定的次数。

Syntax

以下是执行时间的语法 -

PERFORM A-PARA 5 TIMES.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
   A-PARA.
   PERFORM B-PARA 3 TIMES.
   STOP RUN.
   B-PARA.
   DISPLAY 'IN B-PARA'.

JCL执行上述COBOL程序 -

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

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

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

执行变化

在执行变化时,将执行段落,直到到达短语中的条件变为真。

语法 (Syntax)

以下是执行变化的语法 -

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

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-A PIC 9 VALUE 0.
PROCEDURE DIVISION.
   A-PARA.
   PERFORM B-PARA VARYING WS-A FROM 1 BY 1 UNTIL WS-A=5
   STOP RUN.
   B-PARA.
   DISPLAY 'IN B-PARA ' WS-A.

JCL执行上述COBOL程序 -

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

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

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

GO TO 语句

GO TO语句用于更改程序中的执行流程。 在GO TO语句中,转移仅在前进方向进行。 它用于退出段落。 使用的不同类型的GO TO语句如下 -

无条件转到

GO TO para-name.

有条件的去TO

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

如果'x'等于1,则控制将转移到第一段; 如果'x'等于2,则控件将转移到第二段,依此类推。

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-A PIC 9 VALUE 2.
PROCEDURE DIVISION.
   A-PARA.
   DISPLAY 'IN A-PARA'
   GO TO B-PARA.
   B-PARA.
   DISPLAY 'IN B-PARA '.
   GO TO C-PARA D-PARA DEPENDING ON WS-A.
   C-PARA.
   DISPLAY 'IN C-PARA '.
   D-PARA.
   DISPLAY 'IN D-PARA '.
   STOP RUN.

JCL执行上面的COBOL程序:

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

编译并执行上述程序时,会产生以下结果:

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

COBOL - String Handling

COBOL中的字符串处理语句用于对字符串执行多个功能操作。 以下是字符串处理语句 -

  • Inspect
  • String
  • Unstring

Inspect

Inspect verb用于计算或替换字符串中的字符。 可以对字母数字,数字或字母值执行字符串操作。 检查操作从左到右执行。 用于字符串操作的选项如下 -

Tallying

Tallying选项用于计算字符串字符。

Syntax

以下是Tallying选项的语法 -

INSPECT input-string
TALLYING output-count FOR ALL CHARACTERS

使用的参数是 -

  • input-string - 要计算其字符的字符串。
  • output-count - 保存字符数的数据项。

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-CNT1 PIC 9(2) VALUE 0.
   01 WS-CNT2 PIC 9(2) VALUE 0.
   01 WS-STRING PIC X(15) VALUE 'ABCDACDADEAAAFF'.
PROCEDURE DIVISION.
   INSPECT WS-STRING TALLYING WS-CNT1 FOR ALL CHARACTERS.
   DISPLAY "WS-CNT1 : "WS-CNT1.
   INSPECT WS-STRING TALLYING WS-CNT2 FOR ALL 'A'.
   DISPLAY "WS-CNT2 : "WS-CNT2
STOP RUN.

JCL执行上面的COBOL程序。

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

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

WS-CNT1 : 15
WS-CNT2 : 06

更换(Replacing)

替换选项用于替换字符串字符。

Syntax

以下是更换选项的语法 -

INSPECT input-string REPLACING ALL char1 BY char2.

使用的参数是 -

  • input-string - 要将字符从char1替换为char2的字符串。

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STRING PIC X(15) VALUE 'ABCDACDADEAAAFF'.
PROCEDURE DIVISION.
   DISPLAY "OLD STRING : "WS-STRING.
   INSPECT WS-STRING REPLACING ALL 'A' BY 'X'.
   DISPLAY "NEW STRING : "WS-STRING.
STOP RUN.

JCL执行上面的COBOL程序。

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

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

OLD STRING : ABCDACDADEAAAFF
NEW STRING : XBCDXCDXDEXXXFF

String

字符串动词用于连接字符串。 使用STRING语句,可以组合两个或多个字符串以形成更长的字符串。 'Delimited By'条款是强制性的。

Syntax

以下是String动词的语法 -

STRING ws-string1 DELIMITED BY SPACE
   ws-string2 DELIMITED BY SIZE
   INTO ws-destination-string
   WITH POINTER ws-count
   ON OVERFLOW DISPLAY message1
   NOT ON OVERFLOW DISPLAY message2
END-STRING.

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

  • ws-string1和ws-string2:要连接的输入字符串
  • ws-string:输出字符串
  • ws-count:用于计算新连接字符串的长度
  • Delimited指定字符串的结尾
  • 指针和溢出是可选的

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STRING PIC A(30).
   01 WS-STR1 PIC A(15) VALUE 'IoWiki'.
   01 WS-STR2 PIC A(7) VALUE 'Welcome'.
   01 WS-STR3 PIC A(7) VALUE 'To AND'.
   01 WS-COUNT PIC 99 VALUE 1.
PROCEDURE DIVISION.
   STRING WS-STR2 DELIMITED BY SIZE
      WS-STR3 DELIMITED BY SPACE
      WS-STR1 DELIMITED BY SIZE
      INTO WS-STRING 
      WITH POINTER WS-COUNT
      ON OVERFLOW DISPLAY 'OVERFLOW!' 
   END-STRING.
   DISPLAY 'WS-STRING : 'WS-STRING.
   DISPLAY 'WS-COUNT : 'WS-COUNT.
STOP RUN.

JCL执行上述COBOL程序 -

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

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

WS-STRING : WelcomeToIoWiki       
WS-COUNT : 25

Unstring

Unstring动词用于将一个字符串拆分为多个子字符串。 定界条款是强制性的。

Syntax

以下是Unstring动词的语法 -

UNSTRING ws-string DELIMITED BY SPACE
INTO ws-str1, ws-str2
WITH POINTER ws-count
ON OVERFLOW DISPLAY message
NOT ON OVERFLOW DISPLAY message
END-UNSTRING.

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STRING PIC A(30) VALUE 'WELCOME TO IOWIKI'.
   01 WS-STR1 PIC A(7).
   01 WS-STR2 PIC A(2).
   01 WS-STR3 PIC A(15).
   01 WS-COUNT PIC 99 VALUE 1.
PROCEDURE DIVISION.
   UNSTRING WS-STRING DELIMITED BY SPACE
      INTO WS-STR1, WS-STR2, WS-STR3
   END-UNSTRING.
   DISPLAY 'WS-STR1 : 'WS-STR1.
   DISPLAY 'WS-STR2 : 'WS-STR2.
   DISPLAY 'WS-STR3 : 'WS-STR3.
STOP RUN.

JCL执行上述COBOL程序 -

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

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

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

COBOL - Table Processing

COBOL中的数组称为表。 数组是线性数据结构,是相同类型的各个数据项的集合。 表的数据项在内部排序。

表声明

表在数据部门中声明。 Occurs子句用于定义表。 Occurs子句表示重复数据名称定义。 它只能用于从02到49的级别编号。不要使用带有Redefines的occurrence子句。 一维和二维表的描述如下 -

One-Dimensional Table

在一维表中, occurs子句在声明中仅使用一次。 WSTABLE是包含表的组项。 WS-B命名出现10次的表元素。

Syntax

以下是定义一维表的语法 -

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

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A PIC A(10) VALUE 'TUTORIALS' OCCURS 5 TIMES.     
PROCEDURE DIVISION.
   DISPLAY "ONE-D TABLE : "WS-TABLE.
STOP RUN.

JCL执行上述COBOL程序 -

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

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

ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS

Two-Dimensional Table

创建二维表,其中两个数据元素都是可变长度的。 作为参考,请完成语法,然后尝试分析表。 第一个阵列(WS-A)可以发生1到10次,内部阵列(WS-C)可以发生1到5次。 对于WS-A的每个条目,将有相应的5个WS-C条目。

Syntax

以下是定义二维表的语法 -

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

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 2 TIMES.
         10 WS-B PIC A(10) VALUE ' TUTORIALS'.
         10 WS-C OCCURS 2 TIMES.
            15 WS-D PIC X(6) VALUE ' POINT'.
PROCEDURE DIVISION.
   DISPLAY "TWO-D TABLE : "WS-TABLE.
STOP RUN.

JCL执行上述COBOL程序 -

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

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

TWO-D TABLE :  TUTORIALS POINT POINT TUTORIALS POINT POINT

下标 (Subscript)

可以使用下标来访问表单个元素。 下标值的范围可以是1到表发生的次数。 下标可以是任何正数。 它不需要在数据分区中声明任何声明。 它是使用occurrence子句自动创建的。

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 3 TIMES.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES.
            15 WS-D PIC X(3).
PROCEDURE DIVISION.
   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).
STOP RUN.

JCL执行上述COBOL程序 -

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

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

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

也可以使用索引访问表元素。 索引是元素从表开始的位移。 使用INDEXED BY子句使用Occurs子句声明索引。 可以使用SET语句和PERFORM Varying选项更改索引的值。

Syntax

以下是在表中定义Index的语法 -

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

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 3 TIMES INDEXED BY I.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES INDEXED BY J.
            15 WS-D PIC X(3).
PROCEDURE DIVISION.
   MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
   PERFORM A-PARA VARYING I FROM 1 BY 1 UNTIL I >3 
   STOP RUN.
   A-PARA.
   PERFORM C-PARA VARYING J FROM 1 BY 1 UNTIL J>2.
   C-PARA.
   DISPLAY WS-C(I,J).

JCL执行上述COBOL程序 -

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

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

ABC
DEF
GHI
JKL
MNO
PQR

Set 语句

Set语句用于更改索引值。 Set动词用于初始化,递增或递减索引值。 它与“搜索和全部搜索”一起用于查找表中的元素。

Syntax

以下是使用Set语句的语法 -

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

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 3 TIMES INDEXED BY I.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES INDEXED BY J.
            15 WS-D PIC X(3).
PROCEDURE DIVISION.
   MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
   SET I J TO 1.
   DISPLAY WS-C(I,J).
   SET I J UP BY 1.
   DISPLAY WS-C(I,J).
STOP RUN.

JCL执行上面的COBOL程序。

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

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

ABC
JKL

Search

搜索是一种线性搜索方法,用于查找表格内的元素。 它可以在已排序和未排序的表上执行。 它仅用于由Index短语声明的表。 它从索引的初始值开始。 如果未找到搜索到的元素,则索引将自动递增1并继续直到表的末尾。

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A PIC X(1) OCCURS 18 TIMES INDEXED BY I.
   01 WS-SRCH PIC A(1) VALUE 'M'.
PROCEDURE DIVISION.
   MOVE 'ABCDEFGHIJKLMNOPQR' TO WS-TABLE.
   SET I TO 1.
   SEARCH WS-A
      AT END DISPLAY 'M NOT FOUND IN TABLE'
      WHEN WS-A(I) = WS-SRCH
      DISPLAY 'LETTER M FOUND IN TABLE'
   END-SEARCH.  
STOP RUN.

JCL执行上面的COBOL程序。

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

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

LETTER M FOUND IN TABLE

全部搜索

Search All是一种二进制搜索方法,用于查找表中的元素。 对于“全部搜索”选项,表必须按排序顺序排列。 索引不需要初始化。 在二进制搜索中,表被分成两半,并确定搜索到的元素的一半存在。 重复此过程直到找到元素或达到结束。

Example

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-RECORD OCCURS 10 TIMES ASCENDING KEY IS WS-NUM INDEXED BY I.
      10 WS-NUM PIC 9(2).
      10 WS-NAME PIC A(3).
PROCEDURE DIVISION.
   MOVE '12ABC56DEF34GHI78JKL93MNO11PQR' TO WS-TABLE.
   SEARCH ALL WS-RECORD
     AT END DISPLAY 'RECORD NOT FOUND'
     WHEN WS-NUM(I) = 93
     DISPLAY 'RECORD FOUND '
     DISPLAY WS-NUM(I)
     DISPLAY WS-NAME(I)
END-SEARCH. 

JCL执行上述COBOL程序 -

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

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

RECORD FOUND 
93
MNO

COBOL - File Handling

COBOL中的文件概念与C/C ++中的文件概念不同。 在学习COBOL中“文件”的基础知识时,两种语言的概念不应该是相互关联的。 简单文本文件不能在COBOL中使用,而是使用PS (Physical Sequential)VSAM文件。 PS文件将在本单元中讨论。

要理解COBOL中的文件处理,必须知道基本术语。 这些术语仅用于理解文件处理的基础知识。 深入术语将在“文件处理动词”一章中讨论。 以下是基本条款 -

  • Field
  • Record
  • 物理记录
  • 逻辑记录
  • File

以下示例有助于理解这些术语 -

计划结构

字段 (Field)

字段用于指示存储在元素周围的数据。 它表示上面示例中显示的单个元素,例如学生ID,姓名,标记,总分和百分比。 任何字段中的字符数称为字段大小,例如,学生姓名可以包含10个字符。 字段可以具有以下属性 -

  • Primary keys是每个记录唯一的字段,用于标识特定记录。 例如,在学生标记文件中,每个学生将具有形成主键的唯一学生ID。

  • Secondary keys是用于搜索相关数据的唯一或非唯一字段。 例如,在学生标记文件中,当学生ID未知时,学生的全名可以用作辅助密钥。

  • Descriptors字段用于描述实体。 例如,在学生标记文件中,为记录添加含义的标记和百分比字段是已知描述符。

Record

Record是用于描述实体的字段集合。 一个或多个字段一起形成记录。 例如,在学生标记文件中,学生ID,姓名,标记,总分和百分比构成一条记录。 记录中所有字段的累积大小称为记录大小。 文件中存在的记录可以是固定长度或可变长度。

物理记录

物理记录是外部设备上存在的信息。 它也被称为块。

逻辑记录

逻辑记录是程序使用的信息。 在COBOL程序中,只能在任何时间处理一条记录,并将其称为逻辑记录。

File

文件是相关记录的集合。 例如,学生标记文件由所有学生的记录组成。

COBOL - File Organization

文件组织指示如何在文件中组织记录。 文件有不同类型的组织,以提高其访问记录的效率。 以下是文件组织方案的类型 -

  • 顺序文件组织
  • 索引顺序文件组织
  • 相对文件组织

本模块中的语法及其各自的术语仅涉及它们在程序中的用法。 使用这些语法的完整程序将在“文件处理动词”一章中讨论。

顺序文件组织

顺序文件由按顺序存储和访问的记录组成。 以下是顺序文件组织的关键属性 -

  • 可以按顺序读取记录。 要读取第10条记录,应读取之前的所有9条记录。

  • 记录按顺序写入。 无法插入新记录。 始终在文件末尾插入新记录。

  • 将记录放入顺序文件后,无法删除,缩短或延长记录。

  • 插入后的记录顺序永远不会改变。

  • 可以更新记录。 如果新记录长度与旧记录长度相同,则可以覆盖记录。

  • 顺序输出文件是打印的好选择。

语法 (Syntax)

以下是顺序文件组织的语法 -

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

索引顺序文件组织

索引顺序文件由可以按顺序访问的记录组成。 也可以直接进入。 它由两部分组成 -

  • Data File包含顺序方案中的记录。

  • Index File包含数据文件中的主键及其地址。

以下是顺序文件组织的关键属性 -

  • 记录可以按顺序读取,就像顺序文件组织一样。

  • 如果主键已知,则可以随机访问记录。 索引文件用于获取记录的地址,然后从数据文件中获取记录。

  • 在该文件系统中维护排序索引,该索引将键值与文件中记录的位置相关联。

  • 也可以创建备用索引来获取记录。

语法 (Syntax)

以下是索引顺序文件组织的语法 -

INPUT-OUTPUT SECTION.
FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name-jcl
   ORGANIZATION IS INDEXED
   RECORD KEY IS primary-key
   ALTERNATE RECORD KEY IS rec-key

相对文件组织

相对文件由按其relative address排序的记录组成。 以下是相关文件组织的关键属性 -

  • 可以按顺序读取记录,就像顺序和索引文件组织一样。

  • 可以使用相对密钥访问记录。 相对键表示记录相对于文件开头地址的位置。

  • 可以使用相对密钥插入记录。 使用相对密钥计算相对地址。

  • 相对文件提供对记录的最快访问。

  • 这个文件系统的主要缺点是如果缺少某些中间记录,它们也会占用空间。

语法 (Syntax)

以下是相对文件组织的语法 -

INPUT-OUTPUT SECTION.
FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name-jcl
   ORGANIZATION IS RELATIVE
   RELATIVE KEY IS rec-key

COBOL - File Access Mode

到目前为止,已经讨论了文件组织方案。 对于每个文件组织方案,可以使用不同的访问模式。 以下是文件访问模式的类型 -

  • 顺序访问
  • 随机访问
  • 动态访问

本模块中的语法及其各自的术语仅涉及它们在程序中的用法。 使用这些语法的完整程序将在下一章中讨论。

顺序访问

当访问模式是顺序的时,记录检索的方法根据所选的文件组织而改变。

  • 对于sequential files ,记录的访问顺序与插入顺序相同。

  • 对于indexed files ,用于获取记录的参数是记录键值。

  • 对于relative files ,相对记录键用于检索记录。

语法 (Syntax)

以下是顺序访问模式的语法 -

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS <b class="notranslate">SEQUENTIAL</b>
   ACCESS MODE IS <b class="notranslate">SEQUENTIAL</b>
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS <b class="notranslate">INDEXED</b>
   ACCESS MODE IS <b class="notranslate">SEQUENTIAL</b>
   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 <b class="notranslate">RELATIVE</b>
   ACCESS MODE IS <b class="notranslate">SEQUENTIAL</b>
   RELATIVE KEY IS rec-key1

随机访问

当访问模式为RANDOM时,记录检索方法根据所选文件组织而变化。

  • 对于indexed files ,根据键字段中的值来访问记录,该字段可以是主键或备用键。 可以有一个或多个备用索引。

  • 对于relative files ,通过相对记录键检索记录。

语法 (Syntax)

以下是随机访问模式的语法 -

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS <b class="notranslate">INDEXED</b>
   ACCESS MODE IS <b class="notranslate">RANDOM</b>
   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 <b class="notranslate">RELATIVE</b>
   ACCESS MODE IS <b class="notranslate">RANDOM</b>
   RELATIVE KEY IS rec-key1

动态访问

动态访问支持同一程序中的顺序访问和随机访问。 通过动态访问,一个文件定义用于执行顺序和随机处理,例如按顺序访问某些记录,按键访问其他记录。

对于相对和索引文件,动态访问模式允许您在使用READ语句中的NEXT短语读取文件时在顺序访问模式和随机访问模式之间来回切换。 NEXT和READ功能将在下一章中讨论。

语法 (Syntax)

以下是动态访问模式的语法 -

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS <b class="notranslate">SEQUENTIAL</b>
   ACCESS MODE IS <b class="notranslate">DYNAMIC</b>
   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 <b class="notranslate">RELATIVE</b>
   ACCESS MODE IS <b class="notranslate">DYNAMIC</b>
   RELATIVE KEY IS rec-key1

COBOL - File Handling Verbs

文件处理动词用于对文件执行各种操作。 以下是文件处理动词 -

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

打开动词

Open是必须执行的第一个文件操作。 如果Open成功,则只能对文件进行进一步操作。 只有在打开文件后,文件结构中的变量才可用于处理。 每次文件操作后都会更新FILE STATUS变量。

语法 (Syntax)

OPEN "mode" file-name.

这里,file-name是字符串文字,您将使用它来命名文件。 可以在以下模式下打开文件 -

Sr.No. 模式和说明
1

Input

输入模式用于现有文件。 在这种模式下,我们只能读取文件,文件上不允许其他操作。

2

Output

输出模式用于在文件中插入记录。 如果使用sequential file并且文件保留了一些记录,则将首先删除现有记录,然后在文件中插入新记录。 在indexed filerelative file情况下不会发生这种情况。

3

Extend

扩展模式用于在sequential file追加记录。 在此模式下,最后会插入记录。 如果文件访问模式是RandomDynamic ,则不能使用扩展模式。

4

IO

输入输出模式用于读取和重写文件的记录。

阅读动词

读动词用于读取文件记录。 read的功能是从文件中获取记录。 在每个读动词中,只能将一个记录读入文件结构。 要执行读取操作,请在INPUT或IO模式下打开文件。 在每个读取语句中,文件指针递增,因此读取连续记录。

语法 (Syntax)

以下是在文件访问模式顺序时读取记录的语法 -

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.

以下是使用的参数 -

  • NEXT RECORD是可选的,在按顺序读取索引顺序文件时指定。

  • INTO子句是可选的。 ws-file-structure在WorkingStorage部分中定义,以从READ语句中获取值。

  • 到达文件末尾时,AT END条件变为True。

Example - 以下示例使用行顺序组织读取现有文件。 可以使用Live Demo选项编译和执行该程序,它将显示文件中存在的所有记录。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
      FILE-CONTROL.
      SELECT STUDENT ASSIGN TO 'input.txt'
      ORGANIZATION IS LINE SEQUENTIAL.            
DATA DIVISION.
   FILE SECTION.
   FD STUDENT.
   01 STUDENT-FILE.
      05 STUDENT-ID PIC 9(5).
      05 NAME PIC A(25).
   WORKING-STORAGE SECTION.
   01 WS-STUDENT.
      05 WS-STUDENT-ID PIC 9(5).
      05 WS-NAME PIC A(25).
   01 WS-EOF PIC A(1). 
PROCEDURE DIVISION.
   OPEN INPUT STUDENT.
      PERFORM UNTIL WS-EOF='Y'
         READ STUDENT INTO WS-STUDENT
            AT END MOVE 'Y' TO WS-EOF
            NOT AT END DISPLAY WS-STUDENT
         END-READ
      END-PERFORM.
   CLOSE STUDENT.
STOP RUN.

假设input.txt文件中可用的输入文件数据包含以下内容 -

20003 Mohtashim M.
20004 Nishant Malik
20005 Amitabh Bachhan

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

20003 Mohtashim M.            
20004 Nishant Malik           
20005 Amitabh Bachhan 

语法 (Syntax)

以下是文件访问模式随机时读取记录的语法 -

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 - 以下示例使用索引组织读取现有文件。 可以使用大型机上的JCL编译和执行该程序,它将显示文件中存在的所有记录。 在大型机服务器上,我们不使用文本文件; 相反,我们使用PS文件。

假设大型机上的文件与上例中的input.txt文件具有相同的内容。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT STUDENT ASSIGN TO IN1
      ORGANIZATION IS INDEXED
      ACCESS IS RANDOM
      RECORD KEY IS STUDENT-ID
      FILE STATUS IS FS.
DATA DIVISION.
   FILE SECTION.
   FD STUDENT.
      01 STUDENT-FILE.
      05 STUDENT-ID PIC 9(5).
      05 NAME PIC A(25).
   WORKING-STORAGE SECTION.
   01 WS-STUDENT.
      05 WS-STUDENT-ID PIC 9(5).
      05 WS-NAME PIC A(25).
PROCEDURE DIVISION.
   OPEN INPUT STUDENT.
      MOVE 20005 TO STUDENT-ID.
      READ STUDENT RECORD INTO WS-STUDENT-FILE
         KEY IS STUDENT-ID
         INVALID KEY DISPLAY 'Invalid Key'
         NOT INVALID KEY DISPLAY WS-STUDENT-FILE
      END-READ.
   CLOSE STUDENT.
STOP RUN.

JCL执行上述COBOL程序 -

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

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

20005 Amitabh Bachhan 

写动词

Write动词用于在文件中插入记录。 写入记录后,记录缓冲区中不再可用。 在将记录插入文件之前,将值移动到记录缓冲区中,然后执行write动词。

Write语句可以与FROM选项一起使用,直接从工作存储变量中写入记录。 From是一个可选条款。 如果访问模式是顺序的,那么要写入记录,文件必须在输出模式或扩展模式下打开。 如果访问模式是随机或动态的,则要写入记录,文件必须在输出模式或IO模式下打开。

语法 (Syntax)

以下是在文件组织顺序时读取记录的语法 -

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

以下是在文件组织编制索引或相对时读取记录的语法 -

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

Example - 以下示例显示如何在组织顺序时在新文件中插入新记录。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT STUDENT ASSIGN TO OUT1
      ORGANIZATION IS SEQUENTIAL
      ACCESS IS SEQUENTIAL
      FILE STATUS IS FS.
DATA DIVISION.
   FILE SECTION.
   FD STUDENT
   01 STUDENT-FILE.
      05 STUDENT-ID PIC 9(5).
      05 NAME PIC A(25).
      05 CLASS PIC X(3).
   WORKING-STORAGE SECTION.
   01 WS-STUDENT.
      05 WS-STUDENT-ID PIC 9(5).
      05 WS-NAME PIC A(25).
      05 WS-CLASS PIC X(3).
PROCEDURE DIVISION.
   OPEN EXTEND STUDENT.
      MOVE 1000 TO STUDENT-ID.
      MOVE 'Tim' TO NAME.
      MOVE '10' TO CLASS.
      WRITE STUDENT-FILE
      END-WRITE.	
   CLOSE STUDENT.
STOP RUN.

JCL执行上述COBOL程序 -

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

编译并执行上述程序时,它会将新记录添加到输出文件中。

1000 Tim         10

重写动词

重写动词用于更新记录。 应在IO模式下打开文件以进行重写操作。 只有在成功读取操作后才能使用它。 重写动词会覆盖最后读取的记录。

语法 (Syntax)

以下是在文件组织顺序时读取记录的语法 -

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

以下是在文件组织编制索引或相对时读取记录的语法 -

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

Example - 以下示例显示如何更新我们在上一个写入步骤中插入的现有记录 -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT STUDENT ASSIGN TO IN1
      ORGANIZATION IS INDEXED
      ACCESS IS RANDOM
      RECORD KEY IS STUDENT-ID
      FILE STATUS IS FS.
DATA DIVISION.
   FILE SECTION.
   FD STUDENT
   01 STUDENT-FILE.
      05 STUDENT-ID PIC 9(4).
      05 NAME PIC A(12).
      05 CLASS PIC X(3).
   WORKING-STORAGE SECTION.
   01 WS-STUDENT.
      05 WS-STUDENT-ID PIC 9(5).
      05 WS-NAME PIC A(25).
      05 WS-CLASS PIC X(3).
PROCEDURE DIVISION.
   OPEN I-O STUDENT.
   MOVE '1000' TO STUDENT-ID.
   READ STUDENT
      KEY IS STUDENT-ID
      INVALID KEY DISPLAY ‘KEY IS NOT EXISTING’
   END-READ.
   MOVE 'Tim Dumais' TO NAME.
   REWRITE STUDENT-FILE
   END-REWRITE.
   CLOSE STUDENT.
STOP RUN.

JCL执行上述COBOL程序 -

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

当你编译并执行上面的程序时,它会更新记录 -

1000 Tim Dumais  10

删除动词

删除动词只能在索引文件和相关文件上执行。 必须在IO模式下打开该文件。 在顺序文件组织中,无法删除记录。 在顺序访问模式的情况下,将删除Read语句最后读取的记录。 在随机访问模式下,指定记录键,然后执行删除操作。

语法 (Syntax)

以下是删除记录的语法 -

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

Example - 删除现有记录 -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT STUDENT ASSIGN TO OUT1
      ORGANIZATION IS INDEXED
      ACCESS IS RANDOM
      RECORD KEY IS STUDENT-ID
      FILE STATUS IS FS.
DATA DIVISION.
   FILE SECTION.
   FD STUDENT
   01 STUDENT-FILE.
      05 STUDENT-ID PIC 9(4).
      05 NAME PIC A(12).
      05 CLASS PIC X(3).
   WORKING-STORAGE SECTION.
   01 WS-STUDENT.
      05 WS-STUDENT-ID PIC 9(5).
      05 WS-NAME PIC A(25).
      05 WS-CLASS PIC X(3).
PROCEDURE DIVISION.
   OPEN I-O STUDENT.
   MOVE '1000' TO STUDENT-ID.
   DELETE STUDENT RECORD
      INVALID KEY DISPLAY 'Invalid Key'
      NOT INVALID KEY DISPLAY 'Record Deleted'
   END-DELETE.
   CLOSE STUDENT.
STOP RUN.

JCL执行上述COBOL程序 -

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

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

Record Deleted

开始动词

只能对索引文件和相关文件执行启动动词。 它用于将文件指针放在特定记录上。 访问模式必须是顺序的或动态的。 必须在IO或输入模式下打开文件。

语法 (Syntax)

以下是将指针放在特定记录的语法 -

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

关闭动词

关闭动词用于关闭文件。 执行关闭操作后,文件结构中的变量将无法进行处理。 程序和文件之间的链接丢失。

语法 (Syntax)

以下是关闭文件的语法 -

CLOSE file-name.

COBOL - Subroutines

Cobol子程序是一个可以独立编译但不能独立执行的程序。 有两种类型的子程序: internal subroutinesPerform语句和external子程序,如CALL动词。

打电话动词

调用动词用于将控件从一个程序转移到另一个程序。 包含CALL动词的程序是Calling Program ,被调用的程序称为Called Program 。 调用程序执行将暂停,直到被调用程序完成执行。 退出程序语句在被调用程序中用于传回控制。

称为程序约束

以下是所谓的计划要求 -

  • 必须在被调用程序中定义Linkage section 。 它由程序中传递的数据元素组成。 数据项不应具有Value子句。 PIC子句必须与通过调用程序传递的变量兼容。

  • Procedure division using具有从调用程序传递的变量列表,并且顺序必须与调用动词中提到的相同。

  • 在被调用程序中使用Exit program语句来传回控制。 它必须是被调用程序中的最后一个语句。

参数可以通过两种方式在程序之间传递 -

  • 引用
  • 按内容

按参考呼叫

如果修改了被调用程序中变量的值,那么它们的新值将反映在调用程序中。 如果未指定BY子句,则变量始终通过引用传递。

语法 (Syntax)

以下是通过引用调用子例程的语法 -

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

Example

以下示例是MAIN调用程序,UTIL是被调用程序 -

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
   01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.
PROCEDURE DIVISION.
   CALL 'UTIL' USING WS-STUDENT-ID, WS-STUDENT-NAME.
   DISPLAY 'Student Id : ' WS-STUDENT-ID
   DISPLAY 'Student Name : ' WS-STUDENT-NAME
STOP RUN.

被称为计划

IDENTIFICATION DIVISION.
PROGRAM-ID. UTIL.
DATA DIVISION.
   LINKAGE SECTION.
   01 LS-STUDENT-ID PIC 9(4).
   01 LS-STUDENT-NAME PIC A(15).
PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
   DISPLAY 'In Called Program'.
   MOVE 1111 TO LS-STUDENT-ID.
EXIT PROGRAM.

JCL执行上述COBOL程序 -

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

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

In Called Program
Student Id : 1111
Student Name : Tim

按内容呼叫

如果修改了被调用程序中变量的值,那么它们的新值将不会反映在调用程序中。

语法 (Syntax)

以下是按内容调用子例程的语法 -

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

Example

以下示例是MAIN调用程序,UTIL是被调用程序 -

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
   01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.
PROCEDURE DIVISION.
   CALL 'UTIL' USING BY CONTENT WS-STUDENT-ID, BY CONTENT WS-STUDENT-NAME.
   DISPLAY 'Student Id : ' WS-STUDENT-ID
   DISPLAY 'Student Name : ' WS-STUDENT-NAME
STOP RUN.

被称为计划

IDENTIFICATION DIVISION.
PROGRAM-ID. UTIL.
DATA DIVISION.
   LINKAGE SECTION.
   01 LS-STUDENT-ID PIC 9(4).
   01 LS-STUDENT-NAME PIC A(15).
PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
   DISPLAY 'In Called Program'.
   MOVE 1111 TO LS-STUDENT-ID.
EXIT PROGRAM.

JCL执行上述COBOL程序 -

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

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

In Called Program
Student Id : 1000
Student Name : Tim

通话类型

有两种类型的电话 -

  • 使用NODYNAM编译器选项编译程序时发生Static Call 。 静态调用程序在编译时加载到存储中。

  • 使用DYNAM和NODLL编译器选项编译程序时发生Dynamic Call 。 动态调用程序在运行时加载到存储中。

COBOL - Internal Sort

在几乎所有面向业务的应用程序中,对文件中的数据进行排序或合并两个或多个文件是常见的必要条件。 排序用于按升序或降序排列记录,以便可以执行顺序处理。 有两种技术可用于在COBOL中对文件进行排序 -

  • External sort用于通过使用JCL中的SORT实用程序对文件进行排序。 我们在JCL章节中讨论过这个问题。 截至目前,我们将专注于内部排序。

  • Internal sort用于对COBOL程序中的文件进行排序。 SORT动词用于对文件进行排序。

排序动词

COBOL中的排序过程中使用了三个文件 -

  • Input file是我们必须按升序或降序排序的文件。

  • Work file用于在排序过程进行时保存记录。 输入文件记录将传输到工作文件以进行排序过程。 该文件应在SD条目下的文件部分中定义。

  • Output file是我们在排序过程后得到的文件。 它是Sort动词的最终输出。

语法 (Syntax)

以下是对文件进行排序的语法 -

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

SORT执行以下操作 -

  • 在IO模式下打开工作文件,在INPUT模式下打开输入文件,在OUTPUT模式下打开输出文件。

  • 将输入文件中存在的记录传输到工作文件。

  • 通过rec-key按升序/降序对SORT-FILE进行排序。

  • 将已排序的记录从工作文件传输到输出文件。

  • 关闭输入文件和输出文件并删除工作文件。

Example

在以下示例中,INPUT是输入文件,需要按升序排序 -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
      SELECT INPUT ASSIGN TO IN.
      SELECT OUTPUT ASSIGN TO OUT.
      SELECT WORK ASSIGN TO WRK.
DATA DIVISION.
   FILE SECTION.
   FD INPUT.
      01 INPUT-STUDENT.
         05 STUDENT-ID-I PIC 9(5).
         05 STUDENT-NAME-I PIC A(25).
   FD OUTPUT.
      01 OUTPUT-STUDENT.
         05 STUDENT-ID-O PIC 9(5).
         05 STUDENT-NAME-O PIC A(25).
   SD WORK.
      01 WORK-STUDENT.
         05 STUDENT-ID-W PIC 9(5).
         05 STUDENT-NAME-W PIC A(25).
PROCEDURE DIVISION.
   SORT WORK ON ASCENDING KEY STUDENT-ID-O
   USING INPUT GIVING OUTPUT.
   DISPLAY 'Sort Successful'.
STOP RUN.

JCL执行上述COBOL程序 -

//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

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

Sort Successful

合并动词

使用Merge语句组合两个或多个相同顺序的文件。 合并过程中使用的文件 -

  • 输入文件 - 输入-1,输入-2
  • 工作文件
  • 输出文件

语法 (Syntax)

以下是合并两个或多个文件的语法 -

MERGE work-file ON ASCENDING KEY rec-key1
   [ON DESCENDING KEY rec-key2]
USING input-1, input-2 GIVING output-file.

合并执行以下操作 -

  • 在IO模式下打开工作文件,在INPUT模式下打开输入文件,在OUTPUT模式下打开输出文件。

  • 将输入文件中存在的记录传输到工作文件。

  • 通过rec-key按升序/降序对SORT-FILE进行排序。

  • 将已排序的记录从工作文件传输到输出文件。

  • 关闭输入文件和输出文件并删除工作文件。

Example

在以下示例中,INPUT1和INPUT2是要按升序合并的输入文件 -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
      SELECT INPUT1 ASSIGN TO IN1.
      SELECT INPUT2 ASSIGN TO IN2.
      SELECT OUTPUT ASSIGN TO OUT.
      SELECT WORK ASSIGN TO WRK.
DATA DIVISION.
   FILE SECTION.
   FD INPUT1.
      01 INPUT1-STUDENT.
         05 STUDENT-ID-I1 PIC 9(5).
         05 STUDENT-NAME-I1 PIC A(25).
   FD INPUT2.
      01 INPUT2-STUDENT.
         05 STUDENT-ID-I2 PIC 9(5).
         05 STUDENT-NAME-I2 PIC A(25).
   FD OUTPUT.
      01 OUTPUT-STUDENT.
         05 STUDENT-ID-O PIC 9(5).
         05 STUDENT-NAME-O PIC A(25).
   SD WORK.
      01 WORK-STUDENT.
         05 STUDENT-ID-W PIC 9(5).
         05 STUDENT-NAME-W PIC A(25).
PROCEDURE DIVISION.
   MERGE WORK ON ASCENDING KEY STUDENT-ID-O
   USING INPUT1, INPUT2 GIVING OUTPUT.
   DISPLAY 'Merge Successful'.
STOP RUN.

JCL执行上述COBOL程序 -

//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

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

Merge Successful

COBOL - Database Interface

截至目前,我们已经学会了在COBOL中使用文件。 现在,我们将讨论COBOL程序如何与DB2交互。 它涉及以下条款 -

  • 嵌入式SQL
  • DB2应用程序编程
  • 主机变量
  • SQLCA
  • SQL查询
  • Cursors

嵌入式SQL

嵌入式SQL语句在COBOL程序中用于执行标准SQL操作。 在编译应用程序之前,SQL处理器会对嵌入式SQL语句进行预处理。 COBOL被称为Host Language 。 COBOL-DB2应用程序是包含COBOL和DB2的应用程序。

嵌入式SQL语句的工作方式与普通的SQL语 例如,查询的输出指向一组预定义的变量,这些变量称为Host Variables 。 另一个INTO子句放在SELECT语句中。

DB2应用程序编程

以下是编写COBOL-DB2程序时要遵循的规则 -

  • 必须在EXEC SQLENDEXEC.之间分隔所有SQL语句ENDEXEC.

  • SQL语句必须在区域B中编码。

  • 必须在WorkingStorage部分声明程序中使用的所有表。 这是通过使用INCLUDE语句完成的。

  • 除INCLUDE和DECLARE TABLE之外的所有SQL语句都必须出现在Procedure Division中。

主机变量

主机变量用于从表接收数据或在表中插入数据。 必须为要在程序和DB2之间传递的所有值声明主机变量。 它们在工作储存科申报。

主变量不能是组项,但它们可以在主机结构中组合在一起。 它们无法RenamedRedefined 。 将主变量与SQL语句一起使用,用colon (:).作为前缀colon (:).

语法 (Syntax)

以下是声明主机变量并在工作存储部分中包含表的语法 -

DATA DIVISION.
   WORKING-STORAGE SECTION.
   EXEC SQL
   INCLUDE table-name
   END-EXEC.
   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
   01 STUDENT-REC.
      05 STUDENT-ID PIC 9(4).
      05 STUDENT-NAME PIC X(25).
      05 STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

SQLCA

SQLCA是一个SQL通信区域,DB2通过该区域将SQL执行的反馈传递给程序。 它告诉程序执行是否成功。 SQLCA下有许多预定义变量,如SQLCODE ,它包含错误代码。 SQLCODE中的值'000'表示成功执行。

语法 (Syntax)

以下是在Working-Storage部分声明SQLCA的语法 -

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

SQL Queries

假设我们有一个名为'Student'的表,其中包含Student-Id,Student-Name和Student-Address。

STUDENT表包含以下数据 -

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

以下示例显示了COBOL程序中SELECT查询的用法 -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   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 PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.
PROCEDURE DIVISION.
   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 = 0 
      DISPLAY WS-STUDENT-RECORD
   ELSE DISPLAY 'Error'
   END-IF.
STOP RUN.

JCL执行上述COBOL程序 -

//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)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

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

1004 Chulbul Pandey		Lucknow

以下示例显示了COBOL程序中INSERT查询的用法 -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   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 PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.
PROCEDURE DIVISION.
   MOVE 1005 TO WS-STUDENT-ID.
   MOVE 'IoWiki' 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 = 0 
      DISPLAY 'Record Inserted Successfully'
      DISPLAY WS-STUDENT-REC
   ELSE DISPLAY 'Error'
   END-IF.
STOP RUN.

JCL执行上述COBOL程序 -

//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)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

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

Record Inserted Successfully
1005 IoWiki		Hyderabad

以下示例显示了COBOL程序中UPDATE查询的用法 -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   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 PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.
PROCEDURE DIVISION.
   MOVE 'Bangalore' TO WS-STUDENT-ADDRESS.
   EXEC SQL
      UPDATE STUDENT SET STUDENT-ADDRESS=:WS-STUDENT-ADDRESS
      WHERE STUDENT-ID = 1003
   END-EXEC.
   IF SQLCODE = 0 
      DISPLAY 'Record Updated Successfully'
   ELSE DISPLAY 'Error'
   END-IF.
STOP RUN.

JCL执行上述COBOL程序 -

//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)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

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

Record Updated Successfully

以下example显示了COBOL程序中DELETE查询的用法 -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
   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 PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.
PROCEDURE DIVISION.
   MOVE 1005 TO WS-STUDENT-ID.
   EXEC SQL
      DELETE FROM STUDENT
      WHERE STUDENT-ID=:WS-STUDENT-ID
   END-EXEC.
   IF SQLCODE = 0 
      DISPLAY 'Record Deleted Successfully'
   ELSE DISPLAY 'Error'
   END-IF.
STOP RUN.

JCL执行上述COBOL程序 -

//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)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

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

Record Deleted Successfully

Cursors

游标用于一次处理多行选择。 它们是包含查询所有结果的数据结构。 它们可以在工作 - 存储部分或程序部门中定义。 以下是与光标相关的操作 -

  • Declare
  • Open
  • Close
  • Fetch

声明游标

游标声明可以在工作存储部分或程序部门完成。 第一个语句是DECLARE语句,它是一个不可执行的语句。

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

Open

在使用游标之前,必须执行Open语句。 Open语句准备SELECT执行。

EXEC SQL
   OPEN STUDCUR
END-EXEC.

Close

Close语句释放游标占用的所有内存。 在结束程序之前必须关闭光标。

EXEC SQL
   CLOSE STUDCUR
END-EXEC.

Fetch

Fetch语句标识游标并将值放入INTO子句中。 Fetch语句在循环中编码,因为我们一次获得一行。

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

以下示例显示了游标用于从STUDENT表中获取所有记录的用法 -

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
   WORKING-STORAGE SECTION.
   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 PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.
   EXEC SQL
      DECLARE STUDCUR CURSOR FOR
      SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
      WHERE STUDENT-ID >:WS-STUDENT-ID
   END-EXEC.
PROCEDURE DIVISION.
   MOVE 1001 TO WS-STUDENT-ID.
   PERFORM UNTIL SQLCODE = 100
   EXEC SQL
      FETCH STUDCUR
      INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS
   END-EXEC
   DISPLAY WS-STUDENT-REC
END-PERFORM	
STOP RUN.

JCL执行上述COBOL程序 -

//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)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

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

1001 Mohtashim M.		Hyderabad
1002 Nishant Malik		Delhi
1003 Amitabh Bachan		Mumbai
1004 Chulbul Pandey		Lucknow
↑回到顶部↑
WIKI教程 @2018