数据库系统概念6版高级SQL

上传人:宝路 文档编号:48021035 上传时间:2018-07-08 格式:PPT 页数:73 大小:433.83KB
返回 下载 相关 举报
数据库系统概念6版高级SQL_第1页
第1页 / 共73页
数据库系统概念6版高级SQL_第2页
第2页 / 共73页
数据库系统概念6版高级SQL_第3页
第3页 / 共73页
数据库系统概念6版高级SQL_第4页
第4页 / 共73页
数据库系统概念6版高级SQL_第5页
第5页 / 共73页
点击查看更多>>
资源描述

《数据库系统概念6版高级SQL》由会员分享,可在线阅读,更多相关《数据库系统概念6版高级SQL(73页珍藏版)》请在金锄头文库上搜索。

1、 4.4 嵌入式SQLl为什么使用嵌入式SQL?l嵌入式SQL执行过程l需要解决的几个问题为什么使用嵌入式SQL?l有些操作对于交互式SQL是不可能的任务 SQL的表达能力相比高级语言有一定的限制,有些 数据访问要求单纯使用SQL无法完成。一方面, SQL在逐渐增强自己的表达能力(参见习题4.10) ,另一方面,太多的扩展会导致优化能力及执行效 率的降低l非声明性动作 实际的应用系统是非常复杂的,数据库访问只是其 中一个部件。有些动作如与用户交互、图形化显示 数据等只能用高级语言实现嵌入式SQL执行过程主语言 + 嵌入SQL 预处理 主语言 + 函数调用 主语言编译器 主语言执行程序 需要解决

2、的几个问题l区分SQL语句与C语言语句嵌入的SQL语句以EXEC SQL开始,以分号(;) 或 END_EXEC结束EXEC SQL delete from PROF where DNO = 10;需要解决的几个问题l嵌入SQL语句与C语言之间的数据传递 宿主变量lC变量,既可以用在C语句中,也可用在SQL语句中,用来在 两者之间传递数据 宿主变量的声明l声明为通常的C变量,并将其放在下列标识语句之间EXEC SQL BEGIN DECLARE SECTIONEXEC SQL END DECLARE SECTION需要解决的几个问题EXEC SQL BEGIN DECLARE SECTIONi

3、nt prof_no;char prof_name30;int salary;EXEC SQL END DECLARE SECTION需要解决的几个问题注:宿主变量出现于SQL语句中时,前面加(:)以 区别列名 宿主变量可出现的地方:SQL的数据操纵语句中可 出现常数的任何地方,select,fetch等语句的into 子句中示例:EXEC SQL select PNAME , SALinto :prof_name , :salaryfrom PROFwhere PNO = :prof_no ; 需要解决的几个问题lSQL与主语言之间操作方式的协调 执行方式的差别lSQL:一次一集合lC语言:

4、一次一记录 游标l在查询结果的记录集合中移动的指针l若一个SQL语句返回单个元组,则不用游标l若一个SQL语句返回多个元组,则使用游标需要解决的几个问题不需要游标的数据操作l结果是一个元组的select语句EXEC SQL select PNAME , SALinto :prof_name, :salaryfrom PROFwhere PNO = :prof_no ;需要解决的几个问题linsert语句EXEC SQL insert into PROF values (:prof_no, :prof_name , :salary , :dept_no , : salary) ;ldelete语

5、句EXEC SQL delete from PROFwhere PNO :prof_no ;lupdate语句EXEC SQL update PROF set SAL = :salarywhere PNO = : prof_no ;需要解决的几个问题 需要游标的数据操作 当select语句的结果中包含多个元组时,使用游标 可以逐个存取这些元组 活动集:select语句返回的元组的集合 当前行:活动集中当前处理的那一行。游标即是指 向当前行的指针需要解决的几个问题 定义与使用游标的语句ldeclare定义一个游标,使之对应一个select语句declare 游标名 cursor forselec

6、t语句for update of列表名for update:该游标可用于对当前行的修改删除lopen打开游标,执行对应的查询,结果集为该游标的活动集open 游标名需要解决的几个问题lfetch在活动集中将游标移到特定的行,并取出该行数据放到 相应的宿主变量中fetch 游标名 into 宿主变量表lclose关闭游标,释放活动集及其所占资源。需要再使用该游 标时,执行open语句close 游标名需要解决的几个问题 推进游标指针 EXEC SQL FETCH INTO ,. FETCH语句通常用在一个循环结构中,逐条取出结 果集中的记录进行处理。许多关系数据库管理系统 对FETCH语句做了扩

7、充,允许向任意方向以任意步 长移动游标指针。 关闭游标 EXEC SQL CLOSE 释放缓冲区及其他资源。需要解决的几个问题说明游标 EXEC SQL DECLARE CURSOR FOR 其中SELECT语句可以是简单查询,也可以是 复杂的连接查询和嵌套查询。 打开游标 EXEC SQL OPEN 执行相应的SELECT语句,把查询记录取到缓 冲区中。这时游标处于活动状态,指针指向查 询结果集中第一条记录。 需要解决的几个问题lSQL语句执行信息反馈 良好的应用程序必须提供对错误的处理,应用程序需要知道 SQL语句是否正确执行了,发生错误时的错误代码,执行时 遇到特殊情况时的警告信息 SQ

