表处理( 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