我开始了解COBOL。我有一些编写处理SQL数据库的程序的经验,我想我很困惑COBOL如何存储和检索存储在大型机中的数据。我知道它不像关系数据库,但我见过的每个示例程序都直接从命令行获取数据,我知道现实世界的COBOL程序不是如何处理数据的。有人可以解释或向我展示一个可以解释它的好资源吗?
答案 0 :(得分:20)
COBOL只是另一种第三代计算机语言。它只是比大多数人年龄稍大,并不意味着它在某种程度上是不完整的(实际上它带来了相当多的包袱 - 但这是另一个故事)。
与任何其他第三代语言一样,COBOL操作数据文件的方式与在C程序中的操作方式非常相似。没什么奇怪的,神秘的或神奇的。使用该语言的文件I / O功能打开,读取,写入和关闭文件。
使用各种机制在实际文件和程序之间形成链接。此处的详细信息通常特定于您正在使用的操作系统。通常,COBOL实现尝试通过逻辑文件名而不是实际名称将自己与操作环境隔离开来。当您编写将移植到不同平台的程序时(例如,在Windows平台上的IDE中编写和测试,然后在大型机上运行),这种增加的间接性非常重要。
以下示例与IBM Mainframe环境有关。
在IBM大型机领域,您会发现程序可以批量运行或联机运行(例如CICS)。我不会描述如何在CICS下设置文件I / O(这是一个很长的故事)。用于操作文件的程序通常是批处理的。以下是批处理程序如何工作的粗略说明:
批处理程序通过JCL运行。 JCL用于标识要运行的程序('EXEC'语句),并使用'DD'语句识别程序将引用哪些文件。 DD语句的功能是在实际文件和COBOL程序在引用文件时引用的名称之间形成逻辑连接(这是前面提到的隔离机制)。例如,
JCLDDNAM DD DSN='HLQ.MY.FILE'...
会将'DD'名称'JCLDDNAM'与名为'HLQ.MY.FILE'的文件相关联。此部分取决于平台,因此详细信息特定于操作环境。
在COBOL程序的“FILE-CONTROL”部分中,将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语言参考手册here以获取文件操作的语法和规则。但是,User Guide提供了许多用于读/写文件的好例子(您将不得不挖掘一点 - 但它都是为你准备的。)
通过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 select语句。以冒号开头的名称是COBOL主机变量,用于将数据传递给DB2或接收它。如果您曾经编写过数据库访问例程,那么您应该对此非常熟悉。这个link提供了将SQL语句合并到IBM Enterpirse COBOL程序中的简单介绍。
顺便说一句,IBM Enterprise COBOL也能够处理XML文档。对不起IBM倾斜,但这是我最熟悉的环境。
希望这能让你开始朝着正确的方向前进。
答案 1 :(得分:2)
谁说你不能使用SQL从cobol应用程序中检索数据,也许不花钱?
我曾经为之工作的公司,就是这样做 - 使用SQLite。这个公共域库的小宝石将SQL语句编译为字节码,然后执行它们。
通过将SQLite的“后端”级别替换为处理Cobol文件的C库的自定义接口,可以在这种情况下从其他语言(Python)查询Cobol数据。它工作 - 当然在SQLite的范围内,但它是稳定的,它似乎足够关系,它甚至不需要数据库服务器: - )
答案 2 :(得分:1)
传统的COBOL批处理环境使用cobol程序的“数据部分”来直接声明数据库连接,这些连接又在JCL中设置。由于COBOL早于SQL,因此它们往往是各种其他类型的数据库,但IBM很可能使SQL与DB / 2一起工作。我想你会从更接近这个东西的人那里得到另一个答案。如果你看一下可用于其他语言的SQL预处理器,你就会明白这一点 - 游标变成了一个本机数据类型,并将查询结果提供给本机变量。
答案 3 :(得分:1)
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在工作存储部分中定义。数据库接口管理在正确的位置获取数据。
实际上与分布式的东西相比非常容易。
答案 4 :(得分:0)
我所工作的所有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和大型机的一部分。如果您有关于将在实习期间使用的应用程序的更多信息,我可以给出具体示例。