我开始学习COBOL。我有一些编写处理 SQL 数据库的程序的经验,我想我对 COBOL 如何存储和检索存储在大型机中的数据感到困惑。我知道它不像关系数据库,但我见过的每个示例程序都直接从命令行获取数据,而且我知道现实世界的 COBOL 程序不是这样处理数据的。有人可以解释或向我展示一个可以解释它的好资源吗?
5 回答
COBOL 只是另一种第三代计算机语言。它只是比大多数人稍老一点,这并不意味着它不完整(实际上它带有相当多的包袱——但那是另一回事了)。
与任何其他第三代语言一样,COBOL 操作数据文件的方式与您在 C 程序中的操作方式几乎相同。它没有什么奇怪、神秘或神奇的地方。使用该语言的文件 I/O 功能打开、读取、写入和关闭文件。
使用各种机制来形成实际文件和程序之间的链接。此处的详细信息通常特定于您正在使用的操作系统。通常,COBOL 实现尝试通过逻辑文件名而不是实际名称将自己与操作环境隔离。当您编写将被移植到不同平台的程序时(例如,在 Windows 平台上的 IDE 中编写和测试,然后在大型机上运行),这种附加的间接性非常重要。
以下示例与 IBM 大型机环境有关。
在 IBM 大型机世界中,您会发现程序以批处理或在线方式运行(例如 CICS)。我不会描述如何在 CICS 下设置文件 I/O(说来话长)。用于操作文件的程序通常是批处理的。以下是批处理程序如何工作的粗略说明:
批处理程序通过 JCL 运行。JCL 用于识别要运行的程序('EXEC' 语句)并使用'DD' 语句识别您的程序将引用哪些文件。DD 语句的功能是在实际文件和您的 COBOL 程序想要引用该文件时将引用的名称之间形成逻辑连接(这是前面提到的隔离机制)。例如,
JCLDDNAM DD DSN='HLQ.MY.FILE'...
会将“DD”名称“JCLDDNAM”与名为“HLQ.MY.FILE”的文件相关联。这部分是平台相关的,所以细节是特定于操作环境的。
在 COBOL 程序的“文件控制”部分中,将 JCL 中定义的“DD NAME”与您将在每个 I/O 语句中使用的名称连接起来以引用该文件。此连接是使用“SELECT”语句定义的。
例如,SELECT MYFILE ASSIGN JCLDDNAM remainder of select
在“JCL”中与“JCLDDNAM”关联的任何文件与“MYFILE”之间建立连接,您稍后将在 COBOL I/O 语句中引用该文件。该
SELECT
声明本身是 ISO COBOL 标准的一部分。但是,许多 COBOL 实现定义了一些非标准扩展,以促进对其文件子系统的各种怪癖。使用名称“MYFILE”在您的程序的“PROCEDURE DIVISION”中打开、读取、写入、关闭文件,如下所示:
OPEN MYFILE READ MYFILE CLOSE MYFILE
以上是高度简化的,在 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
EXEC SQL
和之间的东西END-EXEC
是一个非常简单的 SQL 选择语句。以冒号开头的名称是 COBOL 主机变量,用于将数据传递给 DB2 或将其接收回来。如果您在此之前编写过数据库访问例程,那么您应该会非常熟悉。此链接简单介绍了将 SQL 语句合并到 IBM Enterprise COBOL 程序中。
顺便说一下,IBM Enterprise COBOL 也能够处理 XML 文档。抱歉,IBM 偏重,但那是我最熟悉的环境。
希望这能让你朝着正确的方向开始。
谁说你不能使用 SQL 从 cobol 应用程序中检索数据,也许不花钱?
我曾经工作过的一家公司就是这样做的——使用 SQLite。这个公共领域库的小宝石将 SQL 语句编译为字节码,然后执行它们。
通过将 SQLite 的“后端”级别替换为处理 Cobol 文件的 C 库的自定义接口,可以从其他语言(在这种情况下为 Python)查询 Cobol 数据。它起作用了——当然在 SQLite 的范围内,但它很稳定,看起来足够相关,甚至不需要数据库服务器 :-)
传统的 COBOL 批处理环境使用 cobol 程序的“数据部分”来直接声明数据库连接,这些连接又在 JCL 中设置。由于 COBOL 早于 SQL,因此它们往往是各种其他类型的数据库,但 IBM 很可能使 SQL 与 DB/2 一起工作。我想你会从更接近这些东西的人那里得到另一个答案。如果您查看可用于其他语言的 SQL 预处理器,您就会明白 — 游标成为本机数据类型并将查询结果传递给本机变量。
Mainframe Cobol 使用嵌入式 SQL(有点像 SQLj),例如:
程序司。
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 是与基于字符的数据输入屏幕相连接的“演示级”软件。将 CICS 视为 PHP 或 ASP.NET 的功能等价物。
今天有更多的选项可以将数据导入 DB2。CICS 仍然是一个选项,但您的“表示层”可以是 PHP、ASP.NET、Win Forms、Java JSF、Powerbuilder。关键是您的开发平台需要能够使用 DB2 数据库驱动程序。该平台可以是 Windows、Linux,也可能是其他平台。
我的观点是,数据可以从许多平台以多种方式进入大型机 DB2 数据库。COBOL 语言可能涉及数据输入、报告、更改数据 COBOL 等。但它可能只是多层应用程序的一部分,可能是 Windows、Web 和大型机的一部分。如果您有更多关于您将在实习期间使用的应用程序的信息,我可以举出具体的例子。