如果我有一个COBOL DB2程序正在调用其他2个COBOL DB2子程序,那么它将创建多少个DBRM,包,计划?如果我要更改任何一个子程序,那么我是否需要重新编译并绑定所有程序?我真的很困惑DBRM,计划和包。
此致 玛纳斯
答案 0 :(得分:6)
哦,我的......这是一个很大的话题 答案将非常简化,因此不完整。
答案在某种程度上取决于您使用的是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直接绑定到计划中,而是使用包。