




已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
文档标题DB2开发指引交通银行大集中工程组2004年07月目 录1DB2简介32DB2与其他数据库的比较42.1DB2数据库42.2Oracle数据库42.3SYBASE和SQL SERVER数据库52.4Informix数据库73DB2常用操作94嵌入SQL语言简介134.1嵌入SQL程序的组成元素134.2静态SQL和动态SQL154.3SQLCA164.4SQLDA165IBM DB2嵌入式SQL语言175.1一个简单示例175.2嵌入SQL语句205.2.1宿主变量205.2.2单行查询225.2.3多行查询235.2.4插入、删除和修改操作255.2.5SQLCA295.2.6事务325.3DB2的嵌入SQL程序处理过程335.4DB2的动态SQL嵌入语句415.4.1基本方法415.4.2动态游标445.4.3SQLDA451 DB2简介DB2是IBM公司的产品,起源于System R和System R*等项目。基于SQL的DB2关系型数据库家族产品是IBM的主要数据库产品。80年代初DB2的发展重点放在大型的主机平台,从80年代中期到90年代初DB2已发展到中型机、小型机以及微机平台。他支持从PC到UNIX,从中小型机到大型机;从IBM到非IBM(HP及SUN UNIX系统等)各种操作平台。他既可以在主机上以主/从方式独立运行,也可以在客户/服务器环境中运行。其中服务平台可以是OS/400,AIX,OS/2,HP-UNIX,SUN-Solaris等操作系统,客户机平台可以是OS/2或Windows, Dos, AIX, HP-UX, SUN Solaris等操作系统。2 DB2与其他数据库的比较2.1 DB2数据库DB2数据库核心又称作DB2公共服务器,采用多进程多线索体系结构,可以运行于多种操作系统之上,并分别根据相应平台环境作了调整和优化,以便能够达到较好的性能。DB2核心数据库的特色有:(1) 支持面向对象的编程DB2支持复杂的数据结构,如无结构文本对象,可以对无结构文本对象进行布尔匹配、最接近匹配和任意匹配等搜索。可以建立用户数据类型和用户自定义函数。(2) 支持多媒体应用程序DB2支持大二分对象(BLOB),允许在数据库中存取二进制大对象和文本大对象。其中,二进制大对象可以用来存储多媒体对象。(3) 备份和恢复能力(4) 支持存储过程和触发器,用户可以在建表时显示的定义复杂的完整性规则(5) 支持的硅SQL查询(6) 支持异构分布式数据库访问(7) 支持数据复制2.2 Oracle数据库ORACLE产品覆盖了大、中、小型机等几十种机型,Oracle数据库是世界上使用最广泛的关系数据系统之一。Oracle数据库产品具有以下优良特性。(1)兼容性Oracle产品采用标准SQL,并经过美国国家标准技术所(NIST)测试。与IBM SQL/DS,DB2,INGRES,IDMS/R等兼容。(2) 可移植性Oracle的产品可运行于很宽范围的硬件与操作系统平台上。可以安装在70种以上不同的大、中、小型机上;可在VMS、DOS、UNIX、WINDOWS等多种操作系统下工作。(3) 可联结性能与多种通讯网络相连,支持各种协议(TCP/IP、DECnet、LU6.2等)。(4) 高生产率提供了多种开发工具,能极大的方便用户进行进一步的开发。(5) 开放性Oracle良好的兼容性、可移植性、可连接性和高生产率是Oracle RDBMS具有良好的开放性。2.3 SYBASE和SQL SERVER数据库之所以将这两种数据库一起是应为MS SQL Server是购买Sybase公司1987年推出的Sybase SQL Server, 又称为大学版INGRES的第三代产品,所以他们实质是一样的。Sybase是一个面向联机事务处理,具有高性能,高可靠性的功能强大的关系型数据库管理系统(RDBMS)。SYBASE数据库的多库,多设备,多用户,多线索等特点极大地丰富和增强了数据库功能。因为SYBASE数据库系统是这样一个复杂的,多功能的系统,所以对SYBASE数据库系统的管理就变得十分重要,管理的好坏与数据库系统的性能息息相关。SYBASE数据库管理系统的技术特点是: 完全的客户机/服务器体系结构,能适应OLTP要求,能为数百用户提供高性能需求。采用单进程多线索(SINGLEPORCESSANDMULTITHREADED)技术进行查询,节省系统开销,提高内存的利用率。支持存储过程,客户只需通过网络发出执行请求,就可马上执行,有效地加快了数据库访问速度,明显减少网络通讯量,有可能极大的改善网络环境的运行效率,增加数据库的服务容量。虚服务器体系结构与对称多处理器(SMP)技术结合,充分发挥多CPU硬件平台的高性能。数据库管理系统DBA在线调整监控数据库系统的性能。提供日志与数据库的镜象,提高数据库容错能力。支持计算机簇族(CLUSTER)环境下的快速故障切换。通过存储和触发器(TRIGGER)由服务器制约数据的完整性。多种安全机制对表、视图、存储过程、命令进行授权。分布式事务处理采用2PC(TWOPHASECOMMIT)技术访问。支持IMAGE和TEXT的数据类型,为工程数据库和多媒体应用提供了良好的基础。SYBASE的不足:多服务器系统不支持分布透明REPLICATIONSERVER数据方面的性能较差,并不能与操作系统集成对中文的支持较差多用于银行系统等尚无在此数据库基础上的企业管理信息系统SQL Server具有单进程愈多线索的体系结构。SQL Server只有一个服务器进程,所有的客户都连接多这个进程上。但是,该进程有细分为多个并发的线索,他们共享数据缓冲区和CPU时间,能及时捕捉各用户进程发出的存取数据的请求,然后,按一定的调度算法处理这些请求,比操作系统直接对这些请求进行调度高效的多。Microsoft 提供了一个数据库引擎,应用范围可以从运行 Microsoft Windows 95/98 操作系统的移动膝上型电脑,到运行 Windows NT Server 操作系统企业版的兆兆字节对称多处理器群集。所有这些系统都能保证关键任务业务系统要求的安全性和可靠性。SQL Server的事务处理量大,响应速度快,并能为数百或更多用户维持这种高性能。SQL Server首先在核心层实现了数据完整性控制,包括建表时申明完整性和用触发器机制定义与应用有关的完整性。支持分布式查询与更新。2.4 Informix数据库INFORMIX运行在UNIX平台,支持SUNOS、HPUX、ALFAOSF/1。采用双引擎机制,占用资源小,简单易用。适用于中小型数据库管理。Informix数据库的具有如下功能:DSA(DYMANICSCALABLEARCHITECTURE)动态可调整结构支持SMP查询语句多线索查询机制具有三个任务队列具有虚拟处理器提供并行索引功能,是高性能的OLTP数据库数据物理结构为静态分片支持双机簇族(CLUSTER)(只支持SESQUENT平台)具有对复杂系统应用开发的INFORMIX4GLCADE工具存在的缺陷有:网络性能不好,不支持异种网络。即只支持数据透明不支持网络透明。并发控制易死锁。数据备份具有软件镜象功能,速度慢、可靠性差。对大型数据库系统不能得到很好的性能。开发工具不成熟,只具有字符界面,多媒体数据弱,无覆盖全开发过程的CASE工具。无CLIENT/SERVER分布式处理模式可移植性差,不同版本的数据结构不兼容。4GL与CADE的代码不可移植。3 DB2常用操作1 启动实例(db2inst1):db2start2 停止实例(db2inst1):db2stop3 列出所有实例(db2inst1)db2ilist5列出当前实例:db2 get instance4 察看示例配置文件:db2 get dbm cfg|more5 更新数据库管理器参数信息:db2 update dbm cfg using para_name para_value6 创建数据库:db2 create db test7 察看数据库配置参数信息db2 get db cfg for test|more8 更新数据库参数配置信息db2 update db cfg for test using para_name para_value9 删除数据库:db2 drop db test10连接数据库db2 connect to test11列出所有表空间的详细信息。db2 list tablespaces show detail12列出容器的信息db2 list tablespace containers for tbs_id show detail13创建表:db2 ceate table tb1(id integer not null,name char(10)14列出所有表db2 list tables15插入数据:db2 insert into tb1 values(1,sam);db2 insert into tb2 values(2,smitty);16查询数据:db2 select * from tb117删除数据:db2 delete from tb1 where id=118创建索引:db2 create index idx1 on tb1(id);19创建视图:db2 create view view1 as select id from tb120查询视图:db2 select * from view121节点编目db2 catalog tcp node node_name remote server_ip server server_port22察看端口号db2 get dbm cfg|grep SVCENAME23测试节点的附接db2 attach to node_name24察看本地节点db2 list node directory25节点反编目db2 uncatalog node node_name26数据库编目db2 catalog db db_name as db_alias at node node_name27察看数据库的编目db2 list db directory28连接数据库db2 connect to db_alias user user_name using user_password29数据库反编目db2 uncatalog db db_alias30导出数据db2 export to myfile of ixf messages msg select * from tb131导入数据db2 import from myfile of ixf messages msg replace into tb132导出数据库的所有表数据db2move test export 33生成数据库的定义db2look -d db_alias -a -e -m -l -x -f -o db2look.sql34创建数据库db2 create db test135生成定义db2 -tvf db2look.sql36导入数据库所有的数据db2move db_alias import37重组检查db2 reorgchk38重组表tb1db2 reorg table tb139更新统计信息db2 runstats on table tb140备份数据库testdb2 backup db test41恢复数据库testdb2 restore db test4 嵌入SQL语言简介SQL是一种双重式语言,它既是一种用于查询和更新的交互式数据库语言,又是一种应用程序进行数据库访问时所采取的编程式数据库语言。SQL语言在这两种方式中的大部分语法是相同的。在编写访问数据库的程序时,必须从普通的编程语言开始(如C语言),再把SQL加入到程序中。所以,嵌入式SQL语言就是将SQL语句直接嵌入到程序的源代码中,与其他程序设计语言语句混合。专用的SQL预编译程序将嵌入的SQL语句转换为能被程序设计语言(如C语言)的编译器识别的函数调用。然后,C编译器编译源代码为可执行程序。各个数据库厂商都采用嵌入SQL语言,并且都符合ANSI/ISO的标准。所以,如果采用合适的嵌入SQL语言,那么可以使得你的程序能够在各个数据库平台上执行(即:源程序不用做修改,只需要用相应数据库产品的预编译器编译即可)。当然,每个数据库厂商又扩展了ANSI/ISO的标准,提供了一些附加的功能。这样,也使得每个数据库产品在嵌入SQL方面有一些区别。本章的目标是,对所有的数据库产品的嵌入SQL做一个简单、实用的介绍。当然,嵌入SQL语句完成的功能也可以通过应用程序接口(API)实现。通过API的调用,可以将SQL语句传递到DBMS,并用API调用返回查询结果。这个方法不需要专用的预编译程序。4.1 嵌入SQL程序的组成元素我们以IBM的DB2嵌入SQL为例,来看看嵌入SQL语句的组成元素。例1、连接到SAMPLE数据库,查询LASTNAME为JOHNSON的FIRSTNAME信息。#include #include #include #include util.h#include EXEC SQL INCLUDE SQLCA; (1)main()EXEC SQL BEGIN DECLARE SECTION; (2) char firstname13; char userid9; char passwd19; EXEC SQL END DECLARE SECTION; EXEC SQL CONNECT TO sample; (3) EXEC SQL SELECT FIRSTNME INTO :firstname (4) FROM employee WHERE LASTNAME = JOHNSON;(4) printf( First name = %sn, firstname ); EXEC SQL CONNECT RESET; (5) return 0; 上面是一个简单的静态嵌入SQL语句的应用程序。它包括了嵌入SQL的主要部分:(1)中的include SQLCA语句定义并描述了SQLCA的结构。SQLCA用于应用程序和数据库之间的通讯,其中的SQLCODE返回SQL语句执行后的结果状态。(2)在BEGIN DECLARE SECTION和END DECLARE SECTION之间定义了宿主变量。宿主变量可被SQL语句引用,也可以被C语言语句引用。它用于将程序中的数据通过SQL语句传给数据库管理器,或从数据库管理器接收查询的结果。在SQL语句中,主变量前均有“:”标志以示区别。(3)在每次访问数据库之前必须做CONNECT操作,以连接到某一个数据库上。这时,应该保证数据库实例已经启动。(4)是一条选择语句。它将表employee中的LASTNAME为“JOHNSON”的行数据的FIRSTNAME查出,并将它放在firstname变量中。该语句返回一个结果。可以通过游标返回多个结果。当然,也可以包含update、insert和delete语句。(5)最后断开数据库的连接。从上例看出,每条嵌入式SQL语句都用EXEC SQL开始,表明它是一条SQL语句。这也是告诉预编译器在EXEC SQL和“;”之间是嵌入SQL语句。如果一条嵌入式SQL语句占用多行,在C程序中可以用续行符“”。4.2 静态SQL和动态SQL嵌入式SQL语言,分为静态SQL语言和动态语言两类。静态SQL语言,就是在编译时已经确定了引用的表和列。宿主变量不改变表和列信息。可以使用主变量改变查询参数值,但是不能用主变量代替表名或列名。动态SQL语言就是:不在编译时确定SQL的表和列,而是让程序在运行时提供,并将SQL语句文本传给DBMS执行。静态SQL语句在编译时已经生成执行计划。而动态SQL语句,只有在执行时才产生执行计划。动态SQL语句首先执行PREPARE语句要求DBMS分析、确认和优化语句,并为其生成执行计划。DBMS还设置SQLCODE以表明语句中发现的错误。当程序执行完“PREPARE”语句后,就可以用EXECUTE语句执行执行计划,并设置SQLCODE,以表明完成状态。4.3 SQLCA应用程序执行时,每执行一条SQL语句,就返回一个状态符和一些附加信息。这些信息反映了SQL语句的执行情况,它有助于用户分析应用程序的错误所在。这些信息都存放在sqlca.h的sqlca结构中。如果一个源文件中包含SQL语句,则必须要在源程序中定义一个SQLCA结构,而且名为SQLCA。最简单的定义方法是在源文件中加入一些语句:EXEC SQL INCLUDE sqlca.h。每个数据库产品都提供了SQLCA结构。4.4 SQLDA我们知道,动态SQL语句在编译时可能不知道有多少列信息。在嵌入SQL语句中,这些不确定的数据是通过SQLDA完成的。SQLDA的结构非常灵活,在该结构的固定部分,指明了多少列等信息,在该结构的后面有一个可变长的结构,说明每列的信息。在从数据库获得数据时,就可以采用SQLDA来获得每行的数据。各个数据库产品的SQLDA结构都不完全相同。5 IBM DB2嵌入式SQL语言DB2支持SQL嵌入到C/C+、JAVA、COBOL、FORTRAN和REXX等语言。本节以SQL嵌入C/C+为例子,讲解静态的嵌入SQL编程和动态的嵌入SQL编程。静态SQL嵌入C语言编程是指,应用程序在书写时,每个SQL语句的大部分都已确定下来(如:查询的表、列和语句的格式等),唯一不确定的是查询语句中某些特定变量的值,这些值可以在执行时由变量传进去,但是,值的类型要事先确定。5.1 一个简单示例首先,我们来看一个嵌入静态SQL语句的C程序。例:连接到SAMPLE数据库,查询LASTNAME为JOHNSON的FIRSTNAME信息。#include #include #include #include util.h#include EXEC SQL INCLUDE SQLCA; (1)#define CHECKERR(CE_STR) if (check_error (CE_STR, &sqlca) != 0) return 1;int check_error (char eString, struct sqlca *caPointer) char eBuffer1024;char sBuffer1024;short rc, Erc;if (caPointer-sqlcode != 0) printf (- error report -n); printf (ERROR occured : %s.nSQLCODE : %ldn, eString, caPointer-sqlcode); return(0);int main(int argc, char *argv) EXEC SQL BEGIN DECLARE SECTION; (2) char firstname13; char userid9; char passwd19; EXEC SQL END DECLARE SECTION; printf( Sample C program: STATICn ); if (argc = 1) EXEC SQL CONNECT TO sample; CHECKERR (CONNECT TO SAMPLE); else if (argc = 3) strcpy (userid, argv1); strcpy (passwd, argv2); EXEC SQL CONNECT TO sample USER :userid USING :passwd; (3) CHECKERR (CONNECT TO SAMPLE); else printf (nUSAGE: static userid passwdnn); return 1; /* endif */ EXEC SQL SELECT FIRSTNME INTO :firstname FROM employee WHERE LASTNAME = JOHNSON;(4) CHECKERR (SELECT statement); (5) printf( First name = %sn, firstname ); EXEC SQL CONNECT RESET; (6) CHECKERR (CONNECT RESET); return(0);/* end of program : STATIC.SQC */ 上面是一个简单的静态嵌入SQL语句的应用程序。它包括了静态嵌入SQL的主要部分。 (1)中的include SQLCA语句定义并描述了SQLCA的结构。SQLCA用于应用程序和数据库之间的通讯,其中的SQLCODE返回SQL语句执行后的结果状态。 (2)在BEGIN DECLARE SECTION和END DECLARE SECTION之间定义了主变量。主变量可被SQL语句引用,也可以被C语言语句引用。它用于将程序中的数据通过SQL语句传给数据库管理器,或从数据库管理器接收查询的结果。在SQL语句中,主变量前均有“:”标志以示区别。 (3)在每次访问数据库之前必须做CONNECT操作,以连接到某一个数据库上。这时,应该保证数据库实例已经启动。 (4)是一条选择语句。它将表employee中的LASTNAME为“JOHNSON”的行数据的FIRSTNAME查出,并将它放在firstname变量中。该语句返回一个结果。可以通过游标返回多个结果。 (5)在该程序中通过调用宏CHECKERR(即调用函数check_error)来返回SQL语句执行的结果。Check_error函数在下面讲解。 (6)最后断开数据库的连接。 从上例看出,每条嵌入式SQL语句都用EXEC SQL开始,表明它是一条SQL语句。这也是告诉预编译器在EXEC SQL和“;”之间是嵌入SQL语句。如果一条嵌入式SQL语句占用多行,在C程序中可以用续行符“”。5.2 嵌入SQL语句5.2.1 宿主变量1)、声明方法 宿主变量就是在嵌入式SQL语句中引用主语言说明的程序变量(如上例中的firstname变量)。如: . EXEC SQL SELECT FIRSTNME INTO :firstname (4) FROM employee WHERE LASTNAME = JOHNSON; .在嵌入式SQL语句中使用宿主变量前,必须采用BEGIN DECLARE SECTION 和END DECLARE SECTION之间给宿主变量说明。这两条语句不是可执行语句,而是预编译程序的说明。宿主变量是标准的C程序变量。嵌入SQL语句使用宿主变量把数据库中查询到的值返回给应用程序(称为输出宿主变量),也用于将程序中给定的值传到SQL语句中(称为输入宿主变量)。显然,C程序和嵌入SQL语句都可以访问宿主变量。 在使用宿主变量前,请注意以下几点: 1.宿主变量的长度不能超过30字节。开始的字母不能是EXEC和SQL。 2.宿主变量必须在被引用之前定义。 3.一个源程序文件中可以有多个SQL说明段。 4.宿主变量名在整个程序中必须是唯一的。2)、宿主变量的数据类型 宿主变量是一个用程序设计语言的数据类型说明并用程序设计语言处理的程序变量;另外,在嵌入SQL语句中用宿主变量保存数据库数据。所以,在嵌入SQL语句中,必须映射C数据类型为合适的DB2数据类型。必须慎重选择宿主变量的数据类型。请看下面这个例子:EXEC SQL BEGIN DECLARE SECTION;short hostvar1 = 39;char *hostvar2 = telescope;EXEC SQL END DECLARE SECTION; EXEC SQL UPDATE inventory SET department = :hostvar1 WHERE part_num = 4572-3; EXEC SQL UPDATE inventory SET prod_descrip = :hostvar2 WHERE part_num = 4572-3;在第一个update语句中,department列为smallint数据类型,所以应该把hostvar1定义为short数据类型。这样的话,从C到DB2的hostvar1可以直接映射。在第二个update语句中,prod_descip列为varchar数据类型,所以应该把hostvar2定义为字符数组。这样的话,从C到DB2的hostvar2可以从字符数组映射为varchar数据类型。 下表列出了C的数据类型和DB2的数据类型的一些转换关系:DB2数据类型 C数据类型 Smallintshort IntegerLong Decimal(p,s) 无 DoubleDouble DateChar11 TimeChar9 TimestampChar27 Char(X) CharX+1 Varchar(X)CharX+1 Graphic(X)Wchar_tX+1 Vargraphic(X) Wchar_tX+1因为C没有date或time数据类型,所以DB2的date或time列将被转换为字符。缺省情况下,使用以下转换格式:mm dd yyyy hh:mm:ssam | pm。你也可以使用字符数据格式将C的字符数据存放到DB2的date列上。对于DECIMAL数据类型,在C语言中也没有对应的数据类型。但可以使用char数据类型实现。3)、宿主变量和NULL 大多数程序设计语言(如C)都不支持NULL。所以对NULL的处理,一定要在SQL中完成。我们可以使用主机指示符变量来解决这个问题。在嵌入式SQL语句中,宿主变量和指示符变量共同规定一个单独的SQL类型值。指示变量和前面宿主变量之间用一个空格相分隔。如:EXEC SQL SELECT price INTO :price :price_nullflag FROM titles WHERE au_id = mc3026 其中,price是宿主变量,price_nullflag是指示符变量。指示符变量的值为: l-1。表示宿主变量应该假设为NULL。(注意:宿主变量的实际值是一个无关值,不予考虑)。 l=0。表示宿主变量不是NULL。 l0。表示宿主变量不是NULL。而且宿主变量对返回值作了截断,指示变量存放了截断数据的长度。 所以,上面这个例子的含义是:如果不存在mc3026写的书,那么price_nullflag为-1,表示price为NULL;如果存在,则price为实际的价格。 指示变量也是一种宿主变量,也需要在程序中定义,它对应数据库系统中的数据类型为SMALLINT。为了便于识别宿主变量,当嵌入式SQL语句中出现宿主变量时,必须在变量名称前标上冒号(:)。冒号的作用是,告诉预编译器,这是个宿主变量而不是表名或列名。5.2.2 单行查询单行查询是通过SELECT INTO语句完成。当这条语句执行时,查询的结果送入INTO所标志的变量中。如果SQLCODE是100,或者SQLSTATE是02000,则说明没有查询到结果或返回结果为NULL,这时,宿主变量不改变,否则,宿主变量中将包含查询的结果。如:. EXEC SQL SELECT FIRSTNME INTO :firstname FROM employee WHERE LASTNAME = JOHNSON;. 5.2.3 多行查询对于多行结果,必须使用游标来完成。游标是一个与SELECT语句相关联的符号名,它使用户可逐行访问由DB2返回的结果集。下面这个例子演示了游标的使用方法。这个例子的作用是,逐行打印出每个经理的名字和部门。#include #include #include #include util.hEXEC SQL INCLUDE SQLCA;#define CHECKERR(CE_STR) if (check_error (CE_STR, &sqlca) != 0) return 1;int main(int argc, char *argv) EXEC SQL BEGIN DECLARE SECTION; char pname10; short dept; char userid9; char passwd19; EXEC SQL END DECLARE SECTION; printf( Sample C program: CURSOR n ); if (argc = 1) EXEC SQL CONNECT TO sample; CHECKERR (CONNECT TO SAMPLE); else if (argc = 3) strcpy (userid, argv1); strcpy (passwd, argv2); EXEC SQL CONNECT TO sample USER :userid USING :passwd; CHECKERR (CONNECT TO SAMPLE); else printf (nUSAGE: cursor userid passwdnn); return 1; /* endif */ EXEC SQL DECLARE c1 CURSOR FOR (1) SELECT name, dept FROM staff WHERE job=Mgr FOR UPDATE OF job; EXEC SQL OPEN c1; (2) CHECKERR (OPEN CURSOR); do EXEC SQL FETCH c1 INTO :pname, :dept; (3) if (SQLCODE != 0) break; printf( %-10.10s in dept. %2d will be demoted to Clerkn, pname, dept ); while ( 1 ); EXEC SQL CLOSE c1; (4) CHECKERR (CLOSE CURSOR); EXEC SQL ROLLBACK; CHECKERR (ROLLBACK); printf( nOn second thought - changes rolled back.n ); EXEC SQL CONNECT RESET; CHECKERR (CONNECT RESET); return(0);/* end of program : CURSOR.SQC */ 在上面这个程序中,(1)定义了一个游标,并指明游标的名字为C1,同时给出了相对于游标的查询语句和游标类型(UPDATE)。(2)打开游标。系统执行查询语句,建立结果表,将游标指针指向第一条记录之前。(3)FETCH语句将指针的下一条记录取出,将记录中的数据存放在相应的宿主变量中。同时指针下移。(4)用CLOSE关闭游标。 5.2.4 插入、删除和修改操作DB2中的插入、删除和修改操作同SQL语句中INSERT、DELETE和UPDATE语句类似。只需在相应的SQL语句前加上EXEC SQL即可。请看下面这个例子: 例、将staff表中所有工作为“Mgr”的职工的工作改变为“clerk”,并将staff表中所有工作为“sale”的职工信息删除。最后插入一新行。#include #include #include #include #include util.hEXEC SQL INCLUDE SQLCA; (1)#define CHECKERR(CE_STR) if (check_error (CE_STR, &sqlca) != 0) return 1;int main(int argc, char *argv) EXEC SQL BEGIN DECLARE SECTION; (2) char statement256; char userid9; char passwd19; char jobUpdate6; EXEC SQL END DECLARE SECTION; printf( nSample C program: UPDAT n); if (argc = 1) EXEC SQL CONNECT TO sample; CHECKERR (CONNECT TO SAMPLE); else if (argc = 3) strcpy (userid, argv1); strcpy (passwd, argv2); EXEC SQL CONNECT TO sample USER :userid USING :passwd; (3) CHECKERR (CONNECT TO SAMPLE); else printf (nUSAGE: updat userid passwdnn); return 1; /* endif */ strcpy (jobUpdate, Clerk); EXEC SQL UPDATE staff SET job = :jobUpdate WHERE job = Mgr; (4) CHECKERR (UPDATE STAFF); printf (All Mgr have been demoted to Clerk!n ); strcpy (jobUpdate, Sales); EXEC SQL DELETE FROM staff WHERE job = :jobUpdate; (5) CHECKERR (DELETE FROM STAFF); printf (All Sales people have been deleted!n); EXEC SQL INSERT INTO staff VALUES (999, Testing, 99, :jobUpdate, 0, 0, 0); (6) CHECKERR (INSERT INTO STAFF); printf (New data has been insertedn); EXEC SQL ROLLBACK; (7) CHECKERR (ROLLBACK); printf( On second thought - changes rolled back.n ); EXEC SQL CONNECT RESET; CHECKERR (CONNECT RESET); return(0);/* end of program : UPDAT.SQC */ 上述语句:(1)包含SQLCA结构。该结构用于将SQL语句执行的结果信息返回给应用程序。(2)宿主变量定义。(3)连接到DB2的SAMPLE数据库。(4)UPDATE语句将staff表中所有工作为“Mgr”的职工的工作改变为“clerk”。(5)DELETE语句将staff表中所有工作为“sale”的职工信息删除。(6)INSERT语句插入一新行。 指定位置的UPDATE语句和DELETE语句 游标操作除了可以将多行的查询结果返回给应用程序,它还可以与UPDATE语句和DELETE相结合,根据游标当前的位置,对指针所指的这个行数据执行UPDATE操作和DELETE操作。它的语法为:UPDATE. WHERE CURRENT OF cursor_nameDELETE FROM table_name | view_name WHERE CURRENT OF cursor_name请看下面这个例子。这个例子的作用是:将部门大于40的员工的工作改变为“clerk”,部门小于等于40的员工信息删除。#include #include #include #include util.hEXEC SQL INCLUDE SQLCA;#define CHECKERR(CE_STR) if (check_error (CE_STR, &sqlca) != 0) return 1;int main(int argc, char *argv) EXEC SQL BEGIN DECLARE SECTION; char pname10; short dept; char userid9; char passwd19; EXEC SQL END DECLARE SECTION; printf( Sample C program: OPENFTCHn ); if (argc = 1) EXEC SQL CONNECT TO sample; CHECKERR (CONNECT TO SAMPLE); else if (argc = 3) strcpy (userid,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 考评与考核的区别
- 钢管舞是什么
- 高新技术企业股权激励合同补充协议及激励方案
- 生态园区物业管理经营权合同转让示范文本
- 功能性饮料在2025年运动健康市场推广的跨界营销案例分析报告
- 2025年新能源储能系统质量认证与技术创新趋势报告
- 离婚后子女抚养权变更及赡养费支付执行调解协议书
- 2025年生物质能与煤炭耦合燃烧技术在炼油行业节能减排应用前景分析报告
- 离婚抚养费补充协议(子女生活费用追加协议)
- 离婚协议书范本:跨境财产分割与子女监护权协议
- 小学生科普课视错觉课件
- 化疗药物的应用及护理
- 安宁疗护个案护理模板
- 质量部长述职报告
- 华为AAU规格标准手册-5G
- 2025年华侨港澳台学生联招考试英语试卷试题(含答案详解)
- 音乐心理学理论-洞察分析
- 上海市闵行区区管国企招聘笔试冲刺题2025
- OptixOSN3500智能光传输设备业务配置手册
- 软件正版化培训
- 工业园区消防维保方案
评论
0/150
提交评论