数据库系统概论(第五版)PPT第8章.ppt
- 文档编号:10022827
- 上传时间:2023-05-23
- 格式:PPT
- 页数:139
- 大小:745KB
数据库系统概论(第五版)PPT第8章.ppt
《数据库系统概论(第五版)PPT第8章.ppt》由会员分享,可在线阅读,更多相关《数据库系统概论(第五版)PPT第8章.ppt(139页珍藏版)》请在冰点文库上搜索。
,数据库系统概论AnIntroductiontoDatabaseSystem第八章数据库编程,xx大学信息学院,第八章数据库编程,8.1嵌入式SQL8.2过程化SQL8.3存储过程和函数8.4ODBC编程*8.5OLEDB*8.6JDBC编程8.7小结,8.1嵌入式SQL,SQL语言提供了两种不同的使用方式交互式嵌入式为什么要引入嵌入式SQLSQL语言是非过程性语言事务处理应用需要高级语言这两种方式细节上有差别,在程序设计的环境下,SQL语句要做某些必要的扩充,8.1嵌入式SQL,8.1.1嵌入式SQL的处理过程8.1.2嵌入式SQL语句与主语言之间的通信8.1.3不用游标的SQL语句8.1.4使用游标的SQL语句8.1.5动态SQL,8.1.1嵌入式SQL的处理过程,主语言嵌入式SQL是将SQL语句嵌入程序设计语言中,被嵌入的程序设计语言,如C、C+、Java,称为宿主语言,简称主语言。
处理过程预编译方法,嵌入式SQL的处理过程(续),关系数据库管理系统预处理程序转换嵌入式SQL语句为函数调用,含嵌入式SQL语句的主语言程序,转换后的主语言程序,主语言编译程序编译处理,目标语言程序,嵌入式SQL的处理过程(续),为了区分SQL语句与主语言语句,所有SQL语句必须加前缀EXECSQL,主语言为C语言时,语句格式:
EXECSQL;,8.1嵌入式SQL,8.1.1嵌入式SQL的处理过程8.1.2嵌入式SQL语句与主语言之间的通信8.1.3不用游标的SQL语句8.1.4使用游标的SQL语句8.1.5动态SQL,8.1.2嵌入式SQL语句与主语言之间的通信,将SQL嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句SQL语句描述性的面向集合的语句负责操纵数据库高级语言语句过程性的面向记录的语句负责控制逻辑流程它们之间应该如何通信?
嵌入式SQL语句与主语言之间的通信(续),数据库工作单元与源程序工作单元之间的通信
(1)向主语言传递SQL语句的执行状态信息,使主语言能够据此控制程序流程,主要用SQL通信区实现
(2)主语言向SQL语句提供参数,主要用主变量实现(3)将SQL语句查询数据库的结果交主语言处理,主要用主变量和游标实现,1.SQL通信区,SQLCA:
SQLCommunicationAreaSQLCA是一个数据结构SQLCA的用途SQL语句执行后,系统反馈给应用程序信息描述系统当前工作状态描述运行环境这些信息将送到SQL通信区中应用程序从SQL通信区中取出这些状态信息,据此决定接下来执行的语句,SQL通信区(续),SQLCA使用方法定义SQLCA用EXECSQLINCLUDESQLCA定义使用SQLCASQLCA中有一个存放每次执行SQL语句后返回代码的变量SQLCODE如果SQLCODE等于预定义的常量SUCCESS,则表示SQL语句成功,否则表示出错应用程序每执行完一条SQL语句之后都应该测试一下SQLCODE的值,以了解该SQL语句执行情况并做相应处理,2.主变量,主变量嵌入式SQL语句中可以使用主语言的程序变量来输入或输出数据在SQL语句中使用的主语言程序变量简称为主变量(HostVariable),主变量(续),主变量的类型输入主变量由应用程序对其赋值,SQL语句引用输出主变量由SQL语句对其赋值或设置状态信息,返回给应用程序,主变量(续),指示变量是一个整型变量,用来“指示”所指主变量的值或条件一个主变量可以附带一个指示变量(IndicatorVariable)指示变量的用途指示输入主变量是否为空值检测输出变量是否为空值,值是否被截断,主变量(续),在SQL语句中使用主变量和指示变量的方法说明主变量和指示变量BEGINDECLARESECTION.(说明主变量和指示变量).ENDDECLARESECTION,主变量(续),在SQL语句中使用主变量和指示变量的方法(续)使用主变量说明之后的主变量可以在SQL语句中任何一个能够使用表达式的地方出现为了与数据库对象名(表名、视图名、列名等)区别,SQL语句中的主变量名前要加冒号(:
)作为标志使用指示变量指示变量前也必须加冒号标志必须紧跟在所指主变量之后,主变量(续),在SQL语句之外(主语言语句中)使用主变量和指示变量的方法可以直接引用,不必加冒号,3.游标,为什么要使用游标SQL语言与主语言具有不同数据处理方式SQL语言是面向集合的,一条SQL语句原则上可以产生或处理多条记录主语言是面向记录的,一组主变量一次只能存放一条记录仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式,游标(续),游标游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果每个游标区都有一个名字用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理,4.建立和关闭数据库连接,
(1)建立数据库连接EXECSQLCONNECTTOtargetASconnection-nameUSERuser-name;target是要连接的数据库服务器常见的服务器标识串,如:
包含服务器标识的SQL串常量DEFAULT,建立和关闭数据库连接(续),connect-name是可选的连接名,连接名必须是一个有效的标识符在整个程序内只有一个连接时可以不指定连接名程序运行过程中可以修改当前连接EXECSQLSETCONNECTIONconnection-name|DEFAULT;,建立和关闭数据库连接(续),
(2)关闭数据库连接EXECSQLDISCONNECTconnection;,5.程序实例,例8.1依次检查某个系的学生记录,交互式更新某些学生年龄。
EXECSQLBEGINDECLARESECTION;/*主变量说明开始*/charDeptname20;charHsno9;charHsname20;charHssex2;intHSage;intNEWAGE;EXECSQLENDDECLARESECTION;/*主变量说明结束*/longSQLCODE;EXECSQLINCLUDESQLCA;/*定义SQL通信区*/,程序实例(续),intmain(void)/*C语言主程序开始*/intcount=0;charyn;/*变量yn代表yes或no*/printf(Pleasechoosethedepartmentname(CS/MA/IS):
);scanf(%s,deptname);/*为主变量deptname赋值*/EXECSQLCONNECTTOTESTlocalhost:
54321USERSYSTEM/MANAGER;/*连接数据库TEST*/EXECSQLDECLARESXCURSORFOR/*定义游标SX*/SELECTSno,Sname,Ssex,Sage/*SX对应的语句*/FROMStudentWHERESDept=:
deptname;EXECSQLOPENSX;/*打开游标SX,指向查询结果的第一行*/,程序实例(续),for(;)/*用循环结构逐条处理结果集中的记录*/EXECSQLFETCHSXINTO:
HSno,:
Hsname,:
HSsex,:
HSage;/*推进游标,将当前数据放入主变量*/if(SQLCA.SQLCODE!
=0)/*SQLCODE!
=0,表示操作不成功*/break;/*利用SQLCA中的状态信息决定何时退出循环*/if(count+=0)/*如果是第一行的话,先打出行头*/printf(n%-10s%-20s%-10s%-10sn,Sno“,Sname“,Ssex,Sage);printf(%-10s%-20s%-10s%-10dn“,HSno,Hsname,Hssex,HSage);/*打印查询结果*/printf(“UPDATEAGE(y/n)?
”);/*询问用户是否要更新该学生的年龄*/doscanf(%c,程序实例(续),if(yn=y|yn=Y)/*如果选择更新操作*/printf(INPUTNEWAGE:
);scanf(%d,/*断开数据库连接*/,8.1嵌入式SQL,8.1.1嵌入式SQL的处理过程8.1.2嵌入式SQL语句与主语言之间的通信8.1.3不用游标的SQL语句8.1.4使用游标的SQL语句8.1.5动态SQL,8.1.3不用游标的SQL语句,不用游标的SQL语句的种类说明性语句数据定义语句数据控制语句查询结果为单记录的SELECT语句非CURRENT形式的增删改语句,不用游标的SQL语句(续),1.查询结果为单记录的SELECT语句2.非CURRENT形式的增删改语句,1.查询结果为单记录的SELECT语句,这类语句不需要使用游标,只需用INTO子句指定存放查询结果的主变量。
例8.2根据学生号码查询学生信息。
EXECSQLSELECTSno,Sname,Ssex,Sage,SdeptINTO:
Hsno,:
Hname,:
Hsex,:
Hage,:
HdeptFROMStudentWHERESno=:
givensno;/*把要查询的学生的学号赋给为了主变量givensno*/,查询结果为单记录的SELECT语句(续),INTO子句、WHERE子句和HAVING短语的条件表达式中均可以使用主变量查询返回的记录中,可能某些列为空值NULL如果查询结果实际上并不是单条记录,而是多条记录,则程序出错,关系数据库管理系统会在SQLCA中返回错误信息,查询结果为单记录的SELECT语句(续),例8.3查询某个学生选修某门课程的成绩。
假设已经把将要查询的学生的学号赋给了主变量givensno,将课程号赋给了主变量givencno。
EXECSQLSELECTSno,Cno,GradeINTO:
Hsno,:
Hcno,:
Hgrade:
Gradeid/*指示变量Gradeid*/FROMSCWHERESno=:
givensnoANDCno=:
givencno;如果Gradeid0,不论Hgrade为何值,均认为该学生成绩为空值。
2.非CURRENT形式的增删改语句,在UPDATE的SET子句和WHERE子句中可以使用主变量,SET子句还可以使用指示变量例8.4修改某个学生选修1号课程的成绩。
EXECSQLUPDATESCSETGrade=:
newgrade/*修改的成绩已赋给主变量:
newgrade*/WHERESno=:
givensno;/*学号赋给主变量:
givensno*/,非CURRENT形式的增删改语句(续),例8.5某个学生新选修了某门课程,将有关记录插入SC表中。
假设插入的学号已赋给主变量stdno,课程号已赋给主变量couno。
gradeid=-1;/*gradeid为指示变量,赋为负值*/EXECSQLINSERTINTOSC(Sno,Cno,Grade)VALUES(:
stdno,:
couno,:
gr:
gradeid);/*:
stdno,:
couno,:
gr为主变量*/由于该学生刚选修课程,成绩应为空,所以要把指示变量赋为负值,8.1嵌入式SQL,8.1.1嵌入式SQL的处理过程8.1.2嵌入式SQL语句与主语言之间的通信8.1.3不用游标的SQL语句8.1.4使用游标的SQL语句8.1.5动态SQL,8.1.4使用游标的SQL语句,必须使用游标的SQL语句查询结果为多条记录的SELECT语句CURRENT形式的UPDATE语句CURRENT形式的DELETE语句,使用游标的SQL语句(续),1.查询结果为多条记录的SELECT语句2.CURRENT形式的UPDATE和DELETE语句,1.查询结果为多条记录的SELECT语句,使用游标的步骤
(1)说明游标
(2)打开游标(3)推进游标指针并取当前记录(4)关闭游标,
(1)说明游标,使用DECLARE语句语句格式EXECSQLDECLARECURSORFOR;功能是一条说明性语句,这时关系数据库管理系统并不执行SELECT语句,
(2)打开游标,使用OPEN语句语句格式EXECSQLOPEN;功能打开游标实际上是执行相应的SELECT语句,把查询结果取到缓冲区中这时游标处于活动状态,指针指向查询结果集中的第一条记录,(3)推进游标指针并取当前记录,使用FETCH语句语句格式EXECSQLFETCHINTO,.;功能指定方向推动游标指针,同时将缓冲区中的当前记录取出来送至主变量供主语言进一步处理,(4)关闭游标,使用CLOSE语句语句格式EXECSQLCLOSE;功能关闭游标,释放结果集占用的缓冲区及其他资源说明游标被关闭后,就不再和原来的查询结果集相联系被关闭的游标可以再次被打开,与新的查询结果相联系,2.CURRENT形式的UPDATE语句和DELETE语句,CURRENT形式的UPDATE语句和DELETE语句的用途非CURRENT形式的UPDATE语句和DELETE语句面向集合的操作一次修改或删除所有满足条件的记录,CURRENT形式的UPDATE语句和DELETE语句(续),CURRENT形式的UPDATE语句和DELETE语句的用途(续)如果只想修改或删除其中某个记录用带游标的SELECT语句查出所有满足条件的记录从中进一步找出要修改或删除的记录用CURRENT形式的UPDATE语句和DELETE语句修改或删除之UPDATE语句和DELETE语句中要用子句WHERECURRENTOF表示修改或删除的是最近一次取出的记录,即游标指针指向的记录,CURRENT形式的UPDATE语句和DELETE语句(续),不能使用CURRENT形式的UPDATE语句和DELETE语句当游标定义中的SELECT语句带有UNION或ORDERBY子句该SELECT语句相当于定义了一个不可更新的视图,8.1嵌入式SQL,8.1.1嵌入式SQL的处理过程8.1.2嵌入式SQL语句与主语言之间的通信8.1.3不用游标的SQL语句8.1.4使用游标的SQL语句8.1.5动态SQL,8.1.5动态SQL,静态嵌入式SQL静态嵌入式SQL语句能够满足一般要求无法满足要到执行时才能够确定要提交的SQL语句、查询的条件动态嵌入式SQL允许在程序运行过程中临时“组装”SQL语句支持动态组装SQL语句和动态参数两种形式,动态SQL(续),1.使用SQL语句主变量2.动态参数3.执行准备好的语句(EXECUTE),1.使用SQL语句主变量,SQL语句主变量程序主变量包含的内容是SQL语句的内容,而不是原来保存数据的输入或输出变量SQL语句主变量在程序执行期间可以设定不同的SQL语句,然后立即执行,使用SQL语句主变量(续),例8.6创建基本表TEST。
EXECSQLBEGINDECLARESECTION;constchar*stmt=CREATETABLEtest(aint);/*SQL语句主变量,内容是创建表的SQL语句*/EXECSQLENDDECLARESECTION;.EXECSQLEXECUTEIMMEDIATE:
stmt;/*执行动态SQL语句*/,2.动态参数,动态参数SQL语句中的可变元素使用参数符号(?
)表示该位置的数据在运行时设定和主变量的区别动态参数的输入不是编译时完成绑定而是通过PREPARE语句准备主变量和执行语句EXECUTE绑定数据或主变量来完成,动态参数(续),使用动态参数的步骤
(1)声明SQL语句主变量
(2)准备SQL语句(PREPARE)EXECSQLPREPAREFROM;,3.执行准备好的语句(EXECUTE),EXECSQLEXECUTEINTOUSING;,执行准备好的语句(EXECUTE)(续),例8.7向TEST中插入元组。
EXECSQLBEGINDECLARESECTION;constchar*stmt=INSERTINTOtestVALUES(?
);/*声明SQL主变量内容是INSERT语句*/EXECSQLENDDECLARESECTION;.EXECSQLPREPAREmystmtFROM:
stmt;/*准备语句*/.EXECSQLEXECUTEmystmtUSING100;/*执行语句,设定INSERT语句插入值100*/EXECSQLEXECUTEmystmtUSING200;/*执行语句,设定INSERT语句插入值200*/,第八章数据库编程,8.1嵌入式SQL8.2过程化SQL8.3存储过程和函数8.4ODBC编程*8.5OLEDB*8.6JDBC编程8.7小结,8.2过程化SQL,8.2.1过程化SQL的块结构8.2.2变量和常量的定义8.2.3流程控制,8.2.1过程化SQL的块结构,过程化SQLSQL的扩展增加了过程化语句功能基本结构是块块之间可以互相嵌套每个块完成一个逻辑操作,过程化SQL的块结构(续),过程化SQL块的基本结构1.定义部分DECLARE变量、常量、游标、异常等定义的变量、常量等只能在该基本块中使用当基本块执行结束时,定义就不再存在,过程化SQL的块结构(续),过程化SQL块的基本结构(续)2.执行部分BEGINSQL语句、过程化SQL的流程控制语句EXCEPTION异常处理部分END;,8.2过程化SQL,8.2.1过程化SQL的块结构8.2.2变量和常量的定义8.2.3流程控制,8.2.2变量和常量的定义,1.变量定义变量名数据类型NOTNULL:
=初值表达式或变量名数据类型NOTNULL初值表达式2.常量定义常量名数据类型CONSTANT:
=常量表达式常量必须要给一个值,并且该值在存在期间或常量的作用域内不能改变。
如果试图修改它,过程化SQL将返回一个异常3.赋值语句变量名称:
=表达式,8.2过程化SQL,8.2.1过程化SQL的块结构8.2.2变量和常量的定义8.2.3流程控制,8.2.3流程控制,过程化SQL功能1.条件控制语句2.循环控制语句3.错误处理,流程控制(续),1.条件控制语句IF-THEN,IF-THEN-ELSE和嵌套的IF语句
(1)IFconditionTHENSequence_of_statements;ENDIF;
(2)IFconditionTHENSequence_of_statements1;ELSESequence_of_statements2;ENDIF;(3)在THEN和ELSE子句中还可以再包含IF语句,即IF语句可以嵌套,流程控制(续),2.循环控制语句LOOP,WHILE-LOOP和FOR-LOOP
(1)简单的循环语句LOOPLOOPSequence_of_statements;ENDLOOP;多数数据库服务器的过程化SQL都提供EXIT、BREAK或LEAVE等循环结束语句,保证LOOP语句块能够结束,流程控制(续),2.循环控制语句(续)
(2)WHILE-LOOPWHILEconditionLOOPSequence_of_statements;ENDLOOP;每次执行循环体语句之前,首先对条件进行求值如果条件为真,则执行循环体内的语句序列如果条件为假,则跳过循环并把控制传递给下一个语句,流程控制(续),2.循环控制语句(续)(3)FOR-LOOPFORcountINREVERSEbound1bound2LOOPSequence_of_statements;ENDLOOP;,流程控制(续),3.错误处理如果过程化SQL在执行时出现异常,则应该让程序在产生异常的语句处停下来,根据异常的类型去执行异常处理语句SQL标准对数据库服务器提供什么样的异常处理做出了建议,要求过程化SQL管理器提供完善的异常处理机制,第八章数据库编程,8.1嵌入式SQL8.2过程化SQL8.3存储过程和函数8.4ODBC编程*8.5OLEDB*8.6JDBC编程8.7小结,8.3存储过程和函数,8.3.1存储过程8.3.2函数*8.3.3过程化SQL中的游标,8.3.1存储过程,过程化SQL块类型命名块编译后保存在数据库中,可以被反复调用,运行速度较快,过程和函数是命名块匿名块每次执行时都要进行编译,它不能被存储到数据库中,也不能在其他过程化SQL块中调用,存储过程(续),1.存储过程的优点2.存储过程的用户接口,存储过程(续),存储过程:
由过程化SQL语句书写的过程,经编译和优化后存储在数据库服务器中,使用时只要调用即可。
存储过程的优点
(1)运行效率高
(2)降低了客户机和服务器之间的通信量(3)方便实施企业规则,存储过程(续),存储过程的用户接口
(1)创建存储过程
(2)执行存储过程(3)修改存储过程(4)删除存储过程,2.存储过程的用户接口,
(1)创建存储过程CREATEORREPLACEPROCEDURE过程名(参数1,参数2,.)AS;过程名:
数据库服务器合法的对象标识参数列表:
用名字来标识调用时给出的参数值,必须指定值的数据类型。
参数也可以定义输入参数、输出参数或输入/输出参数,默认为输入参数过程体:
是一个,包括声明部分和可执行语句部分,存储过程的用户接口(续),例8.8利用存储过程来实现下面的应用:
从账户1转指定数额的款项到账户2中。
CREATEORREPLACEPROCEDURETRANSFER(inAccountINT,outAccountINT,amountFLOAT)/*定义存储过程TRANSFER,其参数为转入账户、转出账户、转账额度*/ASDECLARE/*定义变量*/totalDepositOutFloat;totalDepositInFloat;inAccountnumINT;,存储过程的用户接口(续),BEGIN/*检查转出账户的余额*/SELECTTotalINTOtotalDepositOutFROMAccoutWHEREaccountnum=outAccount;IFtotalDepositOutISNULLTHEN/*如果转出账户不存在或账户中没有存款*/ROLLBACK;/*回滚事务*/RETURN;ENDIF;,存储过程的用户接口(续),IFtotalDepositOutamountTHEN/*如果账户存款不足*/ROLLBACK;/*回滚事务*/RETURN;ENDIF;SELECTAccountnumINTOinAccountnumFROMAccountWHEREaccountnum=inAccount;IFinAccountISNULLTHEN/*如果转入账户不存在*/ROLLBACK;/*回滚事务*/RETURN;ENDIF;,存储过程的用户接口(续),UPDATEAccountSETtotal=total-amountWHEREaccountnum=outAccount;/*修改转出账户余额,减去转出额*/UPDATEAccountSETtotal=total+amountWHEREaccountnum=inAccount;/*修改转入账户余额,增加转入额*/COMMIT;/*提交转账事务*/END;,存储过程的用户接口(续),
(2)执行存储过程CALL/PERFORMPROCEDURE过程名(参数1,参数2,.);使用CALL或者PERFORM等方式激活存储过程的执行在过程化SQL中,数据库
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 系统 概论 第五 PPT