嵌入式SQL补充.ppt

上传人:本田雅阁 文档编号:2899773 上传时间:2019-06-02 格式:PPT 页数:28 大小:221.02KB
返回 下载 相关 举报
嵌入式SQL补充.ppt_第1页
第1页 / 共28页
嵌入式SQL补充.ppt_第2页
第2页 / 共28页
嵌入式SQL补充.ppt_第3页
第3页 / 共28页
嵌入式SQL补充.ppt_第4页
第4页 / 共28页
嵌入式SQL补充.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《嵌入式SQL补充.ppt》由会员分享,可在线阅读,更多相关《嵌入式SQL补充.ppt(28页珍藏版)》请在三一文库上搜索。

1、第6章 数据库编程,嵌入式SQL,练习:,显示”王平“同学的学号和电话 查询“数据库设计”课程的任课教师工号 查询马建平授课的数据库设计班中“王一”的成绩,use ma_regi 1 Select id, name,phone from m_student where name=王一,use ma_regi 2 Select instructor$id from section where secton.code=(select code from course where title=“数据库设计”),Select student$id,section$call_no,grade from

2、m_enroll Where m_enroll.section$call_no= (Select call_no from m_section where instructor$id=(select id from m_instructor where name=马建平) and course$code=(select code from m_course where title=数据库设计),Select student$id,section$call_no,grade from m_enroll where m_enroll.student$id=(select id from m_stu

3、dent where name=王一) and m_enroll.section$call_no= (Select call_no from m_section where instructor$id=(select id from m_instructor where name=马建平) and course$code=(select code from m_course where title=数据库设计),10.1 SQL语言的运行环境,SQL有两种使用方式: 终端交互方式下使用交互式SQL 嵌入在高级语言中使用嵌入式SQL (高级语言可以是C,PASCAL,COBOL等,称为宿主语言)

4、,有些操作对于交互式SQL是不可能的任务。 SQL的表达能力相比高级语言有一定的限制,有些数据访问要求单纯使用SQL无法完成。 (1)SQL在逐渐增强自己的表达能力, (2)太多的扩展会导致优化能力及执行效率的降低。 非声明性动作 实际的应用系统是非常复杂的,数据库访问只是其中一个部件。有些动作如与用户交互、图形化显示数据等只能用高级语言实现。,为什么使用嵌入式SQL?,将SQL访问数据库的能力,与宿主语言的过程化处理的能力进行综合 将SQL语句嵌入宿主语言中 引入变量的使用,嵌入式SQL的实现,有两种方法: 扩充宿主语言的编译程序,使之能处理SQL语句; 预处理方式(常用) 预处理方式: 将

5、具有前缀的语句,转换成宿主语言的函数调用语句 由宿主语言的编译器生成目标程序,嵌入式SQL执行过程,嵌入式SQL语句与主语句之间的通信,数据库与源程序工作单元之间通信主要包括: 1.向主语言传递SQL语句的执行状态信息,使主语言能够据此控制程序流程,主要用SQL通信区实现;(SQL Communication Area,简称SQLCA) 2. 主语言向SQL语句提供参数,主要用主变量(host variable)实现; 3. 将SQL语句查询数据库的结果交主语言进一步处理,主要用主变量和游标(cursor)实现 SQL通信区, 主变量, 游标的概念,存储设备上的数据库是用SQL语句存取的,数据

6、库和宿主语言程序间信息的传递是通过共享变量实现的。,共享变量先由宿主语言程序定义,再用SQL的DECLARE语句声明,随后SQL语句就可引用这些变量。,共享变量是SQL和宿主语言的接口。,SQL规定,SQLSTATE是一个特殊的共享变量,起着解释SQL语句执行状况的作用,由5个字符组成的字符数组的标准(ISO)返回信息码。 SQLSTATE: 00000:成功 非0 :出错 02000:未找到元组 根据SQLSTATE的值可以控制程序的流向。,10.2 嵌入式SQL的使用规定,1、在程序中要区分SQL语句与宿主语言语句 嵌入的SQL语句以EXEC SQL开始,以分号(;) 或END_EXEC结

7、束(根据具体语言而定) EXEC SQL END_EXEC 举例: EXEC SQL delete from s where sno= s10;,2、允许嵌入的SQL语句引用宿主语言的程序变量(共享变量),但有以下规定: (1)、宿主变量出现于SQL语句中时,前面加(:)以区别数据库变量(列名)。 宿主变量可出现在SQL的数据操纵语句中可出现常数的任何地方,select等语句的into字句中。 例: EXEC SQL select SNAME ,AGE into :stu_name , :age from s where SNO = :input_no ;,(2).共享变量的用法:先由宿主语言

8、的程序定义,并用SQL的DECLARE语句说明。 EXEC SQL BEGIN DECLARE SECTION int stu_no; char stu_name30; int age; char SQLSTATE6 EXEC SQL END DECLARE SECTION EXEC SQL select sname , age into :stu_name ,:age from s where sno= :stu_no ;,(3) SQL的集合处理方式与宿主语言单记录处理方式之间的协调 SQL:一次一集合。 C语言:一次一记录。 游标:在查询结果的记录集合中移动的指针。 若一个SQL语句返回

9、单个元组,则不用游标。 若一个SQL语句返回多个元组,则使用游标。,需要游标的数据操作,当select语句的结果中包含多个元组时,使用游标可以逐个存取这些元组。 活动集:select语句返回的元组的集合。 当前行:活动集中当前处理的那一行。游标即是指向当前行的指针。 游标分类: 滚动游标:游标的位置可以来回移动,可在活动集中取任意元组。 非滚动游标:只能在活动集中顺序地取下一个元组。 更新游标:数据库对游标指向的当前行加锁,当程序读下一行数据时,本行数据解锁,下一行数据加锁。,需要游标的数据操作,游标的使用方法: 1、定义游标:定义一个游标,使之对应一个select语句。 EXEC_SQL D

10、ECLARE CURSOR FOR END_EXEC 2、打开游标:打开一个游标,执行游标对应的查询,结果集合为该游标的活动集。 EXEC SQL OPEN /执行查询 END_EXEC /定位于第一行的前一行,需要游标的数据操作,3、游标推进语句:在活动集中将游标移到特定的行,并取出该行数据放到相应的宿主变量中 EXEC SQL FETCH FROM INTO END_EXEC 4、游标关闭语句 :关闭游标,释放活动集及其所占资源,使它不再和查询结果相联系。需要再使用该游标时,执行open语句。 EXEC SQL CLOSE END_EXEC,10.3 嵌入式SQL的使用技术,1、不需要游标

11、的SQL操作 如果是insert、delete和update,加上前缀EXEC SQL 和END_EXEC 就可以嵌入在宿主语言中使用,对于select语句,如果已知结果为单元组,可以直接嵌入在主程序中使用。 1)结果是一个元组的select语句 EXEC SQL select SNAME ,AGE into :stu_name,:age from s where sno = s10;,不需要游标的数据操作,insert语句 EXEC SQL insert into s values (:stu_no, :stu_name , :stu_age , :stu_sex) ; delete语句 E

12、XEC SQL delete from s values age :stu_age ; update语句 EXEC SQL update sc set grade=grade+:raise where c# in(select c# from c where cname=MATHS) ;,(2)涉及游标的SQL DML语句 (Data Manipulation Language)数据操纵语言,1)select语句的使用方式,当select语句查询结果是多个元组时,要用游标把多个元组一次一次的传递给宿主语言程序处理;具体过程: 1、先定义一个游标与某个select语句对应。 2、打开游标(活动状

13、态),此时游标指向第一个元组之前。 3、每执行一次fetch语句,游标指向下一个元组,并把其值送到共享变量,供程序处理,如此重复,直到所有查询结果处理完毕。 4、最后用close语句关闭游标。,关闭的游标可以被重新打开,与新的查询结果相联系,没有打开前,不能使用。,2)对游标指向元组的修改或删除操作,在游标处于活动状态时,可以修改或删除游标指向的元组。,While(1) Exec sql Fetch FROM scx into :sno,:cno,:g if (NO_MORE_TUPLES) break; if(g60) Exec sql DELETE FROM sc WHERE CURREN

14、T OF scx; else if (g70) EXEC SQL UPDATE sc SET grade=70 WHERE CURRENT OF scx; g=70; printf(“sno:%s,cno:%s:%d”,sno,cno,g); ,(3)卷游标的定义和使用,上面的游标,在推进时只能沿查询结果中元组顺序从头到尾一行行推进,并且不能返回,不便。 SQL提供了卷游标,在推进卷游标时可以进退自如。 1)卷游标的定义: EXEC SQL DECLARE SCROLL CURSOR FOR END_EXEC,卷游标的打开和关闭与以前一样。 2)卷游标的推进语句: EXEC SQL FETCH NEXT | PRIOR | FIRST | LAST | CURRENT | RELATIVE N | ABSOLUTE M INTO END_EXEC,Relative 3:表示把游标从当前位置推进3行; Relative 5:表示把游标从当前位置返回5行; Absolute 4:表示把游标移向查询结果的第4行; Absolute 6:表示把游标移向查询结果的倒数第6行;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1