第8章 数据库编程_数据库系统概论(第四版)_萨师煊,王珊

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

AnIntroductiontoDatabaseSystem数据库系统概论AnIntroductiontoDatabaseSystem第八章数据库编程AnIntroductiontoDatabaseSystem第八章数据库编程8.1嵌入式SQL8.2存储过程8.3ODBC编程AnIntroductiontoDatabaseSystem8.1嵌入式SQL™SQL语言提供了两种不同的使用方式:ƒ交互式ƒ嵌入式™为什么要引入嵌入式SQLƒSQL语言是非过程性语言ƒ事务处理应用需要高级语言™这两种方式细节上有差别,在程序设计的环境下,SQL语句要做某些必要的扩充AnIntroductiontoDatabaseSystem8.1嵌入式SQL8.1.1嵌入式SQL的处理过程8.1.2嵌入式SQL语句与主语言之间的通信8.1.3不使用游标的SQL语句8.1.4使用游标的SQL语句8.1.5动态SQL8.1.6小结AnIntroductiontoDatabaseSystem8.1.1嵌入式SQL的处理过程™主语言ƒ嵌入式SQL是将SQL语句嵌入程序设计语言中,被嵌入的程序设计语言,如C、C++、Java,称为宿主语言,简称主语言。™处理过程ƒ预编译方法AnIntroductiontoDatabaseSystem嵌入式SQL的处理过程(续)主语言程序含ESQL语句RDBMS的预处理程序ESQL语句转换为函数调用主语言编译程序目标语言程序ESQL基本处理过程AnIntroductiontoDatabaseSystem嵌入式SQL的处理过程(续)™为了区分SQL语句与主语言语句,所有SQL语句必须加前缀EXECSQL,以(;)结束:EXECSQLSQL语句;AnIntroductiontoDatabaseSystem8.1嵌入式SQL8.1.1嵌入式SQL的处理过程8.1.2嵌入式SQL与主语言的通信8.1.3不使用游标的SQL语句8.1.4使用游标的SQL语句8.1.5动态SQL8.1.6小结AnIntroductiontoDatabaseSystem8.1.2嵌入式SQL语句与主语言之间的通信™将SQL嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句„SQL语句¾描述性的面向集合的语句¾负责操纵数据库„高级语言语句¾过程性的面向记录的语句¾负责控制程序流程„它们之间应该如何通信?AnIntroductiontoDatabaseSystem嵌入式SQL语句与主语言之间的通信(续)™数据库工作单元与源程序工作单元之间的通信:„1.SQL通信区¾向主语言传递SQL语句的执行状态信息¾使主语言能够据此控制程序流程„2.主变量¾主语言向SQL语句提供参数¾将SQL语句查询数据库的结果交主语言进一步处理„3.游标¾解决集合性操作语言与过程性操作语言的不匹配AnIntroductiontoDatabaseSystem一、SQL通信区™SQLCA:SQLCommunicationArea„SQLCA是一个数据结构™SQLCA的用途„SQL语句执行后,RDBMS反馈给应用程序信息¾描述系统当前工作状态¾描述运行环境„这些信息将送到SQL通信区SQLCA中„应用程序从SQLCA中取出这些状态信息,据此决定接下来执行的语句AnIntroductiontoDatabaseSystemSQL通信区™SQLCA使用方法:ƒ定义SQLCA¾用EXECSQLINCLUDESQLCA定义ƒ使用SQLCA¾SQLCA中有一个存放每次执行SQL语句后返回代码的变量SQLCODE¾如果SQLCODE等于预定义的常量SUCCESS,则表示SQL语句成功,否则表示出错¾应用程序每执行完一条SQL语句之后都应该测试一下SQLCODE的值,以了解该SQL语句执行情况并做相应处理AnIntroductiontoDatabaseSystem二、主变量™主变量ƒ嵌入式SQL语句中可以使用主语言的程序变量来输入或输出数据ƒ在SQL语句中使用的主语言程序变量简称为主变量(HostVariable)AnIntroductiontoDatabaseSystem主变量(续)™主变量的类型ƒ输入主变量ƒ输出主变量ƒ一个主变量有可能既是输入主变量又是输出主变量AnIntroductiontoDatabaseSystem主变量(续)™指示变量:ƒ一个主变量可以附带一个指示变量(IndicatorVariable)ƒ什么是指示变量ƒ指示变量的用途AnIntroductiontoDatabaseSystem主变量(续)™在SQL语句中使用主变量和指示变量的方法ƒ1)说明主变量和指示变量BEGINDECLARESECTION..................(说明主变量和指示变量).........ENDDECLARESECTIONAnIntroductiontoDatabaseSystem主变量(续)ƒ2)使用主变量¾说明之后的主变量可以在SQL语句中任何一个能够使用表达式的地方出现¾为了与数据库对象名(表名、视图名、列名等)区别,SQL语句中的主变量名前要加冒号(:)作为标志ƒ3)使用指示变量¾指示变量前也必须加冒号标志¾必须紧跟在所指主变量之后AnIntroductiontoDatabaseSystem主变量(续)™在SQL语句之外(主语言语句中)使用主变量和指示变量的方法ƒ可以直接引用,不必加冒号AnIntroductiontoDatabaseSystem三、游标(cursor)™为什么要使用游标ƒSQL语言与主语言具有不同数据处理方式ƒSQL语言是面向集合的,一条SQL语句原则上可以产生或处理多条记录ƒ主语言是面向记录的,一组主变量一次只能存放一条记录ƒ仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求ƒ嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式AnIntroductiontoDatabaseSystem游标(续)™游标ƒ游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果ƒ每个游标区都有一个名字ƒ用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理AnIntroductiontoDatabaseSystem四、建立和关闭数据库连接™建立数据库连接EXECSQLCONNECTTOtarget[ASconnection-name][USERuser-name];target是要连接的数据库服务器:z常见的服务器标识串,如dbname@hostname:portz包含服务器标识的SQL串常量zDEFAULTconnect-name是可选的连接名,连接必须是一个有效的标识符在整个程序内只有一个连接时可以不指定连接名™关闭数据库连接EXECSQLDISCONNECT[connection];™程序运行过程中可以修改当前连接:EXECSQLSETCONNECTIONconnection-name|DEFAULT;AnIntroductiontoDatabaseSystem五、程序实例[例1]依次检查某个系的学生记录,交互式更新某些学生年龄。EXECSQLBEGINDECLARESECTION;/*主变量说明开始*/chardeptname[64];charHSno[64];charHSname[64];charHSsex[64];intHSage;intNEWAGE;EXECSQLENDDECLARESECTION;/*主变量说明结束*/longSQLCODE;EXECSQLINCLUDEsqlca;/*定义SQL通信区*/AnIntroductiontoDatabaseSystem程序实例(续)intmain(void)/*C语言主程序开始*/{intcount=0;charyn;/*变量yn代表yes或no*/printf(Pleasechoosethedepartmentname(CS/MA/IS):);scanf(%s,deptname);/*为主变量deptname赋值*/EXECSQLCONNECTTOTEST@localhost:54321USERSYSTEM/MANAGER;/*连接数据库TEST*/EXECSQLDECLARESXCURSORFOR/*定义游标*/SELECTSno,Sname,Ssex,Sage/*SX对应语句的执行结果*/FROMStudentWHERESDept=:deptname;EXECSQLOPENSX;/*打开游标SX便指向查询结果的第一行*/AnIntroductiontoDatabaseSystem程序实例(续)for(;;)/*用循环结构逐条处理结果集中的记录*/{EXECSQLFETCHSXINTO:HSno,:HSname,:HSsex,:HSage;/*推进游标,将当前数据放入主变量*/if(sqlca.sqlcode!=0)/*sqlcode!=0,表示操作不成功*/break;/*利用SQLCA中的状态信息决定何时退出循环*/if(count++==0)/*如果是第一行的话,先打出行头*/printf(\n%-10s%-20s%-10s%-10s\n,Sno,Sname,Ssex,Sage);printf(%-10s%-20s%-10s%-10d\n,HSno,HSname,HSsex,HSage);/*打印查询结果*/printf(UPDATEAGE(y/n)?);/*询问用户是否要更新该学生的年龄*/do{scanf(%c,&yn);}while(yn!='N'&&yn!='n'&&yn!='Y'&&yn!='y');AnIntroductiontoDatabaseSystem程序实例(续)if(yn=='y'||yn=='Y')/*如果选择更新操作*/{printf(INPUTNEWAGE:);scanf(%d,&NEWAGE);/*用户输入新年龄到主变量中*/EXECSQLUPDATEStudent/*嵌入式SQL*/SETSage=:NEWAGEWHERECURRENTOFSX;}/*对当前游标指向的学生年龄进行更新*/}EXECSQLCLOSESX;/*关闭游标SX不再和查询结果对应*/EXECSQLCOMMITWORK;/*提交更新*/EXECSQLDISCONNECTTEST;/*断开数据库连接*/}AnIntroductiontoDatabaseSystem8.1嵌入式SQL8.1.1嵌入式SQL的处理过程8.1.2嵌入式SQL语句与主语言之间的通信8.1.3不使用游标的SQL语句8.1.4使用游标的SQL语句8.1.5动态SQL8.1.6小结AnIntroductiontoDatabaseSystem8.1.3不用游标的SQL语句™不用游标的SQL语句的种类ƒ说明性语句ƒ数据定义语句ƒ数据控制语句ƒ查询结果为单记录的SELECT语句ƒ非CURRENT形式的增删改语句AnIntroductiontoDatabaseSystem不用游标的SQL语句(续)™一、查询结果为单记录的SELECT语句™二、非CURRENT形式的增删改语句AnIntroductiontoDatabaseSystem一、查询结果为单记录的SELECT语句™这类语句不需要使用游标,只需要用INTO子句指定存放查询结果的主变量[例2]根据学生号码查询学生信息。假设已经把要查询的学生的学号赋给了主变量givensno。EXECSQLSELECTSno,Sname,Ssex,Sage,SdeptINTO:Hsno,:Hname,:Hsex,:Hage,:HdeptFROMStudentWHERESno=:givensno;AnIntroductiontoDatabaseSystem查询结果为单记录的SELECT语句(续)(1)INTO子句、WHERE子句和HAVING短语的条件表达式中均可以使用主变量(2)查询返回的记录中,可能某些列为空值NULL。(3)如果查询结果实

1 / 139
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功