




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
17/17DB2数据库对象根本数据库对象数据库对象是一个数据库的构造块(buildingblock)。DB2提供了不同类型的数据库对象来存储和表示不同信息。通过使用数据定义语言(DDL),可以创立、修改和删除数据库对象。要操纵数据库对象,可以使用数据操纵语言(DML),例如SELECT、UPDATE、INSERT和SELECT语句。常用的数据库对象有:表用户定义数据类型约束视图索引除了FamilyFundamentals教程里介绍的一些数据库对象外,还有一些其他的对象,很多开发人员在开发DB2应用程序时会发现这些对象比较有用。本节我们将介绍这些对象。在继续之前,有一点要注意:在下面看到的一些例子中,对象名称是以小写形式指定的。无论DB2在哪个平台上运行,它总是以大写形式存储名称,除非标识符的名称以双引号("")括起来了。例如,下面的语句创立一个名为employee(小写)的表,该表的列定义与表EMPLOYEE(大写)是一样的。 CREATETABLE"employee"LIKEemployee别名别名(alias)是指一个已有的表、视图的另一个名称,也叫昵称(nickname)。别名也可以作为另一个别名的昵称。与这些对象一样,别名也可以被创立或删除,可以有与之相关的注释。下面是CREATEALIAS语句的一些例子: CREATEALIASaliastab1FORtab1; CREATEALIASbob.aliastab1FORtom.tab1; CREATESYNONYMbob.aliastab2FORbob.aliastab1;可以看到,CREATEALIAS语句比较简单。可以在源对象所在的同一模式中创立别名(如第1行),或者也可以全限定别名(如第2行)。为了与DB2forzSeries兼容,使用关键字SYNONYM代替ALIAS也是合法的(如第3行)。使用别名时无需专门的授权或权限。不过,需要获得与别名所引用的底层对象相关的授权。关于数据库对象权限的完整清单,请参考DB2DBA认证教程Servermanagement(请参阅参考资料)。前面已提到,我们也可以为昵称创立别名。昵称是引用位于联邦系统上的数据表或视图的数据库对象。联邦数据库支持超出了本教程的范围。在本教程系列的第2局部,Datamanipulation,我们将学习更多有关联邦系统的知识。要为别名添加注释,可以发出以下语句: COMMENTONaliastab1IS'Myfirstaliasontab1'要删除一个别名,使用DROP语句,这与所有其他数据库对象是一样的: DROPALIASaliastab1序列对象序列(sequence)是一种数据库对象,这种对象允许自动生成值。序列对象与标识列(identitycolumn)不同,标识列是要与一个特定的表绑在一起的,而序列是一种全局的、独立的对象,同一个数据库中的任何表都可以使用它。标识列是序列对象的一种特例。因此,标识列的特征也适用于序列对象。下面就例释了一条CREATESEQUENCE语句: CREATESEQUENCEmyseqASINTEGER STARTWITH360 INCREMENTBY10 NOMAXVALUE CYCLE CACHE20任何包括0在内的数字数据类型都可用于序列值。这些类型包括SMALLINT、INTEGER、BIGINT或DECIMAL。基于这些数据类型的任何用户定义独特类型(distincttype)也都可以用于序列值。这进一步扩展了用户定义独特类型在应用程序中的使用。如上面的例子所示,您可以为序列对象指定起始值,从而自定义序列对象。在这个例子中,序列的第一个值是360。后续值的生成是由INCREMENTBY子句控制的。这里还支持正、负常量,以产生升序和降序值。缺省情况下,一个序列所生成的最小值和最大值是由该序列数据类型的取值范围来界定的。例如,INTEGER类型的序列值必须处在-2,147,483,647到2,147,483,647之间的范围内。在DB2SQLReferenceGuide中可以找到所有数字数据类型的取值范围。为了改变这种缺省行为,可以使用MINVALUE和MAXVALUE选项来为生成的值设置一个边界。如果到达了最小值或最大值,那么可以使用另一个选项,即CYCLE或NOCYCLE来规定序列值是否应该循环。注意,如果CYCLE生效,则序列就可以生成重复的值。CACHE选项允许DB2将一些预先分配好空间的值保存在内存中,以提高性能。CACHE20是缺省的行为。关于这个选项有一点要谨记:如果在所有缓存的值被使用之前关闭DB2,那么任何缓存的值和未使用的值都将被丢弃。当DB2重新启动时,又会生成和缓存下一块的值,从而造成值之间的不连续,即值之间存在间隔。如果应用程序不允许值之间有间隔,可以考虑使用NOCACHE选项。如果没有使用缓存,则性能就会下降,因为要频繁地生成序列数字。每当生成一个新值的时候,都会写下一条日志记录。因此,更高效的做法是根据请求来获取值,并将这些值缓存在内存中。通过ALTERSEQUENCE语句,可以更改序列对象的特征。除了序列值的数据类型以外,上面所讨论的所有的设置都可以修改。要获得完整的语法,请参考DB2SQLReferenceGuide(请参阅参考资料)。删除一个序列对象与删除任何其他的数据库对象是一样的,不同之处是这里还要使用到一个RESTRICT关键字。这样可以防止在有依赖的情况下删除序列。DROPSEQUENCEmyseqRESTRICT生成和获取序列值序列是一种数据库对象,因此对序列的访问也是由权限来控制的。缺省情况下,只有序列的创立者,即SYSADM和DBADM拥有该对象的USAGE权限。如果希望其他用户也能够使用序列,则需要使用下面的语句:GRANTUSAGEONSEQUENCEseq_object_nameTOPUBLIC有两种表达式可用于生成和获取序列值。NEXTVALFORseq-name用于获取下一个序列值,而PREVVALFORseq-name则用于获取上一个生成的序列值。下面的例子例释了这些表达式的使用。INSERTINTOt1VALUES(NEXTVALFORmyseq,'BOB');INSERTINTOt1VALUES(NEXTVALFORmyseq,'PAT');COMMIT;INSERTINTOt1VALUES(NEXTVALFORmyseq,'GENE');ROLLBACK;INSERTINTOt1VALUES(NEXTVALFORmyseq,'PAUL');VALUESPREVVALFORmyseqINTO:hostvar假设我们以一个空表t1开始,myseq的下一个序列值是1。如果禁用了autocommit,则在执行上述语句之后,t1将包含下面几行:1 NAME 1 BOB2 PAT4 PAUL 3record(s)selected.虽然为GENE生成的值被回滚了,但是DB2并没有再次使用它。因而,下一个为PAUL生成的序列值就是4,而不是3。这个例子中的最后一条语句展示了如何使用PREVVAL表达式。宿主变量:hostvar存储当前会话中生成的最后一个值。如果想保存前面生成的值,那么应该在生成下一个值之前保存PREVVAL值。临时表顾名思义,临时表(temporarytable)不是永久性的数据库对象。临时表与普通的表在行为上是一样的,不同之处是,并非所有的功能和选项都是受支持的和/或是必需的。临时表只能维持在一次连接期间。当连接关闭时,在此连接内声明的所有临时表都将自动删除掉。只有声明临时表的会话或应用程序才能访问临时表。如果两个应用程序用相同的名字创立了一个临时表,该临时表的每个实例仍然是惟一的。因而,完全不必担忧出现临时数据冲突的情况。由于临时表只允许单连接(single-connection)访问,因此这里无需使用锁。这正是临时表的一个主要的性能优势。声明临时表要声明一个临时表,必须存在一个USER临时表空间(不同于SYSTEM临时表空间),用以存储临时表的定义和内容。SYSTEM临时表空间只是DB2在内部用来执行诸如排序之类操作的。下面这条简单的语句将创立一个用户临时表空间。CREATEUSERTEMPORARYTABLESPACEusertempspaceMANAGEDBYSYSTEMUSING('usertempspace')声明全局临时表时,可以使用很多可选子句。下面的例子对这些子句的特性作了说明。DECLAREGLOBALTEMPORARYTABLEt_dept(deptidCHAR(6),deptnameCHAR(20))ONCOMMITDELETEROWSNOTLOGGEDINusertempspace在这个例子中,声明了临时表t_dept,这个表有两列。ONCOMMITDELETEROWS子句规定在每次执行COMMIT操作时删除临时表的内容。在DB2V8中,可以选择记录对临时表的更改,以便回滚。这个例子规定对该表的更改是NOTLOGGED。这意味着对该表的任何操作,包括创立以及更改,都不做日志记录。如果在一个工作单位内创立表,然后回滚,则临时表将被删除。另一方面,如果在此工作单位内删除该表,则该表在恢复时将没有任何行。无需使用IN子句来指定该临时表将要使用的用户临时表空间。如果没有指定该信息,DB2就会搜索最适用的表空间。如果找不到用户临时表空间,DB2将产生一个错误。让我们看看另一个例子:DECLAREGLOBALTEMPORARYTABLEt_projLIKEprojectONCOMMITPRESERVEROWSWITHREPLACEINusertempspace临时表t_proj是用LIKE关键字声明的,因此它拥有与名为project的持久表或视图相同的列定义。ONCOMMITPRESERVEROWS子句说明,在执行COMMIT语句时,该临时表中的所有行都将被保存。因此,这些行就可以在下一次事务中用于进一步的处理。在同一次会话中使用相同的名称声明另一个临时表之前,首先必须删除该临时表。可以显式地删除该表,也可以像这里一样使用WITHREPLACE选项。如果使用了WITHREPLACE选项,DB2将隐式地删除所有数据,删除该临时表,并用新的定义重新创立该临时表。如果使用了连接池(connectionpooling),WITHREPLACE选项用起来就十分方便了。连接池是用于重用数据库连接的一种机制,这样就不必完全按照要求分配和回收资源。这些操作的开销都是相当大的,尤其是在有大量执行很短事务的连接时,更是如此。由于没有释放连接,先前使用的临时表就可能得不到去除。下一个使用该连接的应用程序就可能使用上一次执行时遗留下来的数据。因此,使用WITHREPLACE选项可以保证用新的定义刷新所声明的临时表。模式与数据库对象大多数数据库对象都是用一个模式(schema)和一个对象名(objectname)标识的。数据库模式为数据库对象提供逻辑上的分类。下面例释了这种分为两局部的对象名:DB2ADMIN.EMPLOYEEHRPROD.AUDIT_VIEWHRPROD.AUDIT_TRIG 如果在访问数据库对象时没有指定模式,则用于建立数据库连接的用户ID将被设为缺省的模式。例如,如果用户db2admin连接到一个数据库,并创立表T1,则DB2将创立一个名为db2admin.T1的表。此后所有引用非全限定(unqualified)表名T1的SQL语句都解析为db2admin.T1。DB2专用存放器:CURRENTSCHEMA您在进行自己的数据库工作时可能已经发现,用同为对象的模式的用户ID连接到一个数据库并非总是可行的。而硬编码(hard-coding)应用程序以完全限定对象也不是最好的解决方法。幸运的是,DB2允许使用SETCURRENTSCHEMA命令更改当前模式。缺省情况下,CURRENTSCHEMADB2专用存放器被设置为连接到数据库的USER。如果更改CURRENTSCHEMA,那么任何非全限定的数据库对象都会在前面加上新的值。当前模式可以通过下面这个命令获得:VALUESCURRENTSCHEMA要对它进行更改,只需使用下面的命令:SETSCHEMA=db2adminDB2应用程序开发数据库对象例程在本节中,我们将介绍更多类型的数据库对象。这些对象统统都叫做例程(routine)。从功能上分,主要有三种例程:存储过程(storedprocedure)、函数(function)和方法(method)。(要了解这些类型之间的更多不同之处,请参阅存储过程、函数和方法。)例程是封装了与某一特定任务相关的编程和数据库逻辑的数据库对象。有效地使用例程可以简化应用程序的代码,并增加代码的可重用性。例如,如果将某种业务逻辑封装在一个例程中,那么对此业务规则的更改只会影响那个特定的例程。从而可最小化对应用程序的更改。例程是在数据库效劳器上定义和处理的。这样就允许应用程序利用数据库效劳器的能力,从而减少客户机上的处理负载。通常,复杂的业务逻辑需要多条SQL语句。这些语句要分别地从客户机发送到效劳器,如果数据库活动很多,就会产生大量的网络传输。如果将这些操作放在一个例程中,那么客户机和效劳器之间的网络传输就会大大减少,从而可以提高应用程序的总体性能。加强平安的能力是使用例程的另一个关键优势。例程可用于屏蔽对底层数据库对象的直接访问。用EXECUTE权限调用一个例程就足够了,无需拥有访问底层数据库对象的显式的权限。例程的不同实现例程有几种可能的实现:内置(built-in)例程是DB2系统附带的。这些例程定义在一个系统模式中,例如SYSIBM、SYSPROC、SYSFUN和SYSTOOLS。Sourced例程只适用于函数。sourced例程复制另一个函数的语义。外部(external)例程是用一种外部的编程语言实现的。对于DB2V8.1,可以用以下受支持的语言开发例程:Java语言C/C++OLE(仅用于存储过程)OLEDB(仅用于表函数)SQL例程是用SQLProceduralLanguage(SQLPL)实现的。DB2SQLPL是SQLPersistentStoredModules(SQL/PSM)语言标准的一个子集。该标准是与SQL一起用来编写存储过程、函数和方法的结构化编程语言的基础。它将SQL数据访问的容易性与简单编程语言的流控制结构相结合。这就是SQLPL如此流行的一个主要原因。存储过程、函数和方法存储过程是一种数据库对象,它包含用于访问和修改一个或多个表中数据的专门程序。在一个存储过程内,可以以一定的流逻辑包装多条SQL语句。存储过程可以作为对客户机应用程序或其他例程的子例程扩展。存储过程的执行和管理是由一个关系数据库管理系统(RDBMS)控制的。函数是可以自定义的SQL扩展。可以在SQL语句(例如一个select-list或FROM子句)中调用函数。有四种类型的函数:聚合(aggregate)函数、标量(scalar)函数、行(row)函数以及表(table)函数。存储过程通常用于封装复杂的应用程序逻辑,以及执行开销较大的数据库操作,例如多表联结和游标操作。而函数――尤其是SQL函数――通常包含更简单的操作。编写在SQL函数中的语句将展开到引用它们的SQL语句中,与这些SQL语句一起执行。这导致这些语句在执行时动态编译。如果一条SQL语句中使用了一个复杂的SQL函数,则DB2要求使用附加的资源来编译它,并生成一个数据访问方案。这样将影响整个运行时性能。方法用于封装为结构类型提供行为的逻辑,结构类型包含一个或多个指定的属性,各属性有其自己的数据类型。DB2专用存放器:CURRENTPATH与大多数DB2数据库对象一样,一个完整的例程名由一个模式和一个例程名组成。DB2专用存放器CURRENTSCHEMA可以为大多数数据库对象解析模式,但不能为例程解析模式。相反,DB2是使用CURRENTPATH专用存放器来定位例程的。通过下面的命令可以获得CURRENTPATH设置:VALUESCURRENTPATH缺省路径包含三个系统模式,后面跟有连接到数据库的当前用户。例如:"SYSIBM","SYSFUN","SYSPROC","DB2ADMIN"下面是一些例子和技巧,您可以用它们来更新PATH:SETPATH=CURRENTPATH,"USER2"VALUESCURRENTPATH"SYSIBM","SYSFUN","SYSPROC","DB2ADMIN","USER2"1record(s)selected.嵌入式SQL程序嵌入式SQL简介DB2为开发人员提供了不同的编程方法来编写应用程序。最直接的一种方法是嵌入式SQL编程。这种编程方法是直接的,因为程序嵌入了直接与DB2交互的SQL语句。程序可以用以下受支持的编程语言中的任何一种来编写:C/C++FORTRANCOBOLJava语言(SQLJ)如何构造嵌入式SQL语句取决于所选择的编程语言。C/C++和FORTRAN中的嵌入式SQL语句前面要加上EXECSQL关键字:EXECSQLSELECTlastname,empidINTO:hostvar1,:hostvar2 FROMemployeeWHEREdeptno="OPERATIONS";COBOL中的嵌入式SQL语句非常类似于C/C++中的那些嵌入式SQL语句,不同的是在语句的后面要使用END-EXEC关键字:EXECSQLSELECTlastname,empidINTO:hostvar1,:hostvar2FROMemployeeWHEREdeptno="OPERATIONS"END-EXEC;Java语言中的嵌入式SQL语句与前面两个例子中展示的那些嵌入式SQL语句稍微有些不同,这里必须指定语句将来执行时所在的连接上下文。下面是一个例子:#sql[myConnCtx]{SELECTlastname,empidINTO:hostvar1,:hostvar2FROMemployeeWHEREdeptno="OPERATIONS"};为了让您更好地了解嵌入式SQL语句是什么样子的,下面给出了用C编写的一个程序的代码片断。在本系列(请参阅参考资料)的第3篇教程中,您将了解到更多关于程序预编译和实际代码开发的知识。intTbBasic(void){intrc=0;structsqlcasqlca; EXECSQLBEGINDECLARESECTION;charhostVarStmt[50];EXECSQLENDDECLARESECTION;/*delcarecursor*/EXECSQLDECLAREc1CURSORFORSELECTdeptnumb,deptnameFROMorgWHEREdeptnumb=40; /*opencursor*/EXECSQLOPENc1; /*fetchcursor*/EXECSQLFETCHc1INTO:deptnumb,:deptname; while(sqlca.sqlcode!=100){printf("%8d%-14s\n",deptnumb,deptname);EXECSQLFETCHc1INTO:deptnumb,:deptname;} /*closecursor*/EXECSQLCLOSEc1; /*preparethestatement*/strcpy(hostVarStmt,"DELETEFROMorgWHEREdeptnumb=15");EXECSQLPREPAREStmtFROM:hostVarStmt; /*executethestatement*/EXECSQLEXECUTEStmt; /*ROLLBACKthetransaction*/EXECSQLROLLBACK; return0;}静态SQL在前一小节中,我们演示了两种不同类型的嵌入式SQL语句:静态嵌入式SQL和动态嵌入式SQL。这个例子中的SELECT语句说明了静态SQL的使用。编写静态SQL时,必须指定完整的语句。表名、列名以及所引用的数据类型都是的。惟一可以在运行时指定的信息是使用宿主变量的SQL语句的WHERE子句中的值。编译静态SQL语句(或者,用DB2术语更确切地说,准备好的(prepared)SQL语句)时,将为其生成数据访问方案,并存储在数据库中的一个包里面。当调用包含该语句的应用程序时,这个包将被执行。由于在运行时不需要编译语句,因此执行静态SQL时没用编译开销。在准备语句时,DB2使用数据库统计信息和配置参数来估计和获得访问方案。如果数据库统计信息有变化,则预先生成的访问方案可能不如一开始生成时那样是最正确的。创立包和将包与数据库绑定时,要对准备静态SQL语句的人进行授权。只要执行包的人拥有包的EXECUTE权限,他就不需要具备该包中所引用的数据库对象上的显式的权限。动态SQL动态(DynamicSQL)语句是在运行时动态处理的。语句的结构直到执行应用程序时才需要。注意,嵌入式SQL简介中展示的例子SQL语句使用动态SQL来PREPARE和EXECUTE一条DELETE语句。DELETE语句的文本存储在一个宿主变量hostVarStmt中。当该语句PREPARE好后,系统将生成该语句的一个可执行格式,并将其存储在数据库中的一个包里面。一旦生成了数据访问方案,准备好的语句就可以EXECUTE了。听起来好似有点熟悉,不是吗?是的:这两个处理阶段与静态SQL语句正好是一样的。惟一的不同点是,动态SQL的PREPARE和EXECUTE都是在运行时进行,而静态SQL在预编译时准备访问方案,并将其保存在数据库中。动态SQL语句必须总是在执行之前准备好,不管是否有相同的语句(相同的访问方案)一次又一次地重复使用。为了最小化这些准备工作的开销,DB2提供了包缓存(也叫动态查询缓存),用以将经常使用的访问方案保存在内存中。包缓存(packagecache)明显地减少了重复的SQL准备请求的代价,然而发起和响应准备请求的开销仍然存在。在准备语句时,总是使用当前数据库统计信息。因此,就可以生成最正确的数据访问路径。SQL语句的授权是在运行时决定的。执行应用程序的人必须有适当的权限来访问语句中所引用的数据库对象。下一小节将更详细地讨论DB2权限。平安考虑要预编译嵌入式静态SQL程序,用户需要程序中所引用数据库对象的显式的权限。由于预编译或PREPARE阶段会生成一个包,并将其存储在数据库中,因此该用户还必须拥有BINDADD权限,以便添加新的包到数据库中。为了执行带有静态SQL的程序,用户只需具有相关包上的EXECUTE权限。编译嵌入式动态SQL程序的用户也需要BINDADD权限。这里不再需求其他的权限,因为动态SQL不是在编译时准备的。在程序执行时,用户需要所有必需的权限来发出每条SQL语句,同时还需要为嵌入式SQL程序创立的包上的EXECUTE权限。下面的表总结了预编译和执行一个只有静态SQL或只有动态SQL的程序所需的权限。静态SQL与动态SQL在下面的表中,让我们总结并详细阐述我们所学到的关于静态SQL和动态SQL的知识:基于驱动程序的API基于驱动程序的API虽然大多数供给商都支持嵌入式SQL数据库访问,但如果您想要使用同样的源代码,并将嵌入式SQL应用程序部署到多个数据库系统上,那么还需要一个额外的工作。必须用不同供给商的特定的预编译器预编译程序。还必须生成数据访问方案,并绑定到目标数据库。为了增加应用程序的可移植性,还应考虑使用本节介绍的基于驱动程序的解决方案。基于驱动程序的解决方案需要一个驱动程序管理器(drivermanager),这是与应用程序打交道的界面。驱动程序管理器提供了一套工业标准的应用程序编程接口(API),用于访问数据源。应用程序调用这些API,然后被编译,再与管理器的库链接。因为驱动程序遵从标准,所以应用程序可以很容易地使用(或装载)正确的驱动程序来访问不同供给商的数据源。在下面几小节中,我们将看看DB2支持的一些API。在本系列后面的教程中,您将更详细地了解这些API。CLI和ODBCAPIDB2CallLevelInterface(CLI)是IBM对DB2数据库效劳器的可调用SQL接口。CLI是用于数据访问的一个C/C++应用程序编程接口(API)。您可以使用DB2CLI开发动态应用程序,就像使用嵌入式动态SQL语句进行开发一样。在这两种情况下,SQL语句都是在运行时准备和处理的。嵌入式动态SQL要求有一个预编译器,而DB2CLI则没有这种要求。您只需编译应用程序,并与DB2CLI驱动程序库链接。DB2CLI是基于MicrosoftOpenDatabaseConnectivity(ODBC)和X/OpenCLI标准的。在ODBC环境中,应用程序与数据库效劳器之间的联系要通过ODBC驱动程序管理器。该管理器动态地加载应用程序需连接的数据库效劳器所需的驱动程序。ODBC提供某些级别的功能支持,当前的DB2CLI遵从ODBC3.51。要开发DB2CLI应用程序,需要DB2ApplicationDevelopmentClient。它包括编译和链接CLI应用程序时所有必需的头文件和库。而要开发ODBC应用程序,则需要Microsoft提供的一个ODBCDeveloper'sSoftwareKit。下面的图对DB2CLI与ODBC环境作了快速的比较。OLEDB与ADO.NETAPIMicrosoftObjectLinkEmbeddedDatabase(OLEDB)是一套接口,它为应用程序提供了对存储在不同信息源上的数据的统一访问,这些不同的信息源包括关系数据源和非关系数据源。OLEDB架构由OLEDB提供者和OLEDB消费者组成。DB2同时支持这两种角色。为了使DB2能够充当OLEDB提供者,必须要有IBMOLEDBProviderforDB2。这是一个本地驱动程序,支持通过OLE接口提取或查询DB2数据。下面的图展示了一个可作为OLEDB消费者的DB2数据库,它可以访问来自任何遵从OLEDB的数据源(例如一个电子表格)的数据。同样的DB2效劳器也可以作为一个OLEDB提供者,为OLEDB消费者提供数据。ActiveXDataObject.NET(ADO.NET)是Microsoft提供的另一种数据访问应用程序接口。它是一种新的数据访问模型,将其前任(ADO)最好的特性与传统的数据库访问相结合,集成了XML支持,是一种断开连接的(disconnected)数据架构。有三种方法从一个.NET应用程序连接到一个DB2数据库,如以下图所示。JDBC和SQLJAPI至今为止,Java平台已经享誉多时,但仍有很多人正在致力于扩展其功能和提高其性能。访问和操纵DB2的Java程序可以使用JavaDatabaseConnectivity(JDBC)API,以及EmbeddedSQLforJava(SQLJ)标准。这两个选项都是供给商无关的SQL接口,通过标准化的Java方法为应用程序提供数据访问。JDBC是用于关系数据库访问的实际上的标准JavaAPI,这种访问通过强大的面向对象的接口,使用动态SQL。JDBC将动态SQL传递给DB2附带的一个JDBC驱动程序。DB2通过JDBCAPI执行SQL语句,结果被传回给Java代码。JDBC类似于DB2CLI,您无需预编译或绑定JDBC程序,因为JDBC使用动态SQL。而SQLJ程序则包含静态嵌入式SQL语句。准备一个SQLJ程序时需要通过类似于预编译和绑定的步骤。在编译SQLJ源文件之前,必须用SQLJ翻译器对其进行翻译,以创立本地Java源代码。完成翻译后,需要使用DB2forJavapro(db2profc)创立DB2包。DB2遗留的基于CLI的JDBC驱动程序根据Java2Platform,EnterpriseEdition(J2EE)标准,用于获得数据访问的Java方法和接口可以打包成JDB
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 灾害预警系统建设合同
- 委托拉资金协议
- 房地产行业房屋交付使用后维修责任免责协议
- 委托专项技术服务合同
- 内河水路运输合同
- 离婚后财产补充协议
- 单项工程承办施工合同
- 新能源供应链管理合作协议
- 乌鲁木齐房屋租赁协议规定
- 数字化转型整体解决方案服务合同
- 青工技能振兴计划青工技能振兴计划八篇
- 2023年心理咨询师之心理咨询师基础知识考试题库附完整答案【有一套】
- 路缘石安装一级安全交底
- 教师教学常规管理培训夯实教学常规强化教学管理PPT教学课件
- 2023年山东省春季高校招生考试英语试卷试题(含答案)
- 一级建造师继续教育最全题库及答案(新)
- LS/T 1226-2022粮库智能通风控制系统
- GB/T 4927-2008啤酒
- 肺隔离症医学课件
- GB/T 22919.5-2008水产配合饲料第5部分:南美白对虾配合饲料
- 卫生部健康体检项目目录
评论
0/150
提交评论