第一步、预编译
源程序生成以后,在源程序中嵌入了许多SQL语句,而SQL语句是宿主语言编译器所不认识的,所以在用宿主语言编译器进行编译、连接之前必须将SQL语句分离出来,这就是预编译所做的工作 。DB2中预编译操作是通过PREP命令执行的,PREP命令首先将源程序中的所有有关SQL语句全部注释起来,对它进行分析和语法检查 。如果源程序中的SQL语句全部书写正确,则将这些SQL语句转换成C语言可以识别的一系列的API函数 。这些函数可以在函数执行时访问数据库,然后将源文件中所有用于生成数据库管理器的PACKAGE的数据提出组合成一个BIND文件 。也可以直接生成一个PACKAGE,但这相当于在预编译后又执行了一次BIND操作 。在预编译时,对整个源程序文件中的所有变量做统一处理而不根据变量的生命期来处理,所以宿宿主变量在整个程序中是唯一的 。下面讲解预编译的步骤:
1)、连接到一个数据库,该操作是为BIND做准备 。操作如下:
db2 connect to cicstest
2)、执行预编译命令,假设源文件为adhoc.sqc,则:
db2 prep adhoc.sqc bindfile
下面我们对预编译的几种输出文件进行讨论 。
l预编译后生成的C语言源文件:该文件中原有的SQL语句,已经全部加上注释并转换成了C语言可以识别的API调用 。
lBIND文件:如果在预编译时使用BINDFILE选项,则生成BIND文件,BIND文件的后缀为.bnd,BIND文件可以在将来使用BIND命令来生成PACKAGE 。
db2 bind adhoc.bnd
如果在预编译时,只生成BIND文件,那么即使在预编译时,不能访问某些数据库对象,系统也只是报警,而不会报错 。如果使用PACKAGE选项,则生成PACKAGE 。如果有MESSAGE选项,则生成信息文件,它包含了所有的返回信息,如:警报、错误等 。它便于程序员对源程序做进一步的修改 。
第二步、编译和连接
在预编译后,程序中只有C语言语句,它们都可以为C语言的编译器所识别 。所以,可以按照一般的方法进行编译和连接,但在将SQL语句转换以后,在C语言程序中,又引入了许多一般的C语言系统所没有的INCLUDE文件和函数库,这些均在DB2的SDK中 。所以,要生成可执行的程序,就必须安装DB2的SDK,并且做以下设置:
set INCLUDE=$(DB2PATH)include;%include%
set LIB=$(DB2PATH)lib;%LIB%
下面是编译和连接:
cl -o adhoc.exe adhoc.c
生成的可执行文件必须与数据库管理器中的PACKAGE相结合,才能执行 。
下面对BIND做进一步解释 。
PACKAGE是DB2为SQL语句制定的访问计划 。通过precompile之后,源程序中的SQL语句部分就被分离出来 。PACKAGE就是根据具体的SQL语句和数据库中的信息生成的针对每条SQL语句的访问计划,它存放在DB2数据库服务器上 。应用程序执行到SQL语句时,就到相应的服务器上去找它们的PACKAGE,数据库服务器根据PACKAGE执行具体的数据库操作 。所以,如果一个应用程序访问了多个数据库服务器,则该应用程序应在它访问到的数据库服务器上均生成相应的PACKAGE 。因此,当遇到这种情况时,推荐的方式是将源程序分成若干个文件,每个文件只访问一个服务器,然后分别进行预编译 。
执行PREP命令时,加上选项PACKAGE或不注明BINDFILE、SYNTAX或SQLFLAG选项,这时BIND操作将自动进行 。
直接使用BIND命令从BIND文件中生成PACKAGE存放在数据库管理器中 。BIND完成的功能是,从数据库中找到SQL语句所涉及的表,查看SQL语句中提到的表名及属性是否与数据库中的表名和属性相匹配,以及应用程序开发者是否有权限查询或修改应用程序中所涉及到的表及属性 。这就是为什么在预编译之前要连接到相应的数据库上的原因 。在做BIND操作后,在数据库管理器中就生成一个PACKAGE,PACKAGE的名字与源程序的文件名字相同 。
推荐阅读
- 坚果pro2哪个版本值得买?坚果pro2各版本有什么区别?
- F4版与D2版相比有何特点
- 坚果Pro 2有几个版本?坚果Pro 2各版本价格多少?
- 墨者写作中查看历史版本具体操作步骤
- 完全版 ESQL/C资料三
- kha苹果是什么版本
- 荒野乱斗九游版激活码在哪
- HTC U11国行版系统更新了什么?HTC U11国行版系统更新内容
- 小米MIX2黑色陶瓷版和全陶瓷尊享版哪个好?哪个更划算?
- 增补版 SCO UNIX快速入门