在应用中使用SQL-PPT课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《在应用中使用SQL-PPT课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 应用 使用 SQL PPT 课件
- 资源描述:
-
1、第7章 在应用中使用SQL7.1 嵌入式嵌入式SQL7.2 存储过程存储过程7.3 ODBC简介简介7.4 JDBC简介简介7.5 触发器触发器7.6 小结小结7.1 嵌入式嵌入式SQL 在高级程序设计语言中使用SQL语句操纵数据库需要解决两个问题:采用某种语法形式使得编译程序可以区分SQL语句和宿主语言的语句;提供一种机制使得SQL语言和宿主语言之间可以交换数据和执行状态。7.1 嵌入式嵌入式SQL 7.1.1嵌入式嵌入式SQL的一般形式的一般形式 在嵌入式SQL中,为了能够区分SQL语句与宿主语言语句,所有SQL语句都必须加前缀EXEC SQL。例如, EXEC SQL DROP TABL
2、E SC; EXEC SQL SELECT * FROM Student; EXEC SQL GRANT UPDATE ON Student TO User1;7.1 嵌入式嵌入式SQL 7.1.1嵌入式嵌入式SQL的一般形式的一般形式 为了不修改宿主语言的编译器,DBMS提供一个预编译器,预编译器识别嵌入式SQL语句,将它们换成SQL函数库中的函数调用,将最初的宿主语言和嵌入式SQL的混合体转换成纯宿主语言的代码,然后由编译器进行通常的编译和连接操作,最终生成可执行代码,完成过程控制和数据库操作,具体过程如图7.1所示。7.1 嵌入式嵌入式SQLHost language+Embedded
3、SQLPreprocessorHost language+Function callsCompilerObject-codeProgramSQL library图7.1 嵌入式SQL的处理过程7.1 嵌入式嵌入式SQL 7.1.2 嵌入式嵌入式SQL语句与宿主语言的通信语句与宿主语言的通信 将SQL嵌入到高级语言中混合编程,SQL语句负责操纵数据库,高级语言语句负责控制程序流程。这时程序中含有两种不同计算模型的语句,一种是描述性的面向集合的SQL语句,一种是过程性的高级语言语句,SQL标准主要使用宿主变量在它们之间互相交换数据,进行通信。7.1 嵌入式嵌入式SQL 宿主变量使用声明节(decl
4、are section)定义宿主变量,格式如下: EXEC SQL BEGIN DECLARE SECTION 按照宿主语言的语法定义的变量 EXEC SQL END DECLARE SECTION7.1 嵌入式嵌入式SQL 7.1.2 嵌入式SQL语句与宿主语言之间的通信例如:EXEC SQL BEGIN DECLARE SECTIONcharSno8;charSname9;charSsex3;shortSage;charSdept21;charSQLSTATE6;EXEC SQL END DECLARE SECTION7.1 嵌入式嵌入式SQL7.1.3 查询结果为单个记录的查询结果为单个
5、记录的SELECT语句语句 在嵌入式SQL中,查询结果为单个记录的SELECT语句使用INTO子句把查询结果传送到宿主变量,供宿主语言继续处理。该语句的一般格式为: 7.1 嵌入式嵌入式SQLEXEC SQL SELECT ALL|DISTINCT , INTO , FROM , WHERE GROUP BY HAVING ORDER BY ASC|DESC;7.1 嵌入式嵌入式SQL7.1.3 查询结果为单个记录的查询结果为单个记录的SELECT语句语句 1.INTO子句、WHERE子句的条件表达式、HAVING短语的的条件表达式中均可以使用宿主变量。 2.查询返回的记录中,可能某些列为空值
6、。如果INTO子句中宿主变量后面跟有指示变量,则当查询得出的某个数据项为空值时,系统会自动将相应宿主变量后面的指示变量置为负值,不再向宿主变量赋值。 7.1 嵌入式嵌入式SQL7.1.3 查询结果为单个记录的查询结果为单个记录的SELECT语句语句 3.如果查询结果实际上并不是单条记录,而是多条记录,则程序出错,DBMS将SQLSTATE的值设置为21000。7.1 嵌入式嵌入式SQL例例 1 查询某个学生的信息,这个学生的学号存放在宿主变量Sno中,并且将查询得到的学生信息存放到上一小节定义的变量中。EXEC SQL SELECT Sname, Ssex, Sage, SdeptINTO :
7、Sname, :Ssex, :Sage, :SdeptFROM StudentWHERE Sno= :Sno;7.1 嵌入式嵌入式SQL例例 2 查询某个学生选修某门课程的成绩。由于学生的成绩可能是空值,使用了指示变量gradenullflag。EXEC SQL SELECT GradeINTO :grade :gradenullfalgFROM SCWHERE Sno=:Sno AND Cno=:Cno;7.1 嵌入式嵌入式SQL7.1.4 游标游标 SQL语言与宿主语言有不同的数据处理方式。SQL语言是面向集合的,一条SQL语句将产生或处理多条记录。而宿主语言是面向记录的,一组宿主变量一次
8、只能存放一条记录。所以仅使用宿主变量并不能完全满足SQL语句向应用程序输出数据的要求,为此SQL引入了游标的概念,用游标来协调这两种不同的处理方式。7.1 嵌入式嵌入式SQL 游标(Cursor)是系统开设的一个数据缓冲区,存放SQL语句的执行结果。游标有一个名字,可以通过游标逐一获取记录,并赋予宿主语言的宿主变量,交由宿主语言进一步处理。如图7.2。7.1 嵌入式嵌入式SQL记录1记录2记录n游标图7.2游标示意图游标包括以下两个部分:1、游标结果集(cursor result set) 由定义游标的SELECT语句返回的行的集合。2、游标的位置(cursor position) 指向这个集
9、合中某一行的指针。7.1 嵌入式嵌入式SQL一、使用游标读取数据一、使用游标读取数据使用游标处理数据的流程如图7.3。是否使用DECLARE CURSOR语句声明游标使用OPEN语句打开游标使用FETCH INTO语句从游标中提取数据使用CLOSE语句关闭游标最后一个元组?图7.3使用游标的一般过程7.1 嵌入式嵌入式SQL1、声明游标、声明游标格式:EXEC SQL DECLARE cursor-name INSENSITIVE SCROLL CURSORFOR SELECT statement FOR READ ONLY SELECT语句定义了游标结果集,游标名用于对游标的各种操作。使用I
10、NSENSITIVE通知DBMS在游标存续期间,不允许其它的事务修改游标结果集中的数据。7.1 嵌入式嵌入式SQL 如果游标不修改数据库中的数据,使用FOR READ ONLY告知DBMS,DBMS将允许这样的游标和INSENSITIVE类型的游标并发执行。 默认情况下,游标采用顺序处理的方式,依次处理结果集中的记录。根据需要,也可以将游标定义为滚动(SCROLL)游标。对滚动游标,SQL提供了若干命令将游标移动到希望的位置。7.1 嵌入式嵌入式SQLnext 把游标移动到当前游标所指下一个记录prior 把游标移动到当前游标所指上一个记录first 把游标移动到第一个记录last 把游标移动
11、到最后一个记录7.1 嵌入式嵌入式SQLabsolute n 如果n是一个正整数,把游标移动到从前往后计数的第n个记录;如果n是一个负整数,把游标移动到从后数的第n个记录。relative n 如果n是一个正整数,把游标移动相对于当前游标所指记录之后的第n个记录;如果n是一个负整数,把游标移动相对于当前游标所指记录之前的第n个记录。7.1 嵌入式嵌入式SQL例例 3 声明存取计算机系全体学生的游标。EXEC SQL DECLARE dept_computer CURSORFOR SELECT *FROM StudentWHERE Sdept= 计算机FOR READ ONLY;7.1 嵌入式嵌
12、入式SQL2、打开游标、打开游标格式:EXEC SQL OPEN ; 打开游标后,DBMS执行与游标相关联的SELECT语句,并把查询结果存放到游标中,游标指向第1个记录。例如,EXEC SQL OPEN dept_computer;图7.4 游标dept_computer的内容2000012,王林,男,19,计算机游标2000014,葛波,女,18,计算机7.1 嵌入式嵌入式SQL3、存取游标、存取游标 如果游标不是滚动游标,使用FETCH语句读取当前游标所指的记录到宿主变量中,然后,游标自动移向下一个记录:EXEC SQL FETCH FROM cursor_name INTO varia
13、ble-list; 7.1 嵌入式嵌入式SQL 如果游标是滚动游标,先将游标移动到所指定的记录,然后将游标所指的记录存放到宿主变量中: EXEC SQL FETCH NEXT | PRIOR|FIRST|LAST|ABSOLUTE n|RELATIVE nFROM cursor_nameINTO variable-list;7.1 嵌入式嵌入式SQL4、关闭游标、关闭游标 游标使用完毕后,要释放其所占的系统资源。使用下面的语句:EXEC SQL CLOSE cursor_name; 游标指向了结果集最后一个记录之后时,SQLSTATE的值被设置为02000,可以用这个条件作为循环的结束条件。7
14、.1 嵌入式嵌入式SQL例例 4 通过游标dept_computer读取每个学生的信息,并显示。 EXEC SQL BEGIN DECLARE SECTION charSno8;charSname9;charSsex3;shortSage ;charSdept21;charSQLSTATE6;7.1 嵌入式嵌入式SQLEXEC SQL END DECLARE SECTION-声明游标EXEC SQL DECLARE dept_computer CURSORFOR SELECT *FROM StudentWHERE Sdept= 计算机FOR READ ONLY;-打开游标EXEC SQL OP
15、EN dept_computer;7.1 嵌入式嵌入式SQL-读取第1条记录EXEC SQL FETCH dept_computer INTO :Sno, :Sname,:Ssex,:Sage,:Sdept;while(strcmp(SQLSTATE, 02000) != 0)/输出 EXEC SQL FETCH dept_computer INTO :Sno, :Sname,:Ssex,:Sage,:Sdept;-关闭游标EXEC SQL CLOSE dept_computer;7.1 嵌入式嵌入式SQL二、使用游标修改数据二、使用游标修改数据 上面介绍了通过游标把数据库的批量数据传送到宿主
16、变量中做进一步处理。游标的另一个作用是可以通过游标修改数据库中的数据。 使用游标修改数据要注意两件事: 1.声明游标时没有加FOR READ ONLY关键字; 2.一般不要修改基于多表的游标。7.1 嵌入式嵌入式SQL1、UPDATE语句格式:UPDATE table-name SET column- name = expressionWHERE CURRENT OF cursor_name功能:修改数据库中与当前游标所指向的记录相对应的元组的列值。7.1 嵌入式嵌入式SQL2、DELETED语句DELETE FROM table-nameWHERE CURRENT OF cursor_nam
17、e功能:删除数据库中与当前游标所指向的记录相对应的元组。7.1 嵌入式嵌入式SQL例 5 通过游标dept_computer给每个学生年龄增加1岁EXEC SQL BEGIN DECLARE SECTIONcharSQLSTATE6;EXEC SQL END DECLARE SECTION-声明游标EXEC SQL DECLARE dept_computer CURSORFOR SELECT *FROM StudentWHERE Sdept= 计算机FOR UPDATE OF Sage -只允许修改列Sage的值;7.1 嵌入式嵌入式SQL-打开游标EXEC SQL OPEN dept_com
18、puter;-读取第1条记录EXEC SQL FETCH dept_computer;while(strcmp(SQLSTATE, 02000) != 0)EXEC SQL UPDATE Student SET Sage = Sage + 1WHERE CURRENT OF dept_computer;FETCH dept_computer;-读下一条记录;-关闭游标EXEC SQL CLOSE dept_computer;7.1 嵌入式嵌入式SQL7.1.5 动态动态SQL简介简介动态SQL方法允许在程序运行过程中临时“组装”SQL语句,主要有三种形式: 1.语句可变:允许用户在程序运行时输
19、入完整的SQL语句。 2.条件可变。 3.数据库对象、查询条件均可变。7.1 嵌入式嵌入式SQL一、一、PREPARE PREPARE把存放在宿主变量中的一个字符串“准备”为一个SQL语句,所谓“准备”就是通过和DBMS的通信,对SQL语句进行分析和生成执行计划。具体格式为:PREPARE stmt_name FROM :host-variable 其中,stmt_name为待准备的SQL语句命名,供其它动态SQL命令引用,stmt_name在一个程序模块必需是唯一的。7.1 嵌入式嵌入式SQL二、二、EXECUTE EXECUTE执行由PREPARE准备的SQL语句:EXECUTE prep
20、ared_stmt_name USING : host-variabel ,.; prepared_stmt_name是由某个PREPARE准备的SQL语句,USING后面的宿主变量用于替换SQL语句的?参数,有几个?参数就必须有几个宿主变量,数据类型必须兼容,并且按照位置对应的原则进行替换。7.1 嵌入式嵌入式SQL二、二、EXECUTE 例例 6 生成一个向SC表插入任意元组的SQL语句EXEC SQL BEGIN DECLARE SECTION;char prep = INSERT INTO sc VALUES(?,?,?);char sno8;char cno5;short grade
21、;EXEC SQL END DECLARE SECTION;7.1 嵌入式嵌入式SQL二、二、EXECUTEEXEC SQL PREPARE prep_stat FROM :prep;while (strcmp(SQLSTATE, 00000) = = 0) scanf(%s , sno); scanf(%s , cno); scabf(%d , grade); EXEC SQL EXECUTE prep_stat USING :sno, :cno, :grade;7.1 嵌入式嵌入式SQL三、三、EXECUTE IMMEDIATE EXECUTE IMMEDIATE语句结合了PREPARE和
22、EXECUTE的功能,准备一个SQL语句并且立即执行它。因为准备一个SQL语句需要和DBMS通信,开销比较大,所以,采用PREPARE和EXECUTE方式适合于准备的语句要多次执行的方式,而 EXECUTE IMMEDIATE适用于只执行一次的情形。语句格式为:EXECUTE IMMEDIATE : :host-variable7.2 存储过程存储过程 存储过程是SQL语句和可选控制流语句的预编译集合。它以一个名称存储并作为一个单元处理。存储过程存储在数据库内,由应用程序调用执行。存储过程包含流程控制以及对数据库的查询,可接受参数、输出参数、返回单个或多个结果集以及执行状态,而且允许定义变量、
23、条件执行、循环等编程功能。7.2 存储过程存储过程 存储过程有以下特点: 1.确保数据访问和操作的一致性,提高应用程序的可维护性; 2.提高系统的执行效率; 3.提供一种安全机制; 4.减少了网络的流量负载; 5.若要改变业务规则或策略,只需改变存储过程和参数,不必修改应用程序。7.2 存储过程存储过程7.2.1 SQL/PSM 编写存储过程以及后面介绍的触发器需要一种通用的程序设计语言。SQL/PSM(persistent stored modules)标准制定了一个程序设计语言,这个语言可以被DBMS解释执行。 SQL/PSM提供了通用程序设计语言的定义变量、流程控制和存储过程定义以及调用
24、语句。在PSM标准出现之前,一些DBMS厂商就提供了自己的编程语言。 7.2 存储过程存储过程一、存储过程和函数的定义和调用一、存储过程和函数的定义和调用 SQL/PSM中的存储过程和函数与PASCAL语言中的过程和函数十分相似,但是语法比较复杂,下面给出一个简化版本。CREATE PROCEDURE (IN | OUT ,.)routine-body;CREATE FUCTION ( variable-name datatype,.) RETURN datatyperoutine-body;7.2 存储过程存储过程 在定义存储过程和函数时,首先要赋予一个在数据库范围内唯一的名字,然后给出参数
25、。对于存储过程,要进一步指出每个参数是输入参数还是输出参数。对于函数,在函数体内要使用RETURN 语句返回一个值。过程体和函数体使用SQL/PSM提供的过程控制语句和SQL语句编写。7.2 存储过程存储过程 SQL/PSM定义的函数可以出现在SQL语句中可以出现常数的地方。存储过程序要使用CALL语句调用。在过程体或函数体内直接使用CALL (argument list),在嵌入式SQL中要在CALL语句之前加上EXEC SQL。例如,下面的过程完成一个学生的转系任务,学生的学号和要转到的系名称作为过程的输入参数。7.2 存储过程存储过程CREATE PROCEDURE transform-
展开阅读全文