COBOL如何存储和检索数据?

Mat*_*ips 8 cobol data-storage

我开始学习COBOL了.我有一些编写处理SQL数据库的程序的经验,我想我很困惑COBOL如何存储和检索存储在大型机中的数据.我知道它不像关系数据库,但我见过的每个示例程序都直接从命令行获取数据,我知道现实世界的COBOL程序不是如何处理数据的.有人可以解释或向我展示一个可以解释它的好资源吗?

Nea*_*alB 20

COBOL只是另一种第三代计算机语言.它只是比大多数人年龄稍大,并不意味着它在某种程度上是不完整的(实际上它带来了相当多的包袱 - 但这是另一个故事).

与任何其他第三代语言一样,COBOL操作数据文件的方式与在C程序中的操作方式非常相似.没什么奇怪的,神秘的或神奇的.使用该语言的文件I/O功能打开,读取,写入和关闭文件.

各种机制用于在实际文件和程序之间形成链接.此处的详细信息通常特定于您正在使用的操作系统.通常,COBOL实现尝试通过逻辑文件名与操作环境隔离,而不是实际名称.当您编写将移植到不同平台的程序时(例如,在Windows平台上的IDE中编写和测试,然后在大型机上运行),这种增加的间接性非常重要.

以下示例与IBM Mainframe环境有关.

在IBM大型机世界中,您会发现程序可以批量运行或联机运行(例如CICS).我不会描述如何在CICS下设置文件I/O(这是一个很长的故事).用于操作文件的程序通常是批处理的.以下是批处理程序如何工作的粗略说明:

  1. 批处理程序通过JCL运行.JCL用于标识要运行的程序('EXEC'语句),并使用'DD'语句识别程序将引用哪些文件.DD语句的功能是在实际文件和COBOL程序在引用文件时引用的名称之间形成逻辑连接(这是前面提到的隔离机制).例如,

    JCLDDNAM DD DSN='HLQ.MY.FILE'...
    
    Run Code Online (Sandbox Code Playgroud)

    将'DD'名称'JCLDDNAM'与名为'HLQ.MY.FILE'的文件相关联.此部分取决于平台,因此详细信息特定于操作环境.

  2. 在COBOL程序的"FILE-CONTROL"部分中,将JCL中定义的"DD NAME"与将在每个I/O语句上使用的名称连接以引用该文件.使用'SELECT'语句定义此连接.
    例如,

    SELECT MYFILE
    ASSIGN JCLDDNAM
    remainder of select
    
    Run Code Online (Sandbox Code Playgroud)

    在"JCL"中与"JCLDDNAM"相关联的任何文件与"稍后将在COBOL I/O语句中引用"的"MYFILE"之间建立连接.该SELECT语句本身是ISO COBOL标准的一部分.但是,许多COBOL实现定义了一些非标准扩展来促进其文件子系统的各种怪癖.

  3. 使用名称"MYFILE"打开,读取,写入,关闭程序"PROCEDURE DIVISION"中的文件,如下所示:

    OPEN MYFILE  
    READ MYFILE  
    CLOSE MYFILE  
    
    Run Code Online (Sandbox Code Playgroud)

以上是高度简化的,在COBOL中有很多方法可以做到这一点.了解完整的图片将需要一些真正的努力,时间和实践.上面说明的I/O语句是COBOL标准的一部分,但每个供应商都有自己的扩展.

IBM COBOL支持各种文件组织和访问方法.您可以在此处查看IBM Enterprise COBOL语言参考手册以获取文件操作的语法和规则.但是," 用户指南"提供了许多用于读取/写入文件的良好示例(您将需要挖掘一些 - 但它是全部为你准备的).

通过COBOL程序引用SQL数据库的设置有些不同,但涉及在程序和数据库子系统之间建立连接.在IBM世界中,这是通过JCL完成的,其他环境将使用不同的机制.

IBM COBOL使用预处理器或协处理器来集成数据库访问和数据交换.例如,以下代码将从DB2数据库中检索一些数据:

MOVE 1234 TO PERSON-ID
EXEC SQL
  SELECT  FIRST_NAME,  LAST_NAME
  INTO   :FIRST-NAME, :LAST-NAME
  FROM PERSON
  WHERE PERSON_ID = :PERSON-ID
END-EXEC
DISPLAY PERSON-ID FIRST-NAME LAST-NAME
Run Code Online (Sandbox Code Playgroud)

EXEC SQL和之间的东西END-EXEC是一个非常简单的SQL select语句.以冒号开头的名称是COBOL主机变量,用于将数据传递给DB2或接收它.如果您曾经编写过数据库访问例程,那么您应该对此非常熟悉.此链接提供了将SQL语句合并到IBM Enterpirse COBOL程序中的简单介绍.

顺便说一句,IBM Enterprise COBOL也能够处理XML文档.对于沉重的IBM倾斜感到抱歉,但这是我最熟悉的环境.

希望这能让你开始朝着正确的方向前进.