DB2数据库对象基础知识.docx
DB2数据库对象根本数据庠对象数据库对四是一个数据库的构造块(bui1.dingb1.ock).DB2提供了不同类型的数据库刻象来存储和表示不同信息,通过使用数据定义语言(DP1.),可以创立、修改和删除数据库对象,要操纵数据库对象,可以使用数据操纵语言(DM1.),例如SE1.ECT,UPDATE,INSERT和SE1.ECT语句.常用的数据库对象有:表用户定义数据类里约束视图索引除了Fami1.yFUndaKnIaIS教程里介绍的一些数据库对象外.还有一线其他的时象,很多开发人员在开发DB2陶川程序时会发现这些对象比较有用.本节我们将介绍这些对象.在继续之前,有一点要注;fi:在下面看到的一些例子中,对象名称是以小写形式指定的。无论DB2在巩个平台上运行,它总是以大写形式存储名称,除非标识符的名称以双引号*,*)括起来了。例如,下面的语句创立一个名为emp1.oyee小写的表.该表的列定义与表EMP1.OYEE(大写)是一样的,CREATETAB1.E*emp1.oyee*1.IKEemp1.oyee则名别名(a1.ias)是指一个已有的表、视图的另一个名称,也叫呢称(nickname),别名也可以作为另一个别名的昵称.与这些对象一样,别名也可以被创立或捌除可以有与之相关的注糅.下面是CREATEA1.1.S语句的一些例子:CREATEA1.IASa1.iastabiFORtabi:CREATEA1.IASbob.a1.iastabiFORto>.tabi;CREATESYM(WYMbob.a1.ias1.ab2FORbob.a1.iastabi;可以看到,CREATEA1.IAS语句比较简单。可以在源对象所在的同一模式中创立别名(如笫1行),或者也可以全限定别名(如第2行)。为了与DB2forZSerieS兼容,使用关键字SYNSiYM代普A1.IAS也是合法的(如第3行使用别名时无JE专门的授权或权限,不过,需要获得与别名所引用的底层时象相关的授权。美于数据库对象权限的完整清单,请参考DB2DBA认证教程ServerInUniIKCInCn1.(请参阅参考资料.前面已提到,我们也可以为昵称创立别名.昵称是引用位于联邦系统上的数据表或视图的数据库对望.联邦数据库支持超出了本教程的范围.在本教程系列的笫2局部,Datananipu1.ation.我的将学习更多有关联邦系统的知识.要为别名添加注释,可以发出以下语句:COMMEVrONa1.iastabiIS'Myfirsta1.iasontab要捌除一个别名,使用DRoP语旬,这与所有其他数犯库对象是样的:DROPA1.IASa1.iastabi序列对象序列(sequence)是一种数据库对象,这种对立允许自动生成值.序列对飘与标识列(identityco1.umn)不同.标识列是要与一个特定的表绑在一起的,而序列是一种全局的、独立的对象,同一个数犯库中的任何表拙可以使用它。标识列是序列对弦的一种特例.因此.标识列的特征也适用于序列对象.下面就例择了-条CREATESEQ1.iENCE谙句:CREATESEQUENCEyseqSINTEGERSTARTWIIII360INCREMENTBY10NOMAXVA1.UECYC1CACHE20任何包括0在内的数字数据类型都可用于序列值.这些类型包括SM1U.1.INT.INTEGER,BIGINT或DECIMA1.基于这些数据类型的任何用户定义独特类型(distincttype)也都可以用于序列值,这进一步扩展了用户定义独特类里在应用程序中的使用,如上面的例子所示,您可以为序列对阪指定起始值,从而自定义序列对象.在这个例子中,序列的第一个值是360.后续值的生成是由MCREYENTBY子句控制的,这里还支持正、负常fit以产生升序和降序(ft缺省情况下,一个序列所生成的最小值和球大值是由该序列数据类鞭的取值范恸来界定的,例如,INTEGER类型的序列值必须处在-2,147,483.647到2.147.483.647之间的范围内.在DB2SQ1.ReferenceGuide中可以找到所有数字数据类型的取值范围.为了改变这种缺省行为,可以使用MIXVA1.1.1E和MAXVAUJE选项来为生成的伯设过一个边界。如果到达了母小值或爆大值,加么可以使用另一个选JS,即CYC1.E或NOCVC1.E来设定序列伯是否应该循环。注意,如果CXC1.E生效,则序列就可以生成重处的值。CACHE选项允许DB2拘一些预先分配好空间的值保存在内存中,以提高性能.CACHE20是缺省的行为.关于这个选项有一点要i堇记:如果在所有缓存的值鼓使用之前关闭DB2.僚么任何缓存的值和未使用的值都符被丢弃.当DB2重新启动时,又会生成和缓存下一块的伯.从而造成值之间的不连续,即值之间存在间隔.如果应用程序不允许伯之间有间隔,可以考虑使用NOCACHE选项,如果没有使用缓存.则性能就会下降,因为要频繁地生成序列数字.短当生成个新值的时候,都会写下一条H志记录.因此,更高效的做法是根据请求来狭取值.并将这些值援存在内存中.通过A1.TERSEMiENCE语句,可以更改序列对象的特征,除了序列值的数据类型以外,上面所讨论的所有的设置都可以蟋改.要获得完整的谙法,请参考DB2SQ1.ReferenceGuide(请参阅参考资料).删除一个序列对象与删除任何其他的数据库对象是一样的,不同之处是这里还要使用到一个RESTKICT关键字。这样Ur以防止在有依赖的情况下捌除序列。DROPSEQVENCEmyseqRESTRICT生成和茨取序列值序列是一种数据库对象,因此时序列的访问也是由权限来控制的,决省情况下,只有序列的创立者,即SYSAMI和DBADM拥有该对象的USAGE权限.如果希望其他用户也能膨使FM序列,则得要使用卜面的语句:GRANTUSAGEONSEQUENCEseq_objecta三eTOPUB1.IC有两种非达式可用于生成和换取序列(ft,NEXTVAI.I-ORSeq-name用于获取下一个序列值,而PREYVA1.FORSgFame则用于获取上一个生成的序列值,下面的例子例徉了这些表达式的使用,INSERTINTOt1.V1.1ES(NEXTVA1.FORayseq,BOB,);INSERTINTOUVA1.UES(NEXTVA1.FORayseq.,PAT,);COMMIT;INSERTINTOt1.VA1.fES(NEXTVA1.FORByseq1'GENE'):RO1.1.BACK;INSERTINTOt1.VA1.UESNEXTVA1.FORayseq,'PAU1.');VA1.UESPREWA1.FORmyseqINTO:h。S1.Yar假设我们以一个空表t1.开始,myseq的下一个序列值是k如果禁用了autocorait,则在执行上述语句之后,U将包含下面几行:1NAME1BOB2PATIPAU1.3record(三)se1.ected.虽然为CENE生成的(ft被回滚了,但是DB2并没有再次使用它.因而,下一个为PAU1.生成的序列值就是4,而不是3。这个例f中的最后一条语句展示了如何使用PREwA1.表达式.宿主变fit:hostvar存储当前会话中生成的最后一个伯.如果想保存前面生成的值,那么应该在生成下一个但之前保存PHEVVAI.ft.,时表顾名思义,他时表(temporarytab1.e)不是永久性的数据库对象.临时表与普通的表在行为上是一样的,不同之处是,并非所有的功能和选项都是受支持的和/或是必需的。临时表只能城持在,次连接期间,当连接关闭时,在此连接内声明的所有临时表都将自动删除掉。只有声明临时长的会话或应用程序才能访问临时我.如果两个应用程序用相同的名字创立了一个临时代.该临时表的每个实例仍然是惟一的。因而,完全不必担忧出现峪时数据冲突的情况.由于临时表只允许单连接(SinR1.C-connection)访问,因此这里无需使用锁。这正是格时表的一个主要的性能优势。声则时衰要声明一个格时表,必须存在个USER临时表空间(不同于SYSTEM格时衣空间),用以存储临时表的定义和内容.SYSTEM临时表空间只是DB2在内部用来执行诸如排序之类操作的.下面这条简单的谙句符创立一个用户临时表空间.CREATEUSERTEMPORARYTAB1.ESPACEUSerteBPSPaCeMANAGEDBYSYSTBIUSINGCuser1.cepspace')声明全局临时表时,可以使用很多可选子句.下面的例子对这些子句的特性作了说明。DEC1.AREG1.OBA1.TEMPORARYTAB1.Etdept(deptidCI1.AR(6).deptnameCI1.AR(20)OXCOMMITDE1.ETEROWSNOT1.OGGEDINUsertcepspace在这个例子中,声明了临时衣JdePt,这个表干j两列,Oncommitde1.eterois子句册定在每次执行C(MM1.T操作时删除临时表的内容,在DB2V8中,可以选择记录对临时表的更改,以便回滚。这个例子规定对该表的更改足NOT1.OGGED,这意味着对该表的任何操作.包括创立以及更改,都不做日志记录.如果在一个工作单位内创立衣,然后I可滚,则临时我将被删除.另方面,如果在此工作单位内删除该表.则该表在愦狂时将没有任何行.无需使用IN子句来指定该临时表都要使用的用户临时衣空间.如果没有指定该信息.DB2就会搜索最适用的表空间。如果找不到用户临时去空间,DB2将产生个错误。让我们乔看另一个例子,DECI.AREGWBA1.TEMPORARYTAB1.EIJroj1.IKEprojectONCOMMITPKES1.tKVERO,SWITHREP1.ACEINusertempspace临时表5Oj是用1.IKE关键字声明的,因此它拥有与名为PrOjeCt的持久表或视图相同的列定义。ONCOMMITPRESERVEROW'S子句说明,在执行COMMIT语句时,该临时表中的所有行都将被保存。因此,这些行就可以在下一次事务中用于进一步的处理.在同次会话中使用相同的名称声明丹一个彼时衣之前,首先必须删除该临时表。可以显式地删除该表,也可以像这里一样使用WITHREP1.ACE选项。如果使用了WITHREP1.ACE选项,DB2将隔式地IH除所有数据.IM除该幅时表.并用新的定义重新创立该临时表.如果使用了连接池(connectionpoo1.ing).UTHREP1.ACE选项用起来就十分方便了。连接池是用于由川数据库连接的一种机制,这样就不必完全按照要求分配和回收资源。这些操作的开销都是相当大的,尤其是在有大吊执行很短事务的连接时,更是如此.由于没有释放连接,先前使用的临时表就可能得不到去除,下一个使用该连接的应用程序就可能使用上一次执行时遗留下来的数据.因此,f史用BITHKIT1.ACe选项可以保证用新的定义利新所声明的监时衣.模式与数据库对象大多数数据底对象都是用一个模式(schema)和一个对象名(Objectname)标识的。数据库模式为数据库时象提供龙耨上的分类,下面例择了这种分为两局部的对象名:DBzA1.MIN.EMP1.OYEEHRPROD.AUDn1.v1.EW1IRPROD.audittrig如果在访问数据库对象时没有指定模式,则用于建立数据库连接的用户ID将被设为缺省的模式。例如,如果用户db2admin连接到一个数据库.并创立表T1.则DB2招创立一个名为db2admin.T1.的表.此后所有引用非全限定(unqua1.ified)友名T1.的SQ1.语句梯解析为db2adain.T1.,DB2专用存放号,CU1."SCHEMA您在进行自己的数据埠工作时可能已任发现.用同为对收的模式的用户11)连接到一个数据麻并非总是可行的,而硬编码hardCOding)应用程序以完全限定对象也不是最好的解决方法,幸运的是.DB2允许使用SETQJRRENTSQIHMA命令更改当前模式,跳省情况下,CIRRENTSCHEX1.ADB2专用存放器被设置为连接到数据际的USER.如果更改CURRENTSCHEMA,那么任何非全限定的数据库灼象都会在前面加上新的值,当前模式可以通过下面这个命令获得:VA1.UESCURRENTSGIfiMA'Si时它进行更改,只制使用下面的命令:SETSCHKMA=db2adminDB2应用程序开发数据库对象例程在本节中,我们将介绍更多类型的数据席对象.这些对象统蛟椰叫做例程(routine).从功能上分,主要有三种例程:存储过程(storedprocedure)函数(function)和方法(method)。要了解这些类型之间的更多不同之处,请参阅存储过程、函数和方法,)例程是封装了与某一特定住芬相关的编程和数据库逻辑的数据诲对有效地使用例程可以简化应用程序的代码,并增加代码的可无用性,例如,如果将某种业务逻辑时装在一个例程中,那么对此业务规则的更改只会影响那个特定的例程。从而可疑小化对应用程序的更改.例程是在数据库效劳SS上定义和处理的.这样就允许应用程序利用数据冰效劳港的能力,从而减少客户机上的处理负我。通用.红杂的业务逻辑需要多条SQ1.谱句.这些谱句要分别地从客户机发送到效劳满,如果数据库活动很多.就会产生大盘的网络传输.如果将这线操作放在一个例程中,那么客户机和效劳器之间的网络传输就会大大减少,从而可以提高应用程序的总体性能,加强平安的能力是使用例程的另一个关键优势.例程可用于屏蔽对底层数据库对象的直接访问.用EXECirTE权限两用一个例程就足修了,无需拥有访问底层数据库对象的显式的权限.例程的不同实现例程有几种可能的实现:内置(bui1.1.-in)例程是DB2系统相带的,这些例程定义在一个系统模式中,例如SYSIBM.SYSPROC,SYSFfN和SYSToO1.S。Sourced例程只适用于函数.sourced例程狂制为一个函数的诏义.外部(externa1.)例程是用一种外部的编程谱言实现的.对于DB2V8.1,可以用以下受支持的语言开发例程:Javai11C/C+O1.E(仅用于存储过程O1.EDB(仅用于表函数)SQ1.例程是用SQ1.Procedura1.1.anguage<SQI.P1.)实现的.I)B2SQ1.P1.是SQ1.PersistentStoredModu1.es(S(J1.PSM)语言标准的一个子集,该标准是与SQ1.起用来编写存储过程、函数和方法的结构化编程语言的坛础.,它将SQI.数据访问的容易性与他单编程语言的流控却结构相结合.这就是SQ1.P1.如此流行的一个主要原I乱存储过程、函数和方法存谛过程是一种数据库对象,它包含用于访问和修改一个或多个表中数据的专门程序.在一个存储过程内,可以以一定的流逻辑包笠多条SQ1.语句.存储过程可以作为对客户机应用程序或其他例程的于例程扩展.存储过程的执行和管理是由一个关系数据库管理系统(RDBMS)控制的。函数是可以自定义的SQ1.扩展.可以在SQ1.谙句(例如一个se1.ect1.ist或I=ROM子句)中谓用函数.有四种类型的函数:聚合(aggregate)函数、标砒(sca1.ar)函数、行(row)函数以及表(tab1.e)函数.存储过程通常用于封装发杂的应用程序设辑,以及执行开销较大的数据库操作,例如多表联结和讷标操作,而由数一一尤其是SQ1.函数-一通常包含更简单的操作.端写在SQ1.函数中的语句将展开到引用它的的SQ1.语句中,与这些Stf.语句一起执行,这导致这些语句在执行时动态编译,如果一条SQ1.语句中使用了一个史杂的SQ1.函数,则DB2要求使用附加的资源来编译它,井生成一个数据访问方案,这样将影响整个运行时性能,方法用于封装为结构类型提供行为的逻辑.结构类型包含一个或多个指定的属性,各属性有其自己的数据类型.DB2专用存放CURR0CPATH与大多数DB2数据库对象一样,一个完整的例程名由一个模式和一个例程名组成.DB2专用存放湍CURRENTSQIkUA可以为大多数数据库对©解析模式,但不能为例程解析模式.相反,DB2是使用CURRENTPATH专用存放器来定位例程的。通过下面的命令可以获得CURRENTP71I设置:VA1.UESCURRENTPATH缺省路径包含三个系统模式,后面跟有连接到数据库的当前用户,例如:"SYS1W,"SYSFH'SPROC-JDB2ADX11N"下而是一些例子和技巧,您可以用它们来更新PATH,SETPatii=C1.RREXTPATH.,IISER2*VA1.UESCURRENTPATH*SYSIBM"SYSFfN*,"SYSPROC*,*DB2DMIN'1.SER2*Irecord(三)se1.ected.嵌入式SQ1.程序嵌入式SQ1.倚介DB2为开发人员提供了不同的编程方法来津写应用程序。最H接的一种方法是嵌入式SQ1.编程。这种编程方法足宜接的,因为程序嵌入了宜接与DB2交互的SQ1.语句.程序可以用以下受支挣的煽程谱力中的任何一种来编写:C/C+FORTRANCOBO1.Java语言(SQ1.J)如何构造成入式SQ1.语句取决于所选择的编程语言。C/C+和FORTRAN中的战入式SQ1.语句前面要加上EXECSQ1.关健字:EXECSQ1.SE1.ECT1.astna三e,cmpidINTO:h。SIYar1.:hostvar2FROMempIoyeeW1.IEKEdeptno=-"OPERTIONS*;CoBO1.中的嵌入式SQ1.语句非常类似于C/C+中的那些嵌入式SQ1.语句,不同的是在语句的后面要使用EM)EXEC关键字:EXECSQ1.SE1.ECTIaSIna«c,CmPidINTOIhostvar1.1:hostvar2IjROMemp1.oyeeWHEREdeptno=*OPERTIONS,ENDEXEC:JaVa语言中的嵌入式SQ1.语句与前面两个例子中展示的那些嵌入式SQ1.语句梢微有些不同,这里必须指定语句将来执行时所在的连接上下文.下面是一个例子:#Sq1.myConnC1.x(SE1.ECTIastnamv,eidINTO:hostvar1.,:h。SIVar2TOOMemp1.oyeeWHEREdeptno-*OPERTIONS*;为了让您更好地了斛嵌入式SQ1.语句是什么样子的,下面给出了用C编写的一个程序的代码片断,在本系列(请参闽参考资料的第3篇教程中,您将了解到更多关于程序预摘译和实际代码开发的知识.intTbBasic(void)intrc=0:structsq1.casq1.ca;EXECSQ1.BEGINDEC1.ARESECTION;charhostVarStrnt50;EXECSQ1.ENDDECI,RESECTION:/de1.carecursor*/EXECSQ1.DEC1.AREc1.CURSORFORSE1.ECTdeptnumb,deptnameIROMorgVHEREdeptnumb二40;opencursor/EXECSQ1.OPENc1.:"fetchcursor/EXECSQ1.FETCHc1.INTO:deptnumb,:deptname;whi1.e(sq1.ca.sqIcode!-100)Printfr¼8d%-1.z1.sn*.deptnumb,deptname);EXECSQ1.FETeHc1.INTO:deptnumb.:deptname;*c1.osecursor/EXECSQ1.C1.OSEc1.;*preparetheStateaent/Strcpy(hostVarStmt,"DE1.ETEEROMorgBHEREdeptnumb=15");EXECSQ1.PREPARES1.mtFROM:h。S1.VarSI1;/«executetheStateeent/EXECSQ1.EXECUTEStmt;RO1.1.BACKthetransaction*/EXECSQ1.RO1.1.BACK;returnO:得态SQ1.在前一小节中我们演示了两种不同类型的嵌入式SQ1.谱句:静态嵌入式SQ1.和动态嵌入式SQ1.这个例子中的SE1.ECT语句说明了静态SQ1.的使用.编写静态SQ1.时,必须指定完整的语句.表名、列名以及所引用的数据类型都是的.惟一可以在运行时指定的伯恩是使用宿主变后的Sq1.语句的WHERE子句中的值.编译静态SQ1.语句(或者,用DB2术语更确切地说,准备好的(prepared)SQ1.语句时,将为其生成数据访何方案并存储在数据库中的一个包里面.当调用包含该语句的应用程序时.这个包将被执行.由于在运行时不需要编译语句,因此执行静态SQ1.时没用编译开销.在准备语句时,DB2使用数据库统计信思和配置参数来估计和获得访问方窠,如果数据库统计信息有变化,则预先生成的访问方案可能不如一开始生成时那样是最正确的.创立包和将包与数据库绑定时,要对准备静态SQ1.语句的人进行授权。只要执行包的人拥有包的EXECHE权限,他就不需要具善该包中所引用的数据库对象上的显式的权限。动态SQ1.动态(DynamicSQ1.)语句是在运行时动态处理的,语句的结构出到执行应用程序时才需要。注意.战入式SQI.简介中展示的例子SQ1.语句使用动态SQI.来PREPARE和EXECUTE一条DE1.ETE语句.DE1.ETE语句的文本存储在个宿主变依hostYarStmt中.当该语句PREPARE好后,系统将生成该语句的个可执行格式,并将其存储在数据库中的一个包里面。一旦生成了数据访问方窠,准备好的语句就可以EXECirTE了。听起来好似有点熟悉,不足吗?是的:这两个处理阶段与静态SQ1.语句正好是一样的.惟一的不同点是.动态SQ1.的PREPARE和EXECtTE都是在运行时进行,而静态SQI.在预编译时准备访问方案,并翱具保存在数据库中.动态SQI.语句必须总是在执行之前准备好,不管是否有相同的语句(相同的访问方案)一次又一次地重发使用.为了最小化这些准备工作的开销,DB2提供了包缓存(也叫动态查询缓存,用以将经常使用的访问方案保存在内存中,包缓存(packagecache)明显地减少了景复的Sy1.准备请求的代价.然而发起和响应准备请求的开销仍然存在。在准备谱句时,总是使用当前数据库统计信息.因此.就可以生成最正确的数据访问路径.SQI.语句的授权是在运行时决定的,执行应用程序的人必须有适当的权限来访问语句中所引用的数据库对象。下一小节将更详细地讨论DB2权限。平安考电要预编译成入式龄态SQ1.程序,用户需要程序中所引用数据库对象的显式的权限,由于预编译或PREPARE阶段会生成一个包并将其存储在数据库中,因此该用户还必须拥行B1.WADD权限.以便添加新的包到数据库中.为了执行带有静态SQI.的程序,用户只需具有相关包上的EXECUTE权限.编译嵌入式动态SQ1.程序的用户也需要BINDADD权限,这里不再需求其他的权限,因为动态SQ1.不是在编谛时准备的.在程序执行时,用户备要所有必需的权限来发出每条SQ1.谱句.同时还需要为嵌入式SQ1.程序创立的包上的EXEC1.TH权限.卜面的衣总结了预编译和执行一个只有静态SQ1.或只有动态SQ1.的程序所需的权限。角色对于静态SQ1.所需的权限对于动态SQ1.所需的权限BIHDADD添加新包到开发人员(预编译数据库中的权限;该程序数据库对象上显式的权限BIHDADD添加新包到数据库中的权限应用程序用户(执行该程序)EXECUTE执行与程序相关的包的权限数据库对象上显式的权限;EXECUTEt行与程序相关的包的权限方SQ1.与动方SQ1.在下面的女中,让我们总结弁详细阐述我们所学到的关于静态SQ1.和动态SQ1.的知识:基于驱动程序的API基于驱动程序的AP1.虽然大多数供给商都支持嵌入式Sq1.数据库访问,但如果您想要使用同样的源代码,并将嵌入式SQ1.应用程序部署到多个数据库系统上,那么还需要一个额外的作.必须用不同供给商的特定的预编译器预端译程序.还必须生成数据访问方案,并绑定到日惊数据库.为了增加应用程序的可移位性,还应考虑使用本节介绍的基于驱动程序的解决方案。基于驱动程序的解决方案需要一个亮动程序管理(drivermanager),这是与应用程序打交道的界面.驱动程序管埋器提供了一套工业标准的应用程序编程接I(API),用于访问数据源.应用程序调用这些API,然后被编详,再与管理器的陈钺接,因为驱动程序遵从标准,所以应用程序可以很容易地使用(或装载)正确的驱动程序来访问不同供给商的数据源.在下面几小节中,我们将看看DB2支持的一些API.在本系列后面的教程中,您将更详细地了解这些API.C1.I和ODBCAPIDB2Ca1.1.1.eve1.Interface(CIJ)是IBM对DB2数据库效劳器的可调用SQI.接II.C1.I是用于数据访问的一个CC÷÷应用程序编程接口(API),您可以使用DB2C1.I开发动态应用程序,就像使用嵌入式动态SQ1.语句进行开发一样.在这两种情况下,SQI.语句都是在运行时准备和处理的.嵌入式动态SQ1.要求有一个预编译器,而DB2C1.1.则没有这种要求.您只得端洋应用程序,并与DB2C1.I驱动程序库鞋接.DB2C1.I是暴于MicrosoftOpendatabaseConnectivity(ODBC)和X/OpenC1.I标准的,在ODBC环境中,应用程序与数据库效劳器之间的联系要通过ODBC物动程序管理器,该管理浮动态地加或应用程序需连接的数据库效劳器所需的驱动程序.ODBC提供某些级别的功能支持.当前的DB2C1.I遵从ODBC3.51.要开发DB2Cu应用程序.备要DB2App1.icationDeve1.opmentC1.ient.它包括编译和超接C1.1.陶用程序时所有必淅的头文件和库.而要开发ODBC应用程序,则需要Microsoft提供的一个ODBCDeve1.oper'sSoftwareKit.下面的图对DB2CU与ODBC环境作了快速的比较.ODBCDf1.verManagerEnvironmentAppUabonIOOBCDrivefMdnegerD2CUEnvironmentDB2(MVS)SQUDSSQU400Oth<rORDADBMSO1.EDB与ADO.NETAPIMicrosoftObject1.inkEmbeddedDatabaSe(O1.EPB)是一套接U,它为应用程序提供了对存储在不同信息源上的数据的统一访问,这也不同的信息源包括关系数据源和作关系数据源。O1.EDB架构由O1.EDB提供者和O1.EI)B消费者组成.DB2同时支挣这两种角色.为了使DB2能修充当O1.EDB提供者,必须要有IBMo1.EDBProiderforDB2,这是一个本地驱动程序,支持通过O1.E接F1.提取或查询DB2数据.下面的图展示了一个可作为O1.EDB消费者的DB2数据库,它可以访问来自任何遵从O1.EDB的数据源(例如一个电子衣格)的数据,同样的DB2效劳擀也可以作为一个O1.EDB提供者,为O1.EDB消费拧提供数据.D2CbertO1.EDBconsumer062Tab1.esActiveXDataObject.NET(ADO.NET)是Microsoft提供的另一种数据访问应用程序接口.它是一种新的数据访问模型,将其前任(ADo)最好的特性与传统的数据库访问相结合,集成了XM1.支持,是一种断开连接的(disconnected)数据架构.有V种方法从一个.MiT应用程序连接到一个1.)B2数据库,如以下图所示.JDBC和SQ1.JAPI至今为止,Java平台已经享誉多时,但仍彳才很多人正在致力于扩展其功能和提高其性能,访问和操纵DB2的Java程序可以使用JavaDatabaseConnectivity(JDBC)API.以及EmbeddedSQ1.forJava(SQ1.J)标准。这两个选项都是供给商无关的SQ1.接口,通过标准化的JaVa方法为应用程序提供数据访问.JDBC是用于美系数据摩访问的实际上的标准JaVaAPI,这种访问通过强大的面向对象的接口,使用动态SQ1.JDBC将动态SQ1.传递给DB2网带的一个JDBC阴动程序。DB2通过JDBCAPI执行SQ1.语句,结果被传回给JavaRi.JDBC类似于DB2C1.I,您无需预编译或梆定JDBC程序,因为JDBC使用动态SQ1.而Sq1.J程序则包含烂态嵌入式SQ1.语句。准备一个SQ1.J程序时衢要通过类似于预编详和绑定的步骤,在编译SQU源文件之前,必须用SQ1.J翻谛器对其进行翻洋,以创立本地Java源代玛完成翻译后.需要使用DB2forJavapro(db2profc)创立DB2包.DB2遗留的基于C1.1.的JDBC驱动程序根据Java2P1.atform,EnterpriseEdition(J2EE)标准,用于荻得数据访问的Java方法和接口可以打包成JDBC驱动程序.I)B2JDBC驱动程序分为遗留的基于C1.1.的驱动程序和新的通用JDBC炎动程序.遗用的基于CIJ的JDBC驱动程序建立在木地DB2C1.I之上。这里有两个实现类,第一个是JDBCType2driver.也叫appdriver.它是由类com.ibn.db2.Jdbc.app.DB2Driver实现的。另一个实现是JDBCType3driver.也叫netdriver.要使用appdriver,必须在JDBC程序执行时所在的客户机上安装一个DB2客户机,所有JI)BC调用都被转换成DB2C1.I调用。DB2JDBCTyin-3driver也将JDBC调用映射为DB2C1.E有了这个骤动程序,就不必在客户机上安装DB2客户机.然而.还是需要一个JDBC侦听器(或JDBC监护程序).DB2V8中擀弃了netdriver,而推荐Type4driver.在下一小节我们将讨论Type4driver.DB2Universa1.JDBC驱动程序Fixpak2ofDB2V8引入了DB2Universa1.JDBC驱动程序.之所以称之为通用(universa1.)驱动程序.是因为它使用DistributedRe1.ationa1.DatabaseArchitecture(DRDA)协议,所有DB2家族的数据库都共用该协议。该卵动程序支持与使用Ty>e4driver架构的DR2效劳器建立直接Java连接。该驱动程序也有两个实现类,分别叫做JavaCom1.nonC1.ient(JCC)Type2driver和JCCTyPC4driver实现类的名称是com.ibm.db2.jcc.DB2Driver*.结束语本教程介绍了I)B2应用程序开发的基础.在进行开发之前,您衢要熟悉不同类型的数据库对象.在本教程中,介绍了一些高级的数据年对象.别名、序列对象以及临时表常用于简化应用程序的代码,存储过理、函数和方法主要用于封装程序和数据库逻辑,本教程讨论了使用例程的一线优点,例如收少网络传输,加初平安,以及提高代玛的可里用性.您应该根据应用程序逻辑的我杂性,选择将逻班时装在过程和函数中。存储过程可作为程序的子例程,通常包含史杂的应用程序逻辑.而用户定义函数则是对SQ1.的一种扩展。它们以简单的语句和逻辑高效地执行。在本教程中,我们还介绍了一些编程方法.嵌入式SQ1.编程允许将SQI.语句嵌入在用C/C+、FORTRAN、COBO1.或Java语言编写的程序中,本教程还强调了静态SQ1.代码和动态SQ1.代码的特征。您御要理解两者之间的不同之处,以便在使用他态SQ1.语句与使用动态SQ1.语句之间作出选择。应用程序编程接11,例如C1.I,O1.)B3A1.X)、01.EDB和JDBC椰是动态程序.DB2提供了本地驱动程序,使得应用程序能助通过这些接口使用DB2数据,而SQ1.J则是种用Java语言编写的静态程序,我们还讨论了关于应用程序如何使用这%API与DB2打交道的基础.掌握了本教程中介绍的这些DH2应用程序开发基础,现在您就可以学习更多关于不同开发方法的深入的信息.