2010-03-13 165 views
9

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

回答

20

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 
    

    让任何文件你“JCLDDNAM”你的“JCL”到“MYFILE”,你将在稍后COBOL I/O语句引用相关联之间的连接。 SELECT声明本身是ISO COBOL标准的一部分。然而,许多COBOL实现定义了一些非标准的扩展,以促进各种各样的怪异到他们的文件子系统。

  3. 打开,读,写的“程序分流”的你程序中使用的名称“MYFILE”作为内关闭文件:

    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 SQLEND-EXEC之间的东西是一个非常简单的SQL SELECT语句。以冒号开头的名称是COBOL主机变量,用于将数据传递给DB2或将其接收回来。如果您曾经编写过数据库访问例程,那么您应该看起来非常熟悉。这个link提供了一个简单的介绍,将SQL语句合并到IBM Enterpirse COBOL程序中。

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

希望这能让你开始朝正确的方向发展。

+0

你几乎击中了头部的男人。感谢您花时间写这么多! –

+0

@MC皇帝在进行编辑时,请在提供的框中注明理由。如果更改单词,请确保您正确地执行此操作。 –

+0

@BillWoodger您可以在修订历史中轻松看到。 –

1

传统的COBOL批处理环境使用cobol程序的“数据部分”直接声明数据库连接,然后在JCL中建立数据库连接。由于COBOL早于SQL,这些会倾向于各种其他类型的数据库,但很可能IBM使SQL与DB/2一起工作。我想你会从更接近这个东西的人那里得到另一个答案。如果您查看可用于其他语言的SQL预处理器,您会发现这个想法 - 游标将成为本机数据类型,并将查询结果传递给本机变量。

+0

啊。所以我的理解可能会略有偏差。 COBOL更多的是关于数据的操纵,而对于实际检索数据并没有多大作用。我问这个问题的主要原因是我今年夏天要去实习,而且我没有在那里做cobol,但那是他们用来处理他们的财务数据的,我很困惑你如何将数据转化为cobol处理。尽管谢谢你,我真的很喜欢你的回答! –

+0

@bmargulies:-1:假设IBM –

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和大型机的一部分。如果您有更多关于您在实习中与您合作的应用程序的信息,我可以举出具体的例子。

2

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

我曾经工作过的一家公司,就是这么做的 - 用SQLite。公有领域库的这个小宝石将SQL语句编译为字节码,然后执行它们。

通过用处理Cobol文件的C库的自定义接口替换SQLite的“后端”级别,可以在这种情况下从其他语言(如Python)查询Cobol数据。它工作 - 在SQLite的限制当然,但它是稳定的,它似乎足够关系,它甚至不需要数据库服务器:-)

1

大型机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。数据库接口管理将数据放在正确的位置。

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

+0

我也喜欢你的答案。我现在正在实习的地方现在使用cobol作为他们的大型机资料,并且我已经将它与CICS一起公开,并将它们用于将数据连接到我们的java ee应用程序。 –

相关问题