QH 第8章 数据库编程.ppt
《QH 第8章 数据库编程.ppt》由会员分享,可在线阅读,更多相关《QH 第8章 数据库编程.ppt(137页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据库系统概论数据库系统概论An Introduction to Database System 第八章第八章 数据库编程数据库编程1第八章第八章 数据库编程数据库编程8.1 嵌入式嵌入式SQL8.2 存储过程存储过程8.3 ODBC编程编程28.1 嵌入式嵌入式SQLn nSQLSQL语言提供了两种不同的使用方式:语言提供了两种不同的使用方式:n n交互式交互式n n嵌入式嵌入式n n为什么要引入嵌入式为什么要引入嵌入式SQLSQLn nSQLSQL语言是非过程性语言语言是非过程性语言n n事务处理应用需要高级语言事务处理应用需要高级语言n n这两种方式细节上有差别,在程序设计的环境这两种方
2、式细节上有差别,在程序设计的环境下,下,SQLSQL语句要做某些必要的扩充语句要做某些必要的扩充38.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的处理过程的处理过程8.1.2 嵌入式嵌入式SQL语句语句与主语言之间的通信与主语言之间的通信8.1.3 不使用游标的不使用游标的SQL语句语句8.1.4 使用游标的使用游标的SQL语句语句8.1.5 动态动态SQL8.1.6 小结小结48.1.1 嵌入式嵌入式SQL的的处理过程处理过程n n主语言n n嵌入式嵌入式SQLSQL是将是将SQLSQL语句嵌入程序设计语言中,语句嵌入程序设计语言中,被嵌入的程序设计语言,如被嵌入的程序设计语言,如
3、C C、C+C+、JavaJava,称,称为宿主语言,简称主语言。为宿主语言,简称主语言。n n处理过程n n预编译方法预编译方法5嵌入式嵌入式SQL的的处理过程处理过程(续)(续)主语言程序 含ESQL语句RDBMS的预处理程序ESQL语句转换为函数调用主语言编译程序目标语言程序ESQL基本处理过程6嵌入式嵌入式SQL的的处理过程处理过程(续)(续)n n为了区分SQL语句与主语言语句,所有SQL语句必须加前缀EXEC SQL,以(;)结束:EXEC SQL;78.1.2 8.1.2 嵌入式嵌入式嵌入式嵌入式SQLSQL语句与主语言之间的通信语句与主语言之间的通信语句与主语言之间的通信语句与
4、主语言之间的通信n n将将SQLSQL嵌入到高级语言中混合编程,程序中会含嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句有两种不同计算模型的语句n nSQLSQL语句语句 描述性的面向集合的语句描述性的面向集合的语句 负责操纵数据库负责操纵数据库n n高级语言语句高级语言语句 过程性的面向记录的语句过程性的面向记录的语句 负责控制程序流程负责控制程序流程n n它们之间应该如何通信?它们之间应该如何通信?8嵌入式嵌入式SQL语句与主语言之间的通信(续)语句与主语言之间的通信(续)n n数据库工作单元与源程序工作单元之间的通信:数据库工作单元与源程序工作单元之间的通信:n n1.SQ
5、L1.SQL通信区通信区向主语言传递向主语言传递SQLSQL语句的执行状态信息语句的执行状态信息使主语言能够据此控制程序流程使主语言能够据此控制程序流程n n2.2.主变量主变量主语言向主语言向SQLSQL语句提供参数语句提供参数将将SQLSQL语句查询数据库的结果交主语言进一步处理语句查询数据库的结果交主语言进一步处理n n3.3.游标游标解决集合性操作语言与过程性操作语言的不匹配解决集合性操作语言与过程性操作语言的不匹配9一、一、SQL通信区通信区n nSQLCASQLCA:SQL Communication AreaSQL Communication Arean nSQLCASQLCA是
6、一个数据结构是一个数据结构n nSQLCASQLCA的用途的用途n nSQLSQL语句执行后,语句执行后,RDBMSRDBMS反馈给应用程序信息反馈给应用程序信息 描述系统当前工作状态描述系统当前工作状态 描述运行环境描述运行环境n n这些信息将送到这些信息将送到SQLSQL通信区通信区SQLCASQLCA中中n n应用程序从应用程序从SQLCASQLCA中取出这些状态信息,据此决中取出这些状态信息,据此决定接下来执行的语句定接下来执行的语句10SQL通信区通信区n nSQLCASQLCA使用方法:使用方法:n n定义定义SQLCASQLCA 用用EXEC SQL INCLUDE SQLCAE
7、XEC SQL INCLUDE SQLCA定义定义n n使用使用SQLCASQLCASQLCASQLCA中有一个存放每次执行中有一个存放每次执行SQLSQL语句后返回代码的语句后返回代码的变量变量SQLCODESQLCODE如果如果SQLCODESQLCODE等于预定义的常量等于预定义的常量SUCCESSSUCCESS,则表示则表示SQLSQL语句成功,否则表示出错语句成功,否则表示出错应用程序每执行完一条应用程序每执行完一条SQL SQL 语句之后都应该测试一语句之后都应该测试一下下SQLCODESQLCODE的值,以了解该的值,以了解该SQLSQL语句执行情况并做语句执行情况并做相应处理相
8、应处理11二、主变量二、主变量 n n主变量主变量n n嵌入式嵌入式SQLSQL语句中可以使用主语言的程序变量来输入或语句中可以使用主语言的程序变量来输入或输出数据输出数据n n在在SQLSQL语句中使用的主语言程序变量简称为主变量语句中使用的主语言程序变量简称为主变量(Host VariableHost Variable)n n主变量的类型主变量的类型n n输入主变量:由应用程序赋值,输入主变量:由应用程序赋值,SQLSQL使用。使用。n n输出主变量:由输出主变量:由SQLSQL赋值或设置状态信息,返回给应用赋值或设置状态信息,返回给应用程序。程序。n n一个主变量有可能既是输入主变量又是
9、输出主变量一个主变量有可能既是输入主变量又是输出主变量12主变量(续)主变量(续)n n指示变量:n n一个主变量可以附带一个指示变量(一个主变量可以附带一个指示变量(Indicator Indicator VariableVariable)n n什么是指示变量?什么是指示变量?n n是一个整型变量,用来指示所指主变量的值或条件。是一个整型变量,用来指示所指主变量的值或条件。n n指示变量的用途?指示变量的用途?n n指示输入主变量是否为空指示输入主变量是否为空n n指示输出主变量是否为空,值是否被截断。指示输出主变量是否为空,值是否被截断。13主变量(续)主变量(续)n n在SQL语句中使用
10、主变量和指示变量的方法n n1)1)说明主变量和指示变量说明主变量和指示变量BEGIN DECLARE SECTIONBEGIN DECLARE SECTION.(.(说明主变量和指示变量说明主变量和指示变量).END DECLARE SECTIONEND DECLARE SECTION14主变量(续)主变量(续)n n2)2)使用主变量使用主变量说明之后的主变量可以在说明之后的主变量可以在SQLSQL语句中任何一个能够语句中任何一个能够使用表达式的地方出现使用表达式的地方出现为了与数据库对象名(表名、视图名、列名等)区为了与数据库对象名(表名、视图名、列名等)区别,别,SQLSQL语句中的主
11、变量名前要加冒号(语句中的主变量名前要加冒号(:)作为标)作为标志志n n3)3)使用指示变量使用指示变量 指示变量前也必须加冒号标志指示变量前也必须加冒号标志 必须紧跟在所指主变量之后必须紧跟在所指主变量之后15主变量(续)主变量(续)n n在SQL语句之外(主语言语句中)使用主变量和指示变量的方法n n可以直接引用,不必加冒号16三、游标(三、游标(cursor)n n为什么要使用游标为什么要使用游标n n SQLSQL语言与主语言具有不同数据处理方式语言与主语言具有不同数据处理方式n nSQLSQL语言是面向集合的,一条语言是面向集合的,一条SQLSQL语句原则上可以产语句原则上可以产生
12、或处理多条记录生或处理多条记录n n主语言是面向记录的,一组主变量一次只能存放一条主语言是面向记录的,一组主变量一次只能存放一条记录记录n n仅使用主变量并不能完全满足仅使用主变量并不能完全满足SQLSQL语句向应用程序输语句向应用程序输出数据的要求出数据的要求n n嵌入式嵌入式SQLSQL引入了游标的概念,用来协调这两种不同引入了游标的概念,用来协调这两种不同的处理方式的处理方式17 游标(续游标(续)n n游标n n游标是系统为用户开设的一个数据缓冲区,游标是系统为用户开设的一个数据缓冲区,存放存放SQLSQL语句的执行结果语句的执行结果n n每个游标区都有一个名字每个游标区都有一个名字n
13、 n用户可以用用户可以用SQLSQL语句逐一从游标中获取记录,语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理并赋给主变量,交由主语言进一步处理18四、建立和关闭数据库连接四、建立和关闭数据库连接n n建立数据库连接建立数据库连接 EXEC SQL CONNECT TO EXEC SQL CONNECT TO targettarget AS AS connection-nameconnection-name USER USER user-nameuser-name;target target是要连接的数据库服务器:是要连接的数据库服务器:l l常见的服务器标识串,如常见的服务器标识
14、串,如:l l包含服务器标识的包含服务器标识的SQLSQL串常量串常量 l lDEFAULT DEFAULT connect-name connect-name是可选的连接名,连接必须是一个有效的标识符是可选的连接名,连接必须是一个有效的标识符 ,在整个程序在整个程序内只有一个连接时可以不指定连接名内只有一个连接时可以不指定连接名n n关闭数据库连接关闭数据库连接 EXEC SQL DISCONNECT EXEC SQL DISCONNECT connectionconnection;n n程序运行过程中可以修改当前连接程序运行过程中可以修改当前连接 :EXEC SQL SET CONNECT
15、ION EXEC SQL SET CONNECTION connection-name connection-name|DEFAULT;|DEFAULT;19五、程序实例五、程序实例 例例1 1依次检查某个系的学生记录,交互式更新某些学生依次检查某个系的学生记录,交互式更新某些学生年龄。年龄。EXEC SQL BEGIN DEC LARE SECTION;EXEC SQL BEGIN DEC LARE SECTION;/*/*主变量说明开始主变量说明开始*/char deptname64;char deptname64;char HSno64;char HSno64;char HSname64
16、;char HSname64;char HSsex64;char HSsex64;intint HSageHSage;intintNEWAGE;NEWAGE;EXEC SQL END DECLARE SECTION;/*EXEC SQL END DECLARE SECTION;/*主变量说明结束主变量说明结束*/long SQLCODE;long SQLCODE;EXEC SQL INCLUDE EXEC SQL INCLUDE sqlcasqlca;/*;/*定义定义SQLSQL通信区通信区*/20程序实例(续)程序实例(续)intint main(voidmain(void)/*C)/*C
17、语言主程序开始语言主程序开始*/intint count=0;count=0;char char ynyn;/*;/*变量变量ynyn代表代表yesyes或或no*/no*/printf(Pleaseprintf(Please choose the department choose the department name(CSname(CS/MA/IS):);/MA/IS):);scanf(%sscanf(%s,deptnamedeptname);/*);/*为主变量为主变量deptnamedeptname赋值赋值*/EXEC SQL CONNECT TO TESTlocalhost:543
18、21 USEREXEC SQL CONNECT TO TESTlocalhost:54321 USER SYSTEM/MANAGER;/*SYSTEM/MANAGER;/*连接数据库连接数据库TEST*/TEST*/EXEC SQL DECLARE SX CURSOR FOR /*EXEC SQL DECLARE SX CURSOR FOR /*定义游标定义游标*/SELECT SELECT SnoSno,SnameSname,SsexSsex,Sage ,Sage /*SX/*SX对应语句的执行结果对应语句的执行结果*/FROM StudentFROM StudentWHERE WHERE
19、SDeptSDept=:=:deptnamedeptname;EXEC SQL OPEN SX;EXEC SQL OPEN SX;/*/*打开游标打开游标SXSX便指向查询结果的第一行便指向查询结果的第一行*/21程序实例(续)程序实例(续)for(;)for(;)/*/*用循环结构逐条处理结果集中的记录用循环结构逐条处理结果集中的记录*/E EXEC SQL FETCH SX INTO:XEC SQL FETCH SX INTO:HSnoHSno,:,:HSnameHSname,:,:HSsex,:HSageHSsex,:HSage;/*/*推进游标,将当前数据放入主变量推进游标,将当前数据
20、放入主变量*/if(if(sqlca.sqlcodesqlca.sqlcode!=0)/*!=0)/*sqlcodesqlcode!=0,!=0,表示操作不成功表示操作不成功*/break;break;/*/*利用利用SQLCASQLCA中的状态信息决定何时退出循环中的状态信息决定何时退出循环*/if(countif(count+=0)/*+=0)/*如果是第一行的话,先打出行头如果是第一行的话,先打出行头*/printf(n%-10s%-20s%-10s%-10sn,printf(n%-10s%-20s%-10s%-10sn,SnoSno,SnameSname,SsexSsex,Sage);
21、Sage);printf(%-10s%-20s%-10s%-10dn,printf(%-10s%-20s%-10s%-10dn,HSnoHSno,HSnameHSname,HSsexHSsex,HSageHSage););/*/*打印查询结果打印查询结果*/printf(UPDATEprintf(UPDATE AGE(y/nAGE(y/n)?);/*)?);/*询问用户是否要更新该学生的年龄询问用户是否要更新该学生的年龄*/do do scanf(%c,&ynscanf(%c,&yn););while(ynwhile(yn!=N&!=N&ynyn!=n&!=n&ynyn!=Y&!=Y&ynyn
22、!=y);!=y);22程序实例(续)程序实例(续)if(if(ynyn=y|=y|ynyn=Y)/*=Y)/*如果选择更新操作如果选择更新操作*/printf(INPUTprintf(INPUT NEW AGE:);NEW AGE:);scanf(%d,&NEWAGEscanf(%d,&NEWAGE););/*/*用户输入新年龄到主变量中用户输入新年龄到主变量中*/EXEC SQL UPDATE Student EXEC SQL UPDATE Student /*/*嵌入式嵌入式SQL*/SQL*/SET Sage=:NEWAGESET Sage=:NEWAGEWHERE CURRENT O
23、F SX;WHERE CURRENT OF SX;/*/*对当前游标指向的学生年龄进行更新对当前游标指向的学生年龄进行更新*/EXEC SQL CLOSE SX;EXEC SQL CLOSE SX;/*/*关闭游标关闭游标SXSX不再和查询结果对应不再和查询结果对应*/EXEC SQL COMMIT WORK;/*EXEC SQL COMMIT WORK;/*提交更新提交更新*/EXEC SQL DISCONNECT TEST;EXEC SQL DISCONNECT TEST;断开数据库连接断开数据库连接*/238.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的处理过程的处理过程8.1
24、.2 嵌入式嵌入式SQL语句语句与主语言之间的通信与主语言之间的通信8.1.3 不使用游标的不使用游标的SQL语句语句8.1.4 使用游标的使用游标的SQL语句语句8.1.5 动态动态SQL8.1.6 小结小结248.1.3 不用游标的不用游标的SQL语句语句n n不用游标的SQL语句的种类n n 说明性语句说明性语句n n 数据定义语句数据定义语句n n 数据控制语句数据控制语句n n 查询结果为单记录的查询结果为单记录的SELECTSELECT语句语句n n 非非CURRENTCURRENT形式的增删改语句形式的增删改语句 25不用游标的不用游标的SQL语句(续)语句(续)n n一、查询结
25、果为单记录的SELECT语句 n n二、非CURRENT形式的增删改语句26一、查询结果为单记录的一、查询结果为单记录的SELECT语句语句n n这类语句不需要使用游标,只需要用INTO子句指定存放查询结果的主变量 例例2 2 根据学生号码查询学生信息。假设已经把要查根据学生号码查询学生信息。假设已经把要查询的学生的学号赋给了主变量询的学生的学号赋给了主变量givensnogivensno。EXEC SQL SELECT EXEC SQL SELECT SnoSno,SnameSname,SsexSsex,SageSage,SdeptSdept INTO INTO :HsnoHsno,:Hna
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- QH 第8章 数据库编程 数据库 编程
限制150内