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

有帮助吗?

解决方案

COBOL 只是另一种第三代计算机语言。它只是比大多数版本旧一点,但这并不意味着它在某种程度上不完整(实际上它带有相当多的包袱 - 但那是另一个故事)。

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

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

以下示例与 IBM 大型机环境相关。

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

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

    JCLDDNAM DD DSN='HLQ.MY.FILE'...
    

    会将“DD”名称“JCLDDNAM”关联到名为“HLQ.MY.FILE”的文件。这部分与平台相关,因此详细信息特定于操作环境。

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

    SELECT MYFILE
    ASSIGN JCLDDNAM
    remainder of select
    

    在“JCL”中与“JCLDDNAM”关联的任何文件与稍后将在 COBOL I/O 语句中引用的“MYFILE”之间建立连接。这 SELECT 声明本身是 ISO COBOL 标准的一部分。然而,许多 COBOL 实现定义了一些非标准扩展,以方便其文件子系统的各种怪癖。

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

    OPEN MYFILE  
    READ MYFILE  
    CLOSE MYFILE  
    

上面的内容已经高度简化,并且在 COBOL 内有多种方法可以实现这一点。理解完整的图景需要一些真正的努力、时间和练习。上面所示的 I/O 语句是 COBOL 标准的一部分,但每个供应商都有自己的扩展。

IBM COBOL 支持广泛的文件组织和访问方法。您可以查看 IBM Enterprise COBOL Language Reference 手册 这里 获取文件操作的语法和规则,但是 用户指南 提供了很多读/写文件的好例子(你需要深入挖掘——但它已经为你准备好了)。

通过 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

之间的东西 EXEC SQLEND-EXEC 是一个非常简单的 SQL select 语句。前面带有冒号的名称是 COBOL 主变量,用于将数据传递到 DB2 或接收回来。如果您之前曾经编写过数据库访问例程,那么您应该对此非常熟悉。这 关联 提供了将 SQL 语句合并到 IBM Enterprise COBOL 程序中的简单介绍。

顺便说一句,IBM Enterprise COBOL 也能够处理 XML 文档。抱歉,我对 IBM 的偏见很重,但那是我最熟悉的环境。

希望这能让您朝着正确的方向开始。

其他提示

谁说你不能使用SQL从COBOL应用程序检索数据,也许不花钱?

我曾经工作的公司,就是这样做的 - 使用SQLite。这是一个公共领域图书馆的小宝石编译SQL语句的字节码,然后执行它们。

通过与自定义接口的C库使用COBOL文件涉及取代的SQLite的“后端”电平,它是可以从其他语言查询COBOL数据,Python的在这种情况下。它的工作 - 当然的SQLite的范围内,但它是稳定的,这似乎不够的关系,它甚至没有要求DB服务器: - )

传统COBOL批处理环境使用COBOL程序的“数据部分”直接声明数据库连接,它们依次设置在JCL。由于COBOL早SQL,那些本来往往是各种其他类型的数据库,但很可能是IBM制造的SQL工作,DB / 2。我想你会从别人接近这个东西得到另一个答案。如果你看一下SQL预处理器可与其他语言的使用,你会明白我的意思 - 光标变成一个本地数据类型和查询结果提供给本地变量

大型机的Cobol使用嵌入式SQL(有点像SQLJ),e.g:

步骤司

   Exec SQL
        Select col1, col2
          from myTable
        into :ws-col1, :ws-col2
        where col0 = :col0
   End-Exec

在这种情况下,主机变量WS-COL0,WS-col1和WS-COL2在工作存储部分中所定义。数据库接口管理得到在正确的位置的数据。

很容易相比实际上是分布式的东西。

所有IBM大型机店的我在已经使用COBOL与关系数据库谈过合作。普遍认为,一直是IBM的DB2。请注意,DB2是在大型机上运行的关系数据库。它也可以在Windows或Linux上运行。

二十年前,一个占主导地位的方式,将数据输入到DB2数据库主机是使用CICS。 CICS是“表现层”的软件与基于字符的数据输入屏幕comminicates。考虑CICS PHP或ASP.NET的功能equivelant。

今天,有更多的选择来获取数据到DB2中。 CICS仍然是一种选择,但你的“表现层”可能是PHP,ASP.NET,WIN形式,爪哇JSF时,PowerBuilder。关键的一点是,你的开发平台将需要能够与DB2数据库驱动程序工作。该平台可在Windows,Linux,以及其它可能的。

我的观点是,数据可以进入主机DB2数据库在许多平台的许多方面。在COBOL语言可能参与了数据录入,报表,数据改变COBOL等,但它可能只是一个多层次的应用程序,可能是一部分的Windows,Web和主机的一部分。我可以给出具体的例子,如果你有关于你会在你的实习合作的应用程序的更多信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top