第8章_1嵌入式SQL_第1页
第8章_1嵌入式SQL_第2页
第8章_1嵌入式SQL_第3页
第8章_1嵌入式SQL_第4页
第8章_1嵌入式SQL_第5页
已阅读5页,还剩35页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程第八章 数据库编程8.1 嵌入式嵌入式SQL数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程8.1 嵌嵌 入入 式式 SQLvSQL语言提供了两种不同的使用方式:语言提供了两种不同的使用方式:交互式交互式嵌入式嵌入式将将SQLSQL语句嵌入到其它宿主语言编写的语句嵌入到其它宿主语言编写的程序中,作为宿主语言的子语言,使宿主程序中,作为宿主语言的子语言,使宿主语言具备访问数据库的能力。语言具备访问数据库的能力。宿主语言宿主语言:COBOL, C, Pascal, COBOL, C, Pascal, Fortran, VC

2、+, VB, DEPHI, CBFortran, VC+, VB, DEPHI, CB等等能嵌入能嵌入SQLSQL语句的高级语言。语句的高级语言。宿主语言本身不能直接识别宿主语言本身不能直接识别SQLSQL语句。语句。 v为什么要引入嵌入式为什么要引入嵌入式SQLnSQL语言是非过程性语言语言是非过程性语言n事务处理应用需要高级语言事务处理应用需要高级语言v这两种方式细节上有差别,在程序设计的环境下,这两种方式细节上有差别,在程序设计的环境下,SQL语句要做某些必要的扩充。语句要做某些必要的扩充。数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程把把SQLSQL嵌入到其他高级语言中

3、,必须解决的三个问题:嵌入到其他高级语言中,必须解决的三个问题:语句识别语句识别如何区分如何区分SQLSQL语句和主语言语句。语句和主语言语句。n 数据交换数据交换由主语言提出的操作或数据,如何让数由主语言提出的操作或数据,如何让数据库管理系统执行,由数据库查询出的数据如何交由据库管理系统执行,由数据库查询出的数据如何交由主语言处理。主语言处理。n 协调主语言的单记录操作和数据库的集合操作。协调主语言的单记录操作和数据库的集合操作。数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程8.1.1 嵌入式嵌入式SQL的处理过程的处理过程对宿主型数据库语言对宿主型数据库语言SQL(ESQL

4、)SQL(ESQL),DBMSDBMS采用采用预编译预编译方法处理:方法处理: 1由由DBMS的预处理程序对源程序进行扫描,的预处理程序对源程序进行扫描,识别出识别出SQL语句语句 2把它们把它们转换转换成主语言调用语句,以使主语言成主语言调用语句,以使主语言编译程序能识别它编译程序能识别它 3最后由主语言的编译程序将整个源程序最后由主语言的编译程序将整个源程序编译编译成目标码。成目标码。主语言程序含主语言程序含ESQLESQL语句语句ESQLESQL语句转换语句转换为函数调用为函数调用目标语言程序目标语言程序RDBMSRDBMS的的预处理程序预处理程序主语言主语言编译程序编译程序ESQLES

5、QL基本处理过程基本处理过程数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程8.1.1 嵌入式嵌入式SQL的处理过程的处理过程为了能够区分为了能够区分SQLSQL语句与主语言语句,所有的语句与主语言语句,所有的SQLSQL语句语句必需要有前缀必需要有前缀EXEC SQL,以以( (;) )结束结束, ,嵌入式嵌入式SQLSQL语句的语句的一般形式一般形式 EXEC SQL SQLEXEC SQL ; ;例:例:EXEC SQL DROP TABLE StudentEXEC SQL DROP TABLE Student; ;数据库系统概论数据库系统概论第八章第八章 数据库编程数据库

6、编程8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信将将SQL嵌入到高级语言中混合编程,程序中会含有两种不同计算嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句。模型的语句。SQL语句语句 描述性的面向集合的语句描述性的面向集合的语句 负责操纵数据库负责操纵数据库高级语言语句高级语言语句 过程性的面向记录的语句过程性的面向记录的语句 负责控制程序流程负责控制程序流程嵌入式嵌入式SQLSQL语句与主语言之间的语句与主语言之间的通信通信主要是指:描述性面向集主要是指:描述性面向集合与过程性面向纪录(元组)语句之间的通信。合与过程性面向纪录(元组)语句之间的通信

