欢迎来到天天文库
浏览记录
ID:52848881
大小:146.31 KB
页数:25页
时间:2020-03-26
《崔巍 数据库系统及应用第4版0802游标.pptx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、游标与SQL的宿主使用SQL宿主使用面临的问题嵌入识别与预编译数据通讯区与主变量游标SQL宿主使用面临的问题嵌入识别问题:宿主语言的编译程序不能识别SQL语句,所以首要的问题就是要解决如何区分宿主语言的语句和SQL语句;宿主语言与SQL语言的数据交互问题:SQL语句的查询结果必须能够交给宿主语言处理,宿主语言的数据也要能够交给SQL语句使用;宿主语言的单记录与SQL的多记录的问题:宿主语言一般一次处理一条记录,而SQL常常处理的是记录(元组)的集合,这个矛盾必须解决。嵌入识别为SQL语句加一个特殊的前缀。常用的前缀格式是EXECSQL例如E
2、XECSQLINSERTINTO仓储.仓库VALUES('WH1','北京',500)编译系统认识此前缀?在用宿主语言的编译系统编译源程序之前,首先由预编译系统将SQL语句转换为宿主语言的合法函数调用。嵌入识别与预编译新的方法……在专门的数据库应用开发工具中,如PowerBuilder,已经完全将SQL语句纳入其中,只要求SQL语句用分号“;”做语句结束符,不再需要预编译。在面向对象的开发环境中则提供数据访问对象,通过数据访问对象的一组方法实现SQL语句的提交和数据库的访问。如使用SQLCONNECT函数连接数据库,使用SQLEXEC函数提
3、交和执行SQL语句等。数据交互问题程序变量的值如何传递给数据库字段?数据库字段的值如何传递给程序变量?引入数据通讯区和主变量的概念预定义的SQLCA完成SQL和宿主语言的通信,它类似于结构变量,各个分量分别反映SQL语句的各种执行状态。为此在程序中要包含语句INCLUDESQLCA宿主语言的变量称作主变量,并且冠以前缀,如“:area”,其中冒号是前缀SQL语句中使用主变量的例子UPDATE仓库SET面积=:areaWHERE仓库号=:whnumb宿主语言的单记录与SQL的多记录的问题把SQL查询的结果看作一个临时记录集合,然后让宿主程序逐
4、条读取和处理把这个临时记录集合称作cursor(游标)然后呢?如何实现和操作?回忆文件操作说明文件、打开文件、读文件、关闭文件游标(cursor)游标可以看作是临时文件,为此有如下语句DECLARECURSOR——说明游标(文件)OPEN——打开游标(文件)FETCH——从游标(文件)读一条记录CLOSE——关闭游标(文件)说明游标基本格式DECLARE<游标名>CURSORFOR游标可以看作是一个临时存储或临时文件,它的内容就是SELECT语句的查询结果。打开游标OPEN<游标名>从游标中读记录基本格式是FETCH<
5、游标名>[INTO<主变量1>,<主变量2>…]这里的游标必须是已经说明并打开了的,INTO后的主变量要与在DECLARECURSOR中SELECT的字段相对应。关闭游标CLOSE<游标名>游标被关闭后如果需要还可以用OPEN语句打开。释放、删除游标DEALLOCATE<游标名>当游标不再使用可以用该命令释放和删除与游标有关的所有数据结构和定义。游标概念归纳与程序设计语言中的文件相对照:DECLARECURSOR相当于说明了一个文件OPEN相当于打开文件FETCH相当于读一条记录CLOSE相当于关闭文件DEALLOCATE语句相当于删除文件
6、。例:传统的C语言程序段…EXECSQLBEGINDECLARESECTIONcharwhnumb[5]charcity[12]intwh_areaEXECSQLENDDECLARESECTION…EXECSQLDECLAREc1CURSORFORSELECT仓库号,城市,面积FROM仓库WHERE面积=:wh_areaEXECSQLOPENc1while(SQLCA.sqlcode<>100){EXECSQLFETCHc1INTO:whnumb,:city,:wh_area…}EXECSQLCLOSEc1…在T-SQL中使用游标使用全局变
7、量@@FETCH_STATUS来判断FETCH语句对游标的操作状态,取值如下:0:FETCH语句成功;-1:FETCH语句失败或行不在结果集中;-2:提取的行不存在。循环语句控制是否继续读游标WHILE@@FETCH_STATUS=0在T-SQL中用游标列出所有仓库记录DECLARE@whnoCHAR(6),@cityCHAR(10),@areaINTDECLAREwh_cursorCURSORFORSELECT仓库号,城市,面积FROM仓储.仓库OPENwh_cursorPRINT'--------仓库列表--------'PRINT'仓
8、库号所在城市仓库面积'FETCHFROMwh_cursorINTO@whno,@city,@areaWHILE@@FETCH_STATUS=0BEGINPRINT@whno+''
此文档下载收益归作者所有