如果DB2应用程序包含SQL语句,就需要对DB2应用程序进行预编译或者使用编译器提供的SQl语句协处理器。任何一种形式的SQl语句处理器都做下面的事情:
1)取代源程序中的SQL语句为DB2语言接口模块的调用语句;
2)创建数据库请求模块(Database Request Module,DBRM),在绑定期间,这个模块将发送SQL请求到DB2系统进行通信。
DBRM必须被绑定到一个PLAN或者PACKAGE,包含SQL语句的应用程序才能够运行。以下是几个与应用程序密切相关的概念:
1、DBRM:DB2预编译程序创建的,包含了应用程序中SQL语句的信息,用于BIND处理。
2、PACKAGE:一个包含了一组被静态捆绑的SQL语句的object。
3、PACKAGE LIST:一个按一定规则命名的package集合,可扩充为一个plan。
4、PLAN:在BIND处理中产生的控制结构,是DBRM和PACKAGE的综合,应用程序执行时被调用。
5、BIND:是将DB2预编译的输出转变为可控制结构(一个package或application plan)的一种处理方式,通过这种处理选择存取数据的路径和执行某种权限的核对。
6、REBIND:当某种改动影响到PACKAGE但不会改变程序中的SQL语句时,需要对APPLICATION PACKAGE做一次REBIND。
一、应用程序准备:
下图说明了应用程序的准备过程。
1、预编译:
由于SQL语句不被大多数编译器所识别,所以在对程序进行编译之前,必须使用DB2预编译器对程序进行处理。预编译的主要输出是数据库请求模块(DBRM)。一个DBRM是一个包含SQL语句和宿主变量信息的数据集,这些信息都是在程序编译期间从源程序中解析出来的。DBRM的目的是通过绑定操作,让SQL请求和DB2之间进行通信。
2、绑定:
必须使用BIND将DBRM绑定到一个PLAN或者PACKAGE,DB2应用程序才可以运行。当程序运行的时候,DB2使用一个时间戳来验证这个程序是否匹配了正确的PLAN或者PACKAGE。
关于PLAN的概念,需要仔细理解!一个PLAN可能包含DBRM或者PACKAGE的集合,或者两者都有。即一个PLAN一定包含至少一个PACKAGE或者一个直接绑定的DBRM。每个PACKAGE可以包含且仅可以包含一个DBRM。之前在定义中提到过,一个PACKAGE字面意思是一个包,但它只能包含一个DBRM,它是一个包含了一组被静态捆绑的SQL语句的object。
另一个概念是COLLECTION。COLLECTION是一组相关的PACKAGE。绑定PACKAGE到PACKAGE允许用户增加PACKAGE到一个已经存在的应用PLAN,而无需再次绑定整个PLAN。当用户BIND一个PLAN的时候,如果在PACKAGE列表中包含一个COLLECTION,那么COLLECTION中的任何PACKAGE对PLAN都是可用的。当第一次绑定PLAN的时候,整个COLLECTION甚至可以是空的。所以,只要在第一次将COLLECTION绑定到PLAN上之后,后续只要不增加或删除COLLECTION,就无须再次绑定PLAN,直接增加PACKAGE到COLLECTION就可以了,并且可以对COLLETION中已经存在PACKAGE进行替换或删除。
3、编译,连接编辑:
为了使应用程序能够与DB2系统进行交互,必须使用连接编辑(link-edit)过程来建立一个可执行的LOAD MODULE来满足环境(如CICS、IMS、TSO或者batch)的要求。LOAD MODULE是一个装载入内存中的可执行程序单位。
4、运行:
为了使应用程序运行,有许多方法可以使用,如下:
1) 使用DB2交互面板(DB2I)。
2) 在TSO前台或后台以批量的方式提交一个应用。
3) 在TSO前台或者以批量的方式启动一个程序预处理命令列表(CLIST)。
4) 使用DSN命令解释器。
5) 在DB2安装时,使用包含在系统数据集(例如SYS1.PROCLIB)中的JCL过程。
二、相关系统表介绍:
DB2 由12个表空间和63个数据表组成,这些表是DB2的数据字典,记载有DB2的对象(STOGROUPS、DATABASE、TABLESPACES、PORTITIONS、TABLES、VIEWS、INDEXS、KEY等等)、安全性、实用程序、分布计算、环境等信息。DB2进行如建表、建视图、建索引等操作的时候,都会把信息计入DB2编目里。
这里重点关注与BIND、PLAN、PACKAGE等相关的SYSIBM表:
SYSIBM.SYSPLAN:存放每个PLAN的相关信息
SYSIBM.SYSPACKAGE:存放每个PACKAGE的相关信息
SYSIBM.SYSPACKLIST:每个PLAN相关的每个PACKAGE LIST(COLLECTION)有一条或多条记录
SYSIBM.SYSSTMT:DBRM绑定到Plan时,所有的SQL被放在该表中
SYSIBM.SYSPACKSTMT:DBRM绑定到Package时,所有的SQL被放到这个表中,每个PACKAGE中的每条SQL语句有一条记录
三、JCL中的BIND处理语句:
(1)、将DBRM直接绑定到PLAN中:
BIND PLAN(PLAN_NAME) MEMBER(DBRM1,DBRM2,DBRM3……)
该方式在程序维护时,需要重新BIND REPLACE所有的DBRMS到PLAN中
(2)、将DBRM包含到PACKAGE:
BIND PACKAGE(Collection_id) MEMBER(Package_id)
Package_id为输入的DBRM的名字,Collection_id为pacakge集合的名字,是在第一次BIND Package时建立的,以后就可以直接使用了
(3)、将PackageList绑定到PLAN中:
BIND PLAN(plan_name) PKLIST(coll1.dbrm1,coll2.*)
在PKLIST中既可使用*通配符来代替一个colletion中所有的package,也可以使用具体的名字dbrm1来指定某个member。coll1、coll2为集合的名称。
当执行(3)将PACKAGELIST绑定到PLAN中之后,后续的DBRM只需要包含到PACKAGE中并绑定到COLLECTION中就可以了,(3)无须每次都执行。