7、。 数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程工作单元之间的通信方式工作单元之间的通信方式vSQL通信区通信区 向主语言传递向主语言传递SQL语句的执行状态信息,主语言能够据此控制语句的执行状态信息,主语言能够据此控制程序流程。程序流程。v主变量主变量 1)主语言向)主语言向SQL语句提供参数。语句提供参数。 2)将)将SQL语句查询数据库的结果交主语言进一步处理。语句查询数据库的结果交主语言进一步处理。v 游标游标解决集合性操作语言与过程性操作语言的不匹配。解决集合性操作语言与过程性操作语言的不匹配。数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程一、一、

8、SQL通信区通信区SQLCASQLCA: SQL Communication AreaSQL Communication Area是一个数据结构是一个数据结构存放状态信息供程序读取存放状态信息供程序读取 。SQLCASQLCA的用途的用途SQLSQL语句执行后,语句执行后,DBMSDBMS反馈给应用程序信息反馈给应用程序信息 描述系统当前工作状态描述系统当前工作状态 描述运行环境描述运行环境这些信息将送到这些信息将送到SQLSQL通信区通信区SQLCASQLCA中,应用程序从中,应用程序从SQLCASQLCA中取出这些状态信息,据中取出这些状态信息,据此决定接下来执行的语句此决定接下来执行的语

9、句定义定义SQLCASQLCA 用用EXEC SQL INCLUDE SQLCAEXEC SQL INCLUDE SQLCA加以定义加以定义使用使用SQLCASQLCASQLCASQLCA中有一个存放每次执行中有一个存放每次执行SQLSQL语句后返回代码的变量语句后返回代码的变量SQLCODESQLCODE ;如果如果SQLCODESQLCODE等于预定义的常量等于预定义的常量SUCCESSSUCCESS,则表示,则表示SQLSQL语句成功,否则在语句成功,否则在SQLCODE SQLCODE 存放错误代码;存放错误代码;应用程序每执行完一条应用程序每执行完一条SQL SQL 语句之后都应该测

10、试一下语句之后都应该测试一下SQLCODESQLCODE的值,以了解该的值,以了解该SQLSQL语句执行情况并做相应处理。语句执行情况并做相应处理。数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程二、二、 主变量主变量 v什么是主变量什么是主变量嵌入式嵌入式SQLSQL语句中可以使用主语言的程序变量来输入或输出数据,在语句中可以使用主语言的程序变量来输入或输出数据,在SQLSQL语语句中使用的主语言程序变量简称为主变量(句中使用的主语言程序变量简称为主变量(Host VariableHost Variable)v主变量的类型主变量的类型输入主变量输入主变量-由应用程序对其赋值,由

11、应用程序对其赋值,SQLSQL语句引用。语句引用。输出主变量输出主变量-由由SQLSQL语句赋值或设置状态信息,返回给应用程序。语句赋值或设置状态信息,返回给应用程序。一个主变量有可能既是输入主变量又是输出主变量一个主变量有可能既是输入主变量又是输出主变量v定义定义SQLCASQLCA 用用EXEC SQL INCLUDE SQLCAEXEC SQL INCLUDE SQLCA加以定义加以定义v使用使用SQLCASQLCASQLCASQLCA中有一个存放每次执行中有一个存放每次执行SQLSQL语句后返回代码的变量语句后返回代码的变量SQLCODE SQLCODE ;如果如果SQLCODESQL

12、CODE等于预定义的常量等于预定义的常量SUCCESSSUCCESS,则表示,则表示SQLSQL语句成功,否则在语句成功,否则在SQLCODESQLCODE 存放错误代码;存放错误代码;应用程序每执行完一条应用程序每执行完一条SQL SQL 语句之后都应该测试一下语句之后都应该测试一下SQLCODESQLCODE的值,以了解的值,以了解该该SQLSQL语句执行情况并做相应处理。语句执行情况并做相应处理。数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程v指示变量指示变量一个主变量可以附带一个指示变量(一个主变量可以附带一个指示变量(Indicator Variable)什么是指示变

13、量什么是指示变量 整型变量整型变量 用来用来“指示指示”所指主变量的值或条件。所指主变量的值或条件。指示变量的用途指示变量的用途 指示变量可以输入主变量是否为空值指示变量可以输入主变量是否为空值 指示变量可以检测输出主变量是否为空值,值是否被截断。指示变量可以检测输出主变量是否为空值,值是否被截断。数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程v在在SQL语句中使用主变量和指示变量的方法语句中使用主变量和指示变量的方法1) 说明主变量和指示变量说明主变量和指示变量BEGIN DECLARE SECTION. . (说明主变量和指示变量说明主变量和指示变量)END DECLARE

14、 SECTION2) 使用主变量使用主变量 说明之后的主变量可以在说明之后的主变量可以在SQL语句中任何一个能够使用表达式的语句中任何一个能够使用表达式的地方出现。地方出现。 为了与数据库对象名(表名、视图名、列名等)区别,为了与数据库对象名(表名、视图名、列名等)区别,SQL语句语句中的主变量名前要加冒号(中的主变量名前要加冒号(:)作为标志)作为标志3) 使用指示变量使用指示变量 指示变量前也必须加冒号标志指示变量前也必须加冒号标志 必须紧跟在所指主变量之后必须紧跟在所指主变量之后v在在SQL语句之外语句之外(主语言语句中主语言语句中)使用主变量和指示变量的方法:使用主变量和指示变量的方法