8、L通讯域SQLCA是一结构,每一嵌入SQL语句的执行情况在 其执行完成后写入SQLCA结构中的各变量中, 根据SQLCA中 的内容可以获得每一嵌入SQL语句执行后的信息,应用程序 就可以做相应的处理 在PB中,一个SQL语句执行结束后,SQLCA.SQLCODE=0 ,100,-1分别表示执行成功,未查找到符合条件的元组, 执行出错PB中的游标Declare cur_a cursor forSelect a,b,c from; Open cur_a; If sqlca.sqlcode0 then return嵌入式 SQL 编程l嵌入式SQL语句与主语言之间的通信过 程l1数据库工作单元与源程

9、序工作单元之 间通信主要包括:l 向主语言传递SQL语句的执行状态信 息,使主语言能够据此控制程序流程。l 主语言向SQL语句提供参数。l 将SQL语句查询数据库的结果交主语 言进一步处理。嵌入式 SQL 编程l2嵌入式SQL与主语言之间通信的实现lSQL语句通过SQL通信区SQLCA(SQL communiction area)向主语言传递SQL执 行状态信息。l主语言通过自己的主变量(host vaiable) 向SQL语句输入数据参数。l 两者数据传送通过主变量和游标 (crusor)实现。嵌入式 SQL 编程l3SQL通信区lSQL语句执行后,系统将当前工作状态送到 SQL通信区SQL

10、CA中。应用程序从SQLCA中取 出这些状态信息,据此决定接下来执行的语句 。l主语言程序中用EXEC SQL INCLUDE SQLCA定 义通信区。lSQLCA中有一个返回代码的变量SQLCODE。 执行完一条SQL语句后可以测试一下SQLCODE 的值,如果是SUCCESS,则表示SQL语句成功 ,否则表示错误。嵌入式 SQL 编程l4主变量l在SQL语句中使用的主语言程序的变量称为主 变量。l输入主变量由主语言程序对其赋值,SQL语句 引用。l输出主变量由SQL语句对其赋值,返回给主语 言程序。l一个主变量附带一个任选的指示变量, 整型变 量,指示主变量的值或条件。输入主变量可以 利用

11、指示变量赋空值,输出主变量可以利用指 示变量检测出是否空值,值是否被截断。嵌入式 SQL 编程举例l 例 查询某个系全体学生的信息。系名在 主程序中指定。EXEC SQL INCLUDE SQLCA EXEC SQL BEGIN DECLARE SECTIONCHAR deptname (20)CHAR HSno (6)CHAR HSnmae (8) CHAR HSsex (2)嵌入式 SQL 编程举例CHAR HSdept (20) INT HSage EXEC SQL END DECLARE SECTION; main() WHILE (gets(deptname != NULL)嵌入式

12、SQL 编程举例EXEC SQL DECLARE SX CURSOR FORSELECT Sno,Sname,Ssex,Sage,Sdept FROM Student WHERE Sdept=:deptnameEXEC SQL OPEN SX WHILE(1) EXEC SQL FETCH SX INTO嵌入式 SQL 编程举例:HSno,:HSname,:HSsex,:Hsage,:HSdeptif (sqlca.sqlcodeSUCCESS)break; printf(“%s, %s, %s,%d,%s“, HSno,HSname,HSsex,Hsage,HSdept);printf(“修

13、改该学生的年龄?”); 嵌入式 SQL 编程举例scanf(“%c”,if(yn=y or yn=Y)printf(“输入新的年龄:“)scanf(“%d“, EXEC SQL UPDATE StudentSET Sage=:NEWAgeWHERE CURRENT OF SX; 嵌入式 SQL 编程举例;EXEC SQL CLOSE SX;End ;lUPDATE语句分为CURRENT形式和非 CURRENT形式,非CURRENT形式是集合 操作,一次修改所有满足条件的记录。 CURRENT形式只修改其中某个记录。 嵌入式 SQL 编程举例l例 删除某些学生的记录。.EXEC SQL DECL

14、ARE SX CURSOR FORSELECT Sno,Sname,Ssex,SageFROM StudentWHERE SDept=:deptname;EXEC SQL OPEN SX WHILE(1) 嵌入式 SQL 编程举例EXEC SQL FETCH SX INTO :HSno, :HSname, :HSsex, :HSage, :HSdept;if(sqlca.sqlcode 1.1 * orow.SAL)begin atomicsignal SQLSTATE( 7500 ,Salary increase 10%)end触发器举例当帐户透支时,将帐户余额设为0,并建一笔贷款,其金额为

15、透支额create trigger overdraft-trigger after update on account referencing new row as nrow for each row when nrow.balance 0 begin atomicinsert into borrower (select customer-name, account-numberfrom depositorwhere nrow.account-number = depositor.account-number);insert into loan values(nrow.account-number, nrow.branch-name, nrow.balance);update account set balance = 0 where account.account-number = nrow.account-number end5.6 OLAPl数据仓库的主要任务是OLAP(联机分 析处理) lOLTP面向客户、办事员、操作员的事 务和查询处理lOLAP面向经理、主管、分析人员的数 据分析lOLTP处理的数据是基本表中的元组数 据lOLAP处理的数据是不同粒度的汇总数 据OLAP综述lOLTP采用E-R模型和面向应用的数据 库设计 lOLA

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 教学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号