《游标.ppt》由会员分享,可在线阅读,更多相关《游标.ppt(41页珍藏版)》请在三一文库上搜索。
1、2019年8月21日7时31分,数据库系统原理,1,游标知识补充,2019年8月21日7时31分,数据库系统原理,2,使用游标的SQL语句,必须使用游标的SQL语句 查询结果为多条记录的SELECT语句 CURRENT形式的UPDATE语句 CURRENT形式的DELETE语句,2019年8月21日7时31分,数据库系统原理,3,一、 查询结果为多条记录的SELECT语句,使用游标的步骤 1. 说明游标 2. 打开游标 3. 移动游标指针,然后取当前记录 4. 关闭游标,2019年8月21日7时31分,数据库系统原理,4,1. 说明游标,使用DECLARE语句 语句格式 EXEC SQL DE
2、CLARE CURSOR FOR ; 功能 是一条说明性语句,这时DBMS并不立即执行SELECT指定的查询操作。,2019年8月21日7时31分,数据库系统原理,5,2. 打开游标,使用OPEN语句 语句格式 EXEC SQL OPEN ; 功能 打开游标实际上是执行相应的SELECT语句,把所有满足查询条件的记录从指定表取到缓冲区中 这时游标处于活动状态,指针指向查询结果集中第一条记录之前,2019年8月21日7时31分,数据库系统原理,6,3. 移动游标指针,然后取当前记录,使用FETCH语句 语句格式 EXEC SQL FETCH NEXT|PRIOR| FIRST|LAST FROM
3、 INTO ,.;,2019年8月21日7时31分,数据库系统原理,7,移动游标指针,然后取当前记录(续),功能 指定方向推动游标指针,然后将缓冲区中的当前记录取出来送至主变量供主语言进一步处理。 NEXT|PRIOR|FIRST|LAST:指定推动游标指针的方式。 NEXT:向前推进一条记录 PRIOR:向回退一条记录 FIRST:推向第一条记录 LAST:推向最后一条记录 缺省值为NEXT,2019年8月21日7时31分,数据库系统原理,8,移动游标指针,然后取当前记录(续),说明 (1) 主变量必须与SELECT语句中的目标列表达式具有一一对应关系 (2) FETCH语句通常用在一个循环
4、结构中,通过循环执行FETCH语句逐条取出结果集中的行进行处理 (3) 为进一步方便用户处理数据,现在一些关系数据库管理系统对FETCH语句做了扩充,允许用户向任意方向以任意步长移动游标指针,2019年8月21日7时31分,数据库系统原理,9,4. 关闭游标,使用CLOSE语句 语句格式 EXEC SQL CLOSE ; 功能 关闭游标,释放结果集占用的缓冲区及其他资源 说明 游标被关闭后,就不再和原来的查询结果集相联系 被关闭的游标可以再次被打开,与新的查询结果相联系,2019年8月21日7时31分,数据库系统原理,10,例题,例1 查询某个系全体学生的信息(学号、姓名、性别和年龄)。要查询
5、的系名由用户在程序运行过程中指定,放在主变量deptname中 EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; /* 说明主变量 deptname,HSno,HSname,HSsex,HSage等*/ EXEC SQL END DECLARE SECTION; gets(deptname); /* 为主变量deptname赋值 */ ,2019年8月21日7时31分,数据库系统原理,11,例题(续),EXEC SQL DECLARE SX CURSOR FOR SELECT Sno, Sname, Ssex, Sage FROM
6、Student WHERE SDept=:deptname; /* 说明游标 */ EXEC SQL OPEN SX /* 打开游标 */ WHILE(1) /* 用循环结构逐条处理结果集中的记录 */ EXEC SQL FETCH SX INTO :HSno, :HSname, :HSsex, :HSage; /* 将游标指针向前推进一行,然后从结 果集中取当前行,送相应主变量*/,2019年8月21日7时31分,数据库系统原理,12,例题(续),if (sqlca.sqlcode SUCCESS) break; /* 若所有查询结果均已处理完或出现 SQL语句错误,则退出循环 */ /*
7、由主语言语句进行进一步处理 */ ; EXEC SQL CLOSE SX; /* 关闭游标 */ ,2019年8月21日7时31分,数据库系统原理,13,例题(续),例2 查询某些系全体学生的信息。 EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; /* 说明主变量 deptname,HSno,HSname,HSsex,HSage等*/ EXEC SQL END DECLARE SECTION;,2019年8月21日7时31分,数据库系统原理,14,例题(续), EXEC SQL DECLARE SX CURSOR FOR SELE
8、CT Sno, Sname, Ssex, Sage FROM Student WHERE SDept=:deptname; /* 说明游标 */ WHILE (gets(deptname)!=NULL) /* 接收主变量deptname的值 */ /* 下面开始处理deptname指定系的学生信息, 每次循环中deptname可具有不同的值 */ EXEC SQL OPEN SX /* 打开游标 */,2019年8月21日7时31分,数据库系统原理,15,例题(续),WHILE (1) /* 用循环结构逐条处理结果集中的记录 */ EXEC SQL FETCH SX INTO :HSno, :
9、HSname, :HSsex, :HSage; /* 将游标指针向前推进一行,然后从结果集中取当前行,送相 应主变量*/ if (sqlca.sqlcode SUCCESS) break; /* 若所有查询结果均已处理完或出现SQL语句错误,则退出循 环 */ /* 由主语言语句进行进一步处理 */ ; /* 内循环结束 */ EXEC SQL CLOSE SX; /* 关闭游标 */ ; /* 外循环结束 */ ,2019年8月21日7时31分,数据库系统原理,16,二、CURRENT形式的UPDATE语句和DELETE语句,非CURRENT形式的UPDATE语句和DELETE语句 面向集合
10、的操作 一次修改或删除所有满足条件的记录 CURRENT形式的UPDATE语句和DELETE语句的用途 如果只想修改或删除其中某个记录 用带游标的SELECT语句查出所有满足条件的记录 从中进一步找出要修改或删除的记录 用CURRENT形式的UPDATE语句和DELETE语句修改或删除之,2019年8月21日7时31分,数据库系统原理,17,CURRENT形式的UPDATE语句和DELETE语句(续),步骤 (1) DECLARE 说明游标 (2) OPEN 打开游标,把所有满足查询条件的记录从指定表取至缓冲区 (3) FETCH 推进游标指针,并把当前记录从缓冲区中取出来送至主变量 (4)
11、检查该记录是否是要修改或删除的记录,是则处理之 (5) 重复第(3)和(4)步,用逐条取出结果集中的行进行判断和处理 (6) CLOSE 关闭游标,释放结果集占用的缓冲区和其他资源,2019年8月21日7时31分,数据库系统原理,18,CURRENT形式的UPDATE语句和DELETE语句(续),说明游标 为UPDATE语句说明游标 使用带FOR UPDATE OF 短语的DECLARE语句 语句格式 EXEC SQL DECLARE CURSOR FOR FOR UPDATE OF ; FOR UPDATE OF 短语用于指明检索出的数据在指定列上是可修改的,以便DBMS进行并发控制,201
12、9年8月21日7时31分,数据库系统原理,19,CURRENT形式的UPDATE语句和DELETE语句(续),为DELETE语句说明游标 使用带FOR DELETE短语的DECLARE语句 语句格式 EXEC SQL DECLARE CURSOR FOR FOR DELETE; FOR DELETE短语提示DBMS进行并发控制,2019年8月21日7时31分,数据库系统原理,20,CURRENT形式的UPDATE语句和DELETE语句(续),修改或删除当前记录 经检查缓冲区中记录是要修改或删除的记录,则用UPDATE语句或DELETE语句修改或删除该记录 语句格式 WHERE CURRENT
13、OF WHERE CURRENT OF WHERE CURRENT OF 子句表示修改或删除的是该游标中最近一次取出的记录,2019年8月21日7时31分,数据库系统原理,21,CURRENT形式的UPDATE语句和DELETE语句(续),当游标定义中的SELECT语句带有UNION或ORDER BY子句时,或者该SELECT语句相当于定义了一个不可更新的视图时,不能使用CURRENT形式的UPDATE语句和DELETE语句,2019年8月21日7时31分,数据库系统原理,22,例题,例3 对某个系的学生信息,根据用户的要求修改其中某些人的年龄字段。 思路 查询某个系全体学生的信息(要查询的系
14、名由主变量deptname指定) 然后根据用户的要求修改其中某些记录的年龄字段,2019年8月21日7时31分,数据库系统原理,23,例题(续), EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; /* 说明主变量 deptname,HSno,HSname,HSsex,HSage,NEWAge等*/ EXEC SQL END DECLARE SECTION; gets(deptname); /* 为主变量deptname赋值 */ ,2019年8月21日7时31分,数据库系统原理,24,例题(续),EXEC SQL DECLARE
15、SX CURSOR FOR SELECT Sno, Sname, Ssex, Sage FROM Student WHERE SDept=:deptname FOR UPDATE OF Sage; /* 说明游标 */ EXEC SQL OPEN SX /* 打开游标 */ WHILE(1) /* 用循环结构逐条处理结果集中的记录 */ EXEC SQL FETCH SX INTO :HSno, :HSname, :HSsex, :HSage; /* 将游标指针向前推进一行,然后从结果集中取当前行,送相应主变量*/,2019年8月21日7时31分,数据库系统原理,25,例题(续),if (sq
16、lca.sqlcode SUCCESS) break; /* 若所有查询结果均已处理完或 出现SQL语句错误,则退出循环 */ printf(“%s, %s, %s, %d“, Sno, Sname, Ssex, Sage); /* 显示该记录 */ printf(“UPDATE AGE ? “); /* 问用户是否要修改 */ scanf(“%c“,2019年8月21日7时31分,数据库系统原理,26,例题(续),if (yn=y or yn=Y) /* 需要修改 */ printf(“INPUT NEW AGE: “); scanf(“%d“, /* 关闭游标 */ ,2019年8月21日
17、7时31分,数据库系统原理,27,例题(续),例4 对某个系的学生信息,根据用户的要求删除其中某些人的记录。 EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; /* 说明主变量 deptname,HSno,HSname,HSsex,HSage等*/ EXEC SQL END DECLARE SECTION; gets(deptname); /* 为主变量deptname赋值 */ ,2019年8月21日7时31分,数据库系统原理,28,例题(续),EXEC SQL DECLARE SX CURSOR FOR SELECT Sno,
18、Sname, Ssex, Sage FROM Student WHERE SDept=:deptname FOR UPDATE; /* 说明游标 */ EXEC SQL OPEN SX /* 打开游标 */,2019年8月21日7时31分,数据库系统原理,29,例题(续),WHILE(1) /* 用循环结构逐条处理结果集中的记录 */ EXEC SQL FETCH SX INTO :HSno, :HSname, :HSsex, :HSage; /* 将游标指针向前推进一行,然后从结 果集中取当前行,送相应主变量*/ if (sqlca.sqlcode SUCCESS) break; /* 若所
19、有查询结果均已处理完或出现SQL语句错误,则退出循环 */,2019年8月21日7时31分,数据库系统原理,30,例题(续),printf(“%s, %s, %s, %d“, Sno, Sname, Ssex, Sage); /* 显示该记录 */ printf(“DELETE ? “); /* 问用户是否要删除 */ scanf(“%c“, /* 关闭游标 */ ,2019年8月21日7时31分,数据库系统原理,31,动态SQL简介,静态嵌入式SQL 动态嵌入式SQL,2019年8月21日7时31分,数据库系统原理,32,一、静态SQL的特点,用户可以在程序运行过程中根据实际需要输入WHER
20、E子句或HAVING子句中某些变量的值。 语句中主变量的个数与数据类型在预编译时都是确定的,只有是主变量的值是程序运行过程中动态输入的。,2019年8月21日7时31分,数据库系统原理,33,静态SQL的不足,静态SQL语句提供的编程灵活性在许多情况下 仍显得不足,不能编写更为通用的程序。 例,对SC: 任课教师想查选修某门课程的所有学生的学号及其成绩 班主任想查某个学生选修的所有课程的课程号及相应成绩 学生想查某个学生选修某门课程的成绩 即:查询条件是不确定的,要查询的属性列也是不确定的,2019年8月21日7时31分,数据库系统原理,34,二、动态SQL,1. 什么是动态嵌入式SQL 动态
21、SQL方法允许在程序运行过程中临时“组装”SQL语句。 2. 应用范围 在预编译时下列信息不能确定时 SQL语句正文 主变量个数 主变量的数据类型 SQL语句中引用的数据库对象(列、索引、基本表、视图等),2019年8月21日7时31分,数据库系统原理,35,动态SQL(续),3. 动态SQL的形式 语句可变 临时构造完整的SQL语句 条件可变 WHERE子句中的条件 HAVING短语中的条件 数据库对象、查询条件均可变 SELECT子句中的列名 FROM子句中的表名或视图名 WHERE子句中的条件 HAVING短语中的条件,2019年8月21日7时31分,数据库系统原理,36,动态SQL(续
22、),4. 常用动态SQL语句 EXECUTE IMMEDIATE PREPARE EXECUTE DESCRIBE 使用动态SQL技术更多的是涉及程序设计方面的知识,而不是SQL语言本身,2019年8月21日7时31分,数据库系统原理,37,动态SQL语句 (1),动态SQL预备语句 EXEC SQL PREPARE动态SQL语句名FROM共享变量或字符串 这里共享变量或字符串的值应是一个完整的SQL语句。这个语句可以在程序运行时由用户输入才组合起来。此时,这个语句并不执行。,2019年8月21日7时31分,数据库系统原理,38,动态SQL语句 (2),动态SQL执行语句 EXEC SQL E
23、XECUTE动态SQL语句名 动态SQL语句使用时,还可以有两点改进: (1)当预备语句中组合而成的SQL语句只需执行一次时,那么预备语句和执行语句可合并成一个语句: EXEC SQL EXECUTE IMMEDIATE共享变量或字符串 (2)当预备语句中组合而成的SQL语句的条件值尚缺时,可以在执行语句中用USING短语补上: EXEC SQL EXECUTE USING ,2019年8月21日7时31分,数据库系统原理,39,动态SQL语句 (3),例 下面两个C语言的程序段说明了动态SQL语句的使用技术。 EXEC SQL BEGIN DECLARE SECTION; char *que
24、ry; EXEC SQL END DECLARE SECTION; scanf(%s,query); /* 从键盘输入一个SQL语句 */ EXEC SQL PREPARE que FROM :query; EXEC SQL EXECUTE que; 这个程序段表示从键盘输入一个SQL语句到字符数组中;字符指针 query指向字符串的第1个字符。 如果执行语句只做一次,那么程序段最后两个语句可合并成一个语句: EXEC SQL EXECUTE IMMEDIATE :query;,2019年8月21日7时31分,数据库系统原理,40,动态SQL语句 (4), char *query =UPDAT
25、E sc SET grade = grade * 1.1 WHERE c# = ?; EXEC SQL PREPARE dynprog FROM :query; char cno5 = C4; EXEC SQL EXECUTE dynprog USING :cno; 这里第一个char语句表示用户组合成一个SQL语句,但有一个值(课程号)还不能确定,因此用“?”表示。第二个语句是动态SQL预备语句。第三个语句(char语句)表示取到了课程号值。第四个语句是动态SQL执行语句,“?”值到共享变量cno中取。,2019年8月21日7时31分,数据库系统原理,41,小 结,SQL是关系数据库的标准语言,已广泛应用在商用系统中。 SQL的数据定义部分包括对SQL模式、基本表、视图、索引的创建和撤销。 SQL的数据操纵分成数据查询和数据更新两部分。 SQL的数据查询是用SELECT语句实现,兼有关系代数和元组演算的特点。 SQL的数据更新包括插入、删除和修改等三种操作,在视图中只有行列子集视图是可以更新的。 嵌入式SQL涉及到SQL语句的宿主语言程序中的使用规定,以解决两种语言的不一致和相互联系的问题。同时还介绍了动态SQL语句。,
链接地址:https://www.31doc.com/p-3392739.html