15、:可以直接引用,不必加冒号。可以直接引用,不必加冒号。数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程三、游标(三、游标(cursor)1、为什么要使用游标、为什么要使用游标SQL语言与主语言具有不同数据处理方式语言与主语言具有不同数据处理方式SQL语言是面向集合的,一条语言是面向集合的,一条SQL语句原则上可以产生或处理多条记语句原则上可以产生或处理多条记录录主语言是面向记录的,一组主变量一次只能存放一条记录主语言是面向记录的,一组主变量一次只能存放一条记录 仅使用主变量并不能完全满足仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求语句向应用程序输出数据的要求 嵌入

16、式嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式引入了游标的概念,用来协调这两种不同的处理方式2、什么是游标、什么是游标游标是系统为用户开设的一个数据缓冲区,存放游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果语句的执行结果每个游标区都有一个名字每个游标区都有一个名字用户可以用用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。语言进一步处理。数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程四、四、 建立和关闭数据库连接建立和关闭数据库连接1、建立数据库连接、建立数据库连接嵌入式嵌入

17、式SQL要访问数据库必须先连接数据库,要访问数据库必须先连接数据库,DBMS根据用户信息根据用户信息对连接请求进行合法性验证,只有通过了身份验证,才能建立一个可用对连接请求进行合法性验证,只有通过了身份验证,才能建立一个可用的合法连接。其语句是:的合法连接。其语句是:EXEC SQL CONNECT TO targetAS connection-nameUSER user-name;Target:是连接数据库的数据库服务器,它可以是一个常见的服务器,是连接数据库的数据库服务器,它可以是一个常见的服务器,或是包含服务器标识的或是包含服务器标识的SQL串常量,也可以是串常量,也可以是DEFAULT

18、。connection-name:是可选择的连接名,连接必须是一个有效标识符,:是可选择的连接名,连接必须是一个有效标识符,主要用来标识整个程序内同时建立多个连接,如果整个程序中只有一个主要用来标识整个程序内同时建立多个连接,如果整个程序中只有一个连接也可以不指定连接名。如果程序运行过程中建立了多个连接,执行连接也可以不指定连接名。如果程序运行过程中建立了多个连接,执行所有的数据库单元的工作都在该操作提交时所选择的当前连接上。程序所有的数据库单元的工作都在该操作提交时所选择的当前连接上。程序运行过程中可以修改当前连接,对应的嵌入式运行过程中可以修改当前连接,对应的嵌入式SQL语句是:语句是:E

19、XEC SQL SET CONNECT TO connection-name| DEFAULT数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程2、关闭数据库连接、关闭数据库连接当某个连接上的所有数据库操作完成后,应用程序应该主动释放所占当某个连接上的所有数据库操作完成后,应用程序应该主动释放所占用的连接资源。用的连接资源。EXEC SQL DISCONNECT connection;connection:是:是EXEC SQL CONNECT所建立的数据库连接所建立的数据库连接数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程五、五、 程序实例程序实例例例1:依次检查

20、某个系学生的记录,交互式更新某些学生的年龄。:依次检查某个系学生的记录,交互式更新某些学生的年龄。EXEC SQL BEGIN DECLARE SECTION; /* 说明主变量说明主变量 */ CHAR deptname(20); CHAR HSno(9); CHAR HSname(20); CHAR HSeex(2); INT HSage; INT NEWAGE;EXEC SQL END DECLARE SECTION;Long SQLCODE;EXEC SQL INCLUDE SQLCA; /* 定义定义SQL通信区通信区 */数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编

21、程main(void) int count=0; char yn; printf(“Please choose the department name(CS/MA/IS):”); scanf(“%s”,& deptname); EXEC SQL CONNECT TO TESTlocalhost:54321 USER”SYSTEM”/”MANAGER”; EXEC SQL DECLARE SX CURSOR FOR /* 定义游标定义游标SX*/ SELECT Sno,Sname,Seex,Sage /* SX对应的语句对应的语句*/ FROM Student WHERE Sdept=: dep

22、tname; EXEC SQL OPEN SX; /* 打开游标打开游标SX,指向查询结果的第一行,指向查询结果的第一行*/数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程 for(;) EXEC SQL FETCH SX INTO : Hsno,:Hsname,:Hseex,:HSage; /* 将当前数据放入主变量并推进游标指针将当前数据放入主变量并推进游标指针*/ if (sqlca.sqlcode SUCCESS) /* 利用利用SQLCA中的状态信息决定何时退出循环中的状态信息决定何时退出循环 */ break; if(count +=0) printf(“ n%-10

23、s %-20s %-10s, %10sn”, “Sno ”, “Sname ”, “Ssex ”, “Sage ”); /* 如果是第一行如果是第一行,则打印行头则打印行头 */ printf( %-10s %-20s %-10s, %-10d , Sno, Sname, Ssex, Sage); /* 显示该记录显示该记录 */ printf(UPDATE AGE (y/n)? ); /* 问用户是否要修改问用户是否要修改 */数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程 Do scanf(%c,&yn); While(yn!=n & yn!=N &yn!=y & yn!=

24、Y ); if (yn=y | yn=Y) /* 需要修改需要修改 */ printf(INPUT NEW AGE: ); scanf(%d,&NEWAge); /* 输入新的年龄值输入新的年龄值 */ EXEC SQL UPDATE Student SET Sage=:NEWAge WHERE CURRENT OF SX; /* 修改当前记录的年龄字段修改当前记录的年龄字段 */ EXEC SQL CLOSE SX; /* 关闭游标关闭游标*/ EXEC SQL COMMIT WORK/* 提交更新提交更新*/ EXEC SQL DISCONNECT TEST /* 断开数据库连接断开数据库

25、连接*/数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程8.1.3 不用游标的不用游标的SQL语句语句不用游标的不用游标的SQL语句的种类语句的种类 说明性语句说明性语句 数据定义语句数据定义语句 数据控制语句数据控制语句 查询结果为单记录的查询结果为单记录的SELECT语句语句 非非CURRENT形式的形式的UPDATE语句语句 非非CURRENT形式的形式的DELETE语句语句 INSERT语句语句数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程一、说明性语句一、说明性语句说明性语句是专为在嵌入式说明性语句是专为在嵌入式SQL中说明主变量、中说明主变量、SQLC

26、A等而设置的。等而设置的。v说明主变量说明主变量1. EXEC SQL BEGIN DECLARE SECTION; 2. EXEC SQL END DECLARE SECTION;这两条语句必须配对出现,相当于一个括号,两条语句中间是主这两条语句必须配对出现,相当于一个括号,两条语句中间是主变量的说明变量的说明v说明说明SQLCA3. EXEC SQL INCLUDE SQLCA数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程二、数据定义语句二、数据定义语句例例2 建立一个建立一个“学生学生”表表Student EXEC SQL CREATE TABLE Student (Sn

27、o CHAR(5) NOT NULL UNIQUE, Sname CHAR(20), Ssex CHAR(1), Sage INT, Sdept CHAR(15);注:注:数据定义语句中不允许使用主变量数据定义语句中不允许使用主变量例:下列语句是错误的例:下列语句是错误的 EXEC SQL DROP TABLE :table_name;三、数据控制语句三、数据控制语句例例3 把查询把查询Student表权限授给用户表权限授给用户U1 EXEC SQL GRANT SELECT ON TABLE Student TO U1;数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程四、查询结

28、果为单记录的四、查询结果为单记录的SELECT语句语句 语句格式语句格式EXEC SQL SELECT ALL|DISTINCT ,. INTO ,. FROM , . WHERE GROUP BY HAVING ORDER BY ASC|DESC;对交互式对交互式SELECT语句的扩充就是多了一个语句的扩充就是多了一个INTO子句。子句。把从数据库中找到的符合条件的记录,放到把从数据库中找到的符合条件的记录,放到INTO子句指出的子句指出的主变量中去。主变量中去。 使用注意事项使用注意事项 1. 使用主变量使用主变量 INTO子句子句 WHERE子句的条件表达式子句的条件表达式 HAVING

29、短语的条件表达式短语的条件表达式数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程2. 使用指示变量使用指示变量指示变量只能用于指示变量只能用于INTO子句中子句中如果如果INTO子句中主变量后面跟有指示变量,则当查询得出的某个子句中主变量后面跟有指示变量,则当查询得出的某个数据项为空值时,系统会自动将相应主变量后面的指示变量置为负数据项为空值时,系统会自动将相应主变量后面的指示变量置为负值,但不向该主变量执行赋值操作,即主变量值仍保持执行值,但不向该主变量执行赋值操作,即主变量值仍保持执行SQL语语句之前的值句之前的值当发现指示变量值为负值时,不管主变量为何值,均应认为主变量当发

30、现指示变量值为负值时,不管主变量为何值,均应认为主变量值为值为NULL3. 查询结果为空集查询结果为空集如果数据库中没有满足条件的记录,即查询结果为空,则如果数据库中没有满足条件的记录,即查询结果为空,则DBMS将将SQLCODE的值置为的值置为1004. 查询结果为多条记录查询结果为多条记录程序出错,程序出错,DBMS会在会在SQLCA中返回错误信息中返回错误信息数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程例例4 根据学生号码查询学生信息。根据学生号码查询学生信息。 假设已将要查询的学生的学号赋给了主变量假设已将要查询的学生的学号赋给了主变量givensnoEXEC SQL

31、 SELECT Sno, Sname, Ssex, Sage, Sdept INTO :Hsno, :Hname, :Hsex, :Hage, :Hdept FROM Student WHERE Sno=:givensno;Hsno, Hname, Hsex, Hage, Hdept和和givensno均是主变量,并均已在前均是主变量,并均已在前面的程序中说明过了。面的程序中说明过了。例例5 查询某个学生选修某门课程的成绩。查询某个学生选修某门课程的成绩。 假设已将要查询的学生的学号赋给了主变量假设已将要查询的学生的学号赋给了主变量givensno,将课程号赋给了,将课程号赋给了主变量主变量g

32、ivencno。 EXEC SQL SELECT Sno, Cno, Grade INTO :Hsno, :Hcno, :Hgrade:Gradeid FROM SC WHERE Sno=:givensno AND Cno=:givencno;数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程从提高应用程序的数据独立性角度考虑,从提高应用程序的数据独立性角度考虑,SELECT语句在任语句在任何情况下都应该使用游标何情况下都应该使用游标对于仅返回一行结果数据的对于仅返回一行结果数据的SELECT语句虽然可以不使用游标语句虽然可以不使用游标但如果以后数据库改变了,该但如果以后数据库改变

33、了,该SELECT语句可能会返回多行数据,这语句可能会返回多行数据,这时该语句就会出错时该语句就会出错数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程五、非五、非CURRENT形式的增删改语句形式的增删改语句v非非CURRENT形式的形式的UPDATE语句语句使用主变量使用主变量 SET子句子句 WHERE子句子句使用指示变量使用指示变量 SET子句子句v非非CURRENT形式的形式的UPDATE语句可以操作多条元组语句可以操作多条元组例例6 修改某个学生修改某个学生1号课程的成绩。号课程的成绩。 假设该学生的学号已赋给主变量假设该学生的学号已赋给主变量givensno,修改后的

34、成绩已赋给主,修改后的成绩已赋给主变量变量newgrade。 EXEC SQL UPDATE SC SET Grade=:newgrade WHERE Sno=:givensno and Cno=1;数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程例例7 将计算机系全体学生年龄置将计算机系全体学生年龄置NULL值值 Sageid=-1; EXEC SQL UPDATE Student SET Sage=:Raise:Sageid WHERE Sdept=CS;将指示变量将指示变量Sageid赋一个负值后,无论主变量赋一个负值后,无论主变量Raise为何值,为何值,DBMS都都会将

35、会将CS系所有记录的年龄属性置空值。它等价于:系所有记录的年龄属性置空值。它等价于: EXEC SQL UPDATE Student SET Sage=NULL WHERE Sdept=CS;数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程例例8 某个学生退学了,现要将有关他的所有选课记录删除掉。某个学生退学了,现要将有关他的所有选课记录删除掉。 假设该学生的姓名已赋给主变量假设该学生的姓名已赋给主变量stdname EXEC SQL DELETE FROM SC WHERE Sno= (SELECT Sno FROM Student WHERE Sname=:stdname);

36、例例9 某个学生新选修了某门课程,将有关记录插入某个学生新选修了某门课程,将有关记录插入SC表表 假设学生的学号已赋给主变量假设学生的学号已赋给主变量stdno,课程号已赋给主变量,课程号已赋给主变量couno。 gradeid=-1; EXEC SQL INSERT INTO SC(Sno, Cno, Grade) VALUES(:stdno, :couno, :gr:gradeid);由于该学生刚选修课程,尚未考试,因此成绩列为空。所以本例中用由于该学生刚选修课程,尚未考试,因此成绩列为空。所以本例中用指示变量指示相应的主变量为空值。指示变量指示相应的主变量为空值。数据库系统概论数据库系统

37、概论第八章第八章 数据库编程数据库编程8.1.4 8.1.4 使用游标的使用游标的SQLSQL语句语句必须使用游标的必须使用游标的SQL语句语句查询结果为多条记录的查询结果为多条记录的SELECT语句语句CURRENT形式的形式的UPDATE语句语句CURRENT形式的形式的DELETE语句语句一、一、 查询结果为多条记录的查询结果为多条记录的SELECT语句语句使用游标的步骤:使用游标的步骤:1. 说明游标说明游标2. 打开游标打开游标3. 移动游标指针,然后取当前记录移动游标指针,然后取当前记录4. 关闭游标关闭游标数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程1. 说明游

38、标说明游标语句格式语句格式EXEC SQL DECLARE CURSOR FOR ;功能:功能:是一条说明性语句,这时是一条说明性语句,这时DBMS并不执行并不执行SELECT指定的查询操作。指定的查询操作。2. 打开游标打开游标语句格式语句格式 EXEC SQL OPEN ;功能:功能:打开游标实际上是执行相应的打开游标实际上是执行相应的SELECT语句,把所有满足查询语句,把所有满足查询条件的记录从指定表取到缓冲区中,这时游标处于活动状态,指针指条件的记录从指定表取到缓冲区中,这时游标处于活动状态,指针指向查询结果集中第一条记录之前。向查询结果集中第一条记录之前。数据库系统概论数据库系统概

39、论第八章第八章 数据库编程数据库编程3. 移动游标指针,然后取当前记录移动游标指针,然后取当前记录语句格式语句格式EXEC SQL FETCH NEXT|PRIOR|FIRST|LAST FROM INTO ,.;功能功能:指定方向推动游标指针,然后将缓冲区中的当前记录取出来:指定方向推动游标指针,然后将缓冲区中的当前记录取出来送至主变量供主语言进一步处理。送至主变量供主语言进一步处理。NEXT|PRIOR|FIRST|LAST:指定推动游标指针的方式。:指定推动游标指针的方式。NEXT:向前推进一条记录(缺省值):向前推进一条记录(缺省值)PRIOR:向回退一条记录:向回退一条记录FIRST

40、:推向第一条记录:推向第一条记录LAST:推向最后一条记录:推向最后一条记录说明说明(1) 主变量必须与主变量必须与SELECT语句中的目标列表达式具有一一对应语句中的目标列表达式具有一一对应关系关系(2) FETCH语句通常用在一个循环结构中,通过循环执行语句通常用在一个循环结构中,通过循环执行FETCH语句逐条取出结果集中的行进行处理语句逐条取出结果集中的行进行处理(3) 为进一步方便用户处理数据,现在一些关系数据库管理系统为进一步方便用户处理数据,现在一些关系数据库管理系统对对FETCH语句做了扩充,允许用户向任意方向以任意步长移语句做了扩充,允许用户向任意方向以任意步长移动游标指针。动

41、游标指针。数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程4. 关闭游标关闭游标语句格式语句格式 EXEC SQL CLOSE ;功能功能关闭游标,释放结果及占用的缓冲区及其他资源。关闭游标,释放结果及占用的缓冲区及其他资源。说明说明游标被关闭后,就不再和原来的查询结果集相联系被关闭的游标可游标被关闭后,就不再和原来的查询结果集相联系被关闭的游标可以再次被打开,与新的查询结果相联系。以再次被打开,与新的查询结果相联系。数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程二、二、CURRENT形式的形式的UPDATE语句和语句和DELETE语句语句CURRENT形式的形式

42、的UPDATE语句和语句和DELETE语句的用途语句的用途.CURRENT形式的形式的UPDATE语句和语句和DELETE语句语句 面向集合的操作面向集合的操作; 一次修改或删除所有满足条件的记录一次修改或删除所有满足条件的记录.如果只想修改或删除其中某个记录;如果只想修改或删除其中某个记录; 用带游标的用带游标的SELECT语句查出所有满足条件的记录;语句查出所有满足条件的记录; 从中进一步找出要修改或删除的记录;从中进一步找出要修改或删除的记录; 用用CURRENT形式的形式的UPDATE语句和语句和DELETE语句修改或删除语句修改或删除之。之。数据库系统概论数据库系统概论第八章第八章

43、数据库编程数据库编程步骤步骤(1) DECLARE 说明游标说明游标 (2) OPEN 打开游标,把所有满足查询条件的记录从指定表取至缓冲区打开游标,把所有满足查询条件的记录从指定表取至缓冲区(3) FETCH推进游标指针,并把当前记录从缓冲区中取出来送至主变量推进游标指针,并把当前记录从缓冲区中取出来送至主变量(4) 检查该记录是否是要修改或删除的记录,是则处理之检查该记录是否是要修改或删除的记录,是则处理之 (5) 重复第重复第(3)和和(4)步,用逐条取出结果集中的行进行判断和处理步,用逐条取出结果集中的行进行判断和处理(6) CLOSE 关闭游标,释放结果集占用的缓冲区和其他资源关闭游

44、标,释放结果集占用的缓冲区和其他资源数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程说明游标说明游标v为为UPDATE语句说明游标语句说明游标语句格式语句格式 EXEC SQL DECLARE CURSOR FOR FOR UPDATE OF ;说明:说明:FOR UPDATE OF 短语用于指明检索出的数据在指定列短语用于指明检索出的数据在指定列上是可修改的,以便上是可修改的,以便DBMS进行并发控制进行并发控制v为为DELETE语句说明游标语句说明游标语句格式语句格式 EXEC SQL DECLARE CURSOR FOR FOR UPDATE;说明:说明:FOR UPDAT

45、E短语提示短语提示DBMS进行并发控制进行并发控制数据库系统概论数据库系统概论第八章第八章 数据库编程数据库编程v修改或删除当前记录修改或删除当前记录经检查缓冲区中记录是要修改或删除的记录,则用经检查缓冲区中记录是要修改或删除的记录,则用UPDATE语语句或句或DELETE语句修改或删除该记录语句修改或删除该记录语句格式语句格式 WHERE CURRENT OF WHERE CURRENT OF WHERE CURRENT OF 子句表示修改或删除的是该游子句表示修改或删除的是该游标中最近一次取出的记录标中最近一次取出的记录v当游标定义中的当游标定义中的SELECT语句带有语句带有UNION或或ORDER BY子句时,子句时,或者该或者该SELECT语句相当于定义了一个不可更新的视图时,不能语句相当于定义了一个不可更新的视图时,不能使用使用CURRENT形式的形式的UPDATE语句和语句和DELETE语句语句数据库系统概

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论