我看到您的信息中心链接转到LUW 9.7,并且您提到您已使用Java进行编程,但是我在绑定方面的大部分经验是在大型机上使用COBOL的DB2。因此,您可能需要稍微修改一下说明(但通常,概念应该相同)。
我认为绑定仅在编译包含预编译的嵌入式SQL(静态绑定的SQL)的程序时才有意义。例如,如果您使用的是JDBC,则不需要运行BIND。JDBC驱动程序将PREPARE
动态地执行该语句。
当您通过DB2预编译器PRECOMPILE
运行程序时,在您的程序中运行时,如果发现任何嵌入式SQL(在COBOL中,这些是从EXEC SQL
到的语句块END-EXEC.
),它将仔细地将SQL提取出来,并用。调用COBOL-DB2接口。此后,有两个输出PRECOMPILE
,,COBOL源已删除了所有嵌入式SQL(A
从现在开始),以及一个DBRM
包含已删除的所有SQL 的COBOL源(B
)。
Precompile会进行一些基本的语法检查,但请注意,检查仅基于程序中的表声明。它没有附加到DB2上以进行验证!
这两个文件是完全分开的,当您运行COBOL程序时,它必须找到同时生成的A
和B
。
此时,已将A
其编译并与标准COBOL编译器链接到中,load module
并放置在装入库中,以备后用。
但是,B
DBRM 仍有许多工作要做。这就是BIND
进来的地方。 BIND
有点像嵌入式SQL代码的编译器,“ compile”的输出是package
。
为了将SQL绑定到可执行的“程序包”中,BIND进程附加到DB2并执行一些操作:
- 验证当前的AuthID被授权执行绑定。
- 在DB2目录中的数据的帮助下,检查SQL的语法。
- 最后,最重要的是,绑定将优化您的SQL
在最后一步中,所有SQL均通过优化器运行,该优化器考虑了所有统计信息以及DB2引擎可用于获取数据的各种路径。然后,它选择与之关联的成本最低的路径(对于较新版本的DB2 [DB2 10 for z / OS],它可能会决定采用“较高成本”但“较低风险”的路径)。选择路径后,它将被编译并成为一个程序包,该程序包存储在目录中(您可以使用SELECT * FROM SYSIBM.SYSPACKAGE
(z / OS)查看所有当前程序包)。
最后,还有最后一块允许我们的程序与它们的程序包重新结合PLAN
。通过执行另一个BIND(BIND PLAN
)创建计划。计划是程序允许查看以查找具有相同名称的程序包的程序包的集合。使用COBOL,您可以指定程序应在JCL中搜索的计划。
简而言之,编译后的代码将通过以下步骤来生成可用的代码BIND PLAN
:
预编译->创建一个DBRM(使用C [++],预编译器将预编译的SQL输出到HFS文件,该文件可以通过命令行绑定程序发送)->优化DBRM并设置一组访问路径(package
创建一个)->将该软件包添加到BIND PLAN
,这是一组软件包,可让您创建“搜索路径”以供程序浏览。
由于这些程序是静态绑定的,因此如果您的表统计信息发生了巨大变化,那么优化器在绑定时选择的访问路径可能不再是最佳路径,重新绑定将使它可以重新评估SQL并选择一个更好的路径。
编辑(更新注释):如果使用命令行处理器,则可以传入单个绑定包(.bnd
)或绑定文件名列表(.lst
)。如果您输入一个列表,则文件名必须以开头@
(例如/path/to/@packages.lst
)。在.lst文件中,您可以将每个程序包放在单独的行上,也可以使用以下命令将它们分开+
:
package1.bnd
package2.bnd
package3.bnd+package4.bnd+package5.bnd