COBOL - 数据层

  • 简述

    COBOL 布局是对每个字段的使用以及其中存在的值的描述。以下是 COBOL 中使用的数据描述条目 -
    • Redefines 子句
    • Renames 子句
    • Usage 子句
    • Copybooks
  • 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 级编号的重新定义子句。重新定义定义必须是您要重新定义的下一个数据描述。重新定义的项目将始终具有与重新定义的项目相同的值。
    实例
    
    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 子句

    Renames 子句用于为现有数据项赋予不同的名称。它用于重新分组数据名称并为它们赋予新名称。新的数据名称可以跨组或基本项目重命名。第 66 级保留用于重命名。
    Syntax
    以下是重命名子句的语法 -
    
    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 的重命名。用于重命名的数据名称必须按顺序出现。不能重命名带有发生子句的数据项。
    实例
    
    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 子句。Usage 子句可用的不同选项如下 -

    展示

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

    计算/比较

    数据项以二进制格式存储。这里,数据项必须是整数。
    以下示例计算所需的字节数 -
    
    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 copybook 是定义数据结构的代码选择。如果在许多程序中都使用了特定的数据结构,那么我们可以使用抄写本,而不是再次编写相同的数据结构。我们使用 COPY 语句在程序中包含一个Copybooks。COPY 语句用于 WorkingStorage 部分。
    以下示例在 COBOL 程序中包含一个Copybooks -
    
    DATA DIVISION.
    WORKING-STORAGE SECTION.
    COPY ABC.
    
    这里 ABC 是Copybooks名称。ABCCopybooks中的以下数据项可以在程序中使用。
    
    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'.