COBOL DB2程序

时间:2010-08-10 06:07:08

标签: db2 cobol mainframe

如果我有一个COBOL DB2程序正在调用其他2个COBOL DB2子程序,那么它将创建多少个DBRM,包,计划?如果我要更改任何一个子程序,那么我是否需要重新编译并绑定所有程序?我真的很困惑DBRM,计划和包。

此致 玛纳斯

1 个答案:

答案 0 :(得分:6)

哦,我的......这是一个很大的话题 答案将非常简化,因此不完整。

答案在某种程度上取决于您使用的是DB / 2预编译器还是共同编译器。为了这 回答我假设您正在使用预编译器。如果你正在使用共同编译器 原理几乎相同,但机制有点不同。

这里的目标是生成:

  • 来自COBOL源的加载模块
  • DB / 2计划为您的程序提供进入DB / 2数据库的访问路径

介于两者之间的所有内容都支持创建适当的DB / 2计划的机制 让你的程序运行。

力学

每个包含DB / 2语句的程序和/或子程序都需要 由DB / 2预编译器预处理。预编译器 创建DBRM(数据库请求模块)。预编译还通过注释改变您的源程序 输出所有EXEC SQL...END-EXEC语句,并将其替换为对DB / 2子系统的特定调用。 然后使用常规COBOL编译器编译预处理器发出的代码,以生成一个对象模块,然后将其链接到可执行文件中。

预编译生成的DBRM包含所包含的SQL语句的列表 在您的程序中加上DB / 2使用的其他一些信息 将这些特定的SQL语句与您的程序相关联。 DBRM通常写入 永久数据集(通常是PDS)然后输入 DB / 2 Binder所在的具体访问权限 程序中每个SQL语句的路径都编译为DB / 2格式 实际上可以使用。绑定器对DB / 2的作用与编译器对COBOL的作用大致相同。 可以将DBRM视为源代码,将Binder视为编译器。

绑定DBRM时生成的访问路径信息 需要存储在某处,以便可以定位和使用它 当你的程序调用DB / 2时。

粘合剂输出的位置?您可以选择将其绑定到包中或直接绑定到计划中。

最短路径是将一组DBRM直接绑定到计划中。 然而,与许多捷径一样,这可能不是 最有效的事情(我稍后会谈到原因)。

大多数大型系统不会将DBRM直接绑定到计划中,它们将绑定到一个包中。界限 包存储在DB / 2子系统中(与计划相同)。什么是包裹? 包是绑定的 DBRM。另一方面,计划通常包含计划 多个DBRM的访问路径。

现在我们有一组Packages,每个Package包含到其各自DBRM的SQL访问路径 是从一个给定的 程序。我们需要从这些方面构建一个计划。要做到这一点,一组绑定卡 通常由您的数据库管理员创建。绑定卡只是一种“源代码” 到DB / 2 Binder(它们不是打孔卡)。 绑定卡定义了哪些包形式 给定的计划。然后将这些内容提交给Binder,后者将它们组合成一个计划。注意: 您可能还会听到提及集合,这些只是具有的包的分组 由您的DBA定义。

总而言之,我们有以下过程:

     Program -> (Pre-Compiler) -> Modified Program -> (COBOL compiler) -> Object -> (Link) -> Load Module 
                               -> DBRM -> (DB/2 Bind) -> Package

     Bind Cards -> (DB/2 Bind) -> DB/2 Plan
     Package(s) ->

这里的两个基本输出是加载模块(可执行的COBOL程序)和DB / 2计划。该程序 和计划在您的JCL中汇集在一起​​,您必须在EXEC声明中的某处给出计划名称 以及要运行的程序。

通过这个简短而高度简化的背景,让我们试着回答你的问题:

如何创建DBRM?

每个程序包含SQL EXEC个语句的DBRM

创建了多少个包?

包由一个DBRM构成。源程序和包之间存在1:1的对应关系

创建了多少个计划?

任何给定的包可能包含在多个集合和/或多个绑定卡集中。这个 意味着给定的包可能包含在多个计划中。

如果我更改受影响的程序?

如果将DBRM直接绑定到计划中,则必须重新绑定使用的每个计划 那个DBRM。这可能是一个非常耗时且容易出错的主张。

但是,如果将DBRM绑定到Package中,则只需重新绑定该Package。 由于Program和Package之间存在1:1的对应关系,因此只有一个绑定 需要做。计划需要反弹的唯一时间是包裹或收藏 在定义它的绑定卡集中添加或删除。

使用包的优点应该从上面清楚,这就是大多数人的原因 商店不会将DBRM直接绑定到计划中,而是使用包。