版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1数据库系统原理数据库系统原理第二篇第二篇 设计篇设计篇第八章第八章 数据库编程数据库编程2第八章第八章 数据库编程数据库编程 通过应用程序实现对数据库中的数据的操纵的通过应用程序实现对数据库中的数据的操纵的主要方式主要方式: 1 嵌入式嵌入式SQL(ESQL) 2 SQL过程化扩展过程化扩展(PL/SQL,T-SQL) 3 其它数据库访问技术其它数据库访问技术 (OBDC,JDBC,OLEDB,ADO等等)3第八章第八章 数据库编程数据库编程8.1 嵌入式嵌入式SQL8.2 存储过程存储过程8.3 数据库访问技术数据库访问技术48.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的处理过
2、程的处理过程8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信8.1.3 不使用游标的不使用游标的SQL语句语句8.1.4 使用游标的使用游标的SQL语句语句8.1.5 动态动态SQL8.1.6 小结小结58.1.1 嵌入式嵌入式SQL的处理过程的处理过程v主语言主语言 嵌入式嵌入式SQL(SQL(ESQLESQL) )是将是将SQLSQL语句嵌入程序设计语语句嵌入程序设计语言中,被嵌入的程序设计语言,如言中,被嵌入的程序设计语言,如C C、C+C+、JavaJava,称为,称为宿主语言,简称主语言宿主语言,简称主语言。v处理过程处理过程 预编译方法预编译方法6嵌入式嵌
3、入式SQL的处理过程(续)的处理过程(续) 主语言程序主语言程序(含含ESQL语句语句)RDBMS的预处理程序的预处理程序ESQL语句转换为函数调用语句转换为函数调用主语言编译程序主语言编译程序目标语言程序目标语言程序ESQL基本处理过程基本处理过程对对ESQL,RDBMS通常的处理方法通常的处理方法_预编译方法预编译方法7嵌入式嵌入式SQL的处理过程(续)的处理过程(续) v为了区分为了区分SQL语句与主语言语句,语句与主语言语句, 所有所有SQL语句语句必须加前缀必须加前缀EXEC SQL,通常以,通常以(;)结束。结束。n以以C C为主语言的嵌入式为主语言的嵌入式SQLSQL语句的一般形
4、式语句的一般形式 EXEC SQL SQLEXEC SQL ; ;例:例:EXEC SQL DROP TABLE StudentEXEC SQL DROP TABLE Student; ;88.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的处理过程的处理过程8.1.2 嵌入式嵌入式SQL与主语言的通信与主语言的通信8.1.3 不使用游标的不使用游标的SQL语句语句8.1.4 使用游标的使用游标的SQL语句语句8.1.5 动态动态SQL8.1.6 小结小结98.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信v将将SQL嵌入到高级语言中混合编程,程序中会含嵌入到高级
5、语言中混合编程,程序中会含有两种不同计算模型的语句有两种不同计算模型的语句nSQL语句语句 描述性的面向集合的语句描述性的面向集合的语句 负责操纵数据库负责操纵数据库n高级语言语句高级语言语句 过程性的面向记录的语句过程性的面向记录的语句 负责控制程序流程负责控制程序流程n它们之间应该如何通信?它们之间应该如何通信?10嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信(续)(续) v数据库工作单元与源程序工作单元之间的通信:数据库工作单元与源程序工作单元之间的通信:n1. SQL通信区通信区向主语言传递向主语言传递SQL语句的执行状态信息语句的执行状态信息使主语言能够据此控制程序
6、流程使主语言能够据此控制程序流程n2. 主变量主变量主语言向主语言向SQL语句提供参数语句提供参数将将SQL语句查询数据库的结果交主语言进一语句查询数据库的结果交主语言进一步处理步处理n3. 游标游标解决集合性操作语言与过程性操作语言的不解决集合性操作语言与过程性操作语言的不匹配匹配11一、一、SQL通信区通信区vSQLCA: SQL Communication AreanSQLCA是一个数据结构是一个数据结构vSQLCA的用途的用途nSQL语句执行后,语句执行后,RDBMS反馈给应用程序信息反馈给应用程序信息 描述系统当前工作状态描述系统当前工作状态 描述运行环境描述运行环境n这些信息将送到
7、这些信息将送到SQL通信区通信区SQLCA中中n应用程序从应用程序从SQLCA中取出这些状态信息,据此决中取出这些状态信息,据此决定接下来执行的语句定接下来执行的语句12SQL通信区通信区 SQLCA SQLCA的内容的内容n与所执行的与所执行的SQLSQL语句有关语句有关n 与该与该SQLSQL语句的执行情况有关。语句的执行情况有关。 例:在执行删除语句例:在执行删除语句DELETEDELETE后,不同的执行情后,不同的执行情况,况,SQLCASQLCA中有不同的信息:中有不同的信息:n 违反数据保护规则,操作拒绝违反数据保护规则,操作拒绝n 没有满足条件的行,一行也没有删除没有满足条件的行
8、,一行也没有删除n 成功删除,并有删除的行数成功删除,并有删除的行数n 无条件删除警告信息无条件删除警告信息n 由于各种原因,执行出错由于各种原因,执行出错13SQL通信区通信区vSQLCA使用方法:使用方法: 定义定义SQLCA 用用EXEC SQL INCLUDE SQLCA定义定义 使用使用SQLCASQLCA中有一个存放每次执行中有一个存放每次执行SQL语句后返回代语句后返回代码的变量码的变量SQLCODE如果如果SQLCODE等于预定义的常量等于预定义的常量SUCCESS,则表示则表示SQL语句成功,否则表示出错语句成功,否则表示出错应用程序应用程序每执行完一条每执行完一条SQL 语
9、句语句之后都应该测试之后都应该测试一下一下SQLCODE的值,以了解该的值,以了解该SQL语句执行情语句执行情况并做相应处理况并做相应处理14SQL通信区通信区long long SQLCODE; .; .EXEC SQL INCLUDE SQLCA;EXEC SQL INCLUDE SQLCA; / /* * (1) (1) 定义定义SQLSQL通信区通信区 * */ /int main(void) if (sqlca.sqlcode SUCCESS) /* 利用利用SQLCA中的状态信息决定何时退出循环中的状态信息决定何时退出循环 * break; . 15二、主变量二、主变量 v什么是主
10、变量什么是主变量 嵌入式嵌入式SQL语句中可以使用主语言的程序变量语句中可以使用主语言的程序变量来输入或输出数据来输入或输出数据 在在SQL语句中使用的主语言程序变量简称为主语句中使用的主语言程序变量简称为主变量(变量(Host Variable)16主变量(续)主变量(续) v主变量的类型主变量的类型 输入主变量输入主变量 输出主变量输出主变量 一个主变量有可能既是输入主变量又是输出主一个主变量有可能既是输入主变量又是输出主变量变量17指示变量指示变量n一个主变量可以附带一个一个主变量可以附带一个指示变量指示变量n什么是指示变量什么是指示变量n整型变量整型变量n用来用来“指示指示”所指主变量
11、的值或条件所指主变量的值或条件n指示变量的用途指示变量的用途n输入主变量可以利用指示变量输入主变量可以利用指示变量赋空值赋空值n输出主变量可以利用指示变量检测出是否输出主变量可以利用指示变量检测出是否空值,值是否被截断。空值,值是否被截断。18主变量和指示变量的方法主变量和指示变量的方法v在在SQL语句中使用主变量和指示变量的方法语句中使用主变量和指示变量的方法 1) 说明主变量和指示变量说明主变量和指示变量BEGIN DECLARE SECTION. . (说明主变量和指示变量说明主变量和指示变量).END DECLARE SECTION19 2) 使用主变量使用主变量说明之后的主变量可以在
12、说明之后的主变量可以在SQL语句中任何一个语句中任何一个能够使用能够使用表达式表达式的地方出现的地方出现为了与数据库对象名(表名、视图名、列名等)为了与数据库对象名(表名、视图名、列名等)区别,区别,SQL语句中的主变量名前要加冒号语句中的主变量名前要加冒号(:)作为标志作为标志 3) 使用指示变量使用指示变量 指示变量前也必须加指示变量前也必须加冒号标志冒号标志 必须紧跟在所指主变量之后必须紧跟在所指主变量之后指示变量只用于指示变量只用于INTO语句中语句中主变量和指示变量的方法主变量和指示变量的方法20v在在SQL语句之外语句之外(主语言语句中主语言语句中)使用主变量和指使用主变量和指示变
13、量的方法示变量的方法_可以直接引用,不必加冒号可以直接引用,不必加冒号主变量和指示变量的方法主变量和指示变量的方法21主变量和指示变量的方法主变量和指示变量的方法例:带有嵌入式例:带有嵌入式SQLSQL的一小段的一小段C C程序程序EXEC SQL BEGIN DECLARE SECTION;EXEC SQL BEGIN DECLARE SECTION; / /* * 说明主变量与指示变量说明主变量与指示变量 * */ / INT INT Sage; ; INT INT Sageid; ;EXEC SQL END DECLARE SECTION;EXEC SQL END DECLARE SEC
14、TION;22主变量和指示变量的方法主变量和指示变量的方法v 例例 将计算机系全体学生年龄置将计算机系全体学生年龄置NULL值。值。v Sageid=-1;v EXEC SQL UPDATE Studentv SET Sage=:Raise :Sageidv WHERE Sdept= CS;v 将指示变量将指示变量Sageid赋一个负值后,无论主变量赋一个负值后,无论主变量Raise为为何值,何值,RDBMS都会将都会将CS系所有学生的年龄置空值系所有学生的年龄置空值 。v 等价于:等价于:v EXEC SQL UPDATE Studentv SET Sage=NULLv WHERE Sdep
15、t= CS;23主变量和指示变量的方法主变量和指示变量的方法v 例例 查询某个学生选修某门课程的成绩。假设已经把将要查询查询某个学生选修某门课程的成绩。假设已经把将要查询的学生的学号赋给了主变量的学生的学号赋给了主变量givensno,将课程号赋给了主变,将课程号赋给了主变量量givencno。v EXEC SQL SELECT Sno,Cno,Gradev INTO :Hsno,:Hcno,:Hgrade:Gradeid v/*指示变量指示变量Gradeid*/v FROM SCv WHERE Sno=:givensno AND v Cno=:givencno;v 如果如果Gradeid 0
16、,不论,不论Hgrade为何值,均认为该学生成绩为何值,均认为该学生成绩为空值。为空值。24三、游标(三、游标(cursor)v为什么要使用游标为什么要使用游标 SQL语言与主语言具有不同数据处理方式语言与主语言具有不同数据处理方式 SQL语言是语言是面向集合面向集合的,一条的,一条SQL语句原则语句原则上可以产生或处理多条记录上可以产生或处理多条记录 主语言是主语言是面向记录的面向记录的,一组主变量一次只能,一组主变量一次只能存放一条记录存放一条记录 仅使用仅使用主变量主变量并不能完全满足并不能完全满足SQL语句向应语句向应用程序输出数据的要求用程序输出数据的要求 嵌入式嵌入式SQL引入了引
17、入了游标游标的概念,用来协调这的概念,用来协调这两种不同的处理方式两种不同的处理方式25 游标(续)游标(续)v什么是游标什么是游标 游标是系统为用户开设的一个游标是系统为用户开设的一个数据缓冲区数据缓冲区,存放存放SQL语句的执行结果语句的执行结果 每个游标区都有一个名字每个游标区都有一个名字 用户可以用用户可以用SQL语句逐一从游标中获取记录,语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理并赋给主变量,交由主语言进一步处理26游标的使用游标的使用v使用游标的步骤使用游标的步骤1. 说明游标说明游标2. 打开游标打开游标3.推进游标指针并取当前记录推进游标指针并取当前记录 4.
18、 关闭游标关闭游标27 游标(续)游标(续)int main(void) EXEC SQL DECLARE C1 CURSOR FOR SELECT tit_id, tit, roy FROM titles; /* 游标操作(定义游标)游标操作(定义游标)*/ /* 从从titles表中查询表中查询 tit_id, tit, roy */ EXEC SQL OPEN C1; /* 游标操作(打开游标)游标操作(打开游标)*/28 游标(续)游标(续) for(;) for(;) EXEC SQL FETCH C1 INTOEXEC SQL FETCH C1 INTO :title_id, :t
19、itle, :royalty; :title_id, :title, :royalty; / /* * 游标操作(将当前数据放入主变量并推进游标指针)游标操作(将当前数据放入主变量并推进游标指针)* */ / if ( if (sqlca.sqlcodesqlca.sqlcode SUCCESS) SUCCESS) / /* * 利用利用SQLCASQLCA中的状态信息决定何时退出循环中的状态信息决定何时退出循环 * */ / break; break; printf(Title ID: %s, Royalty: %d, printf(Title ID: %s, Royalty: %d, ti
20、tle_id, royalty); title_id, royalty); printf(Title: %s, title); / printf(Title: %s, title); /* * 打印查询结果打印查询结果 * */ / EXEC SQL CLOSE C1EXEC SQL CLOSE C1; /; /* * 游标操作(关闭游标)游标操作(关闭游标)* */ / 29四、建立和关闭数据库连接四、建立和关闭数据库连接v建立数据库连接建立数据库连接 EXEC SQL CONNECT TO target AS connection-name USER user-name; target是要
21、连接的数据库服务器:是要连接的数据库服务器:l常见的服务器标识串,如常见的服务器标识串,如: l包含服务器标识的包含服务器标识的SQL串常量串常量 lDEFAULT connect-name是可选的连接名,连接必须是一个是可选的连接名,连接必须是一个有效的标识符有效的标识符. 在整个程序内只有一个连接时可以在整个程序内只有一个连接时可以不指定连接名不指定连接名30四、建立和关闭数据库连接四、建立和关闭数据库连接vint main(void) /*C语言主程序开始语言主程序开始*/ EXEC SQL CONNECT TO TESTlocalhost:54321 USER SYSTEM /MANA
22、GER; /*连接数据库连接数据库TEST*/ 31四、建立和关闭数据库连接四、建立和关闭数据库连接v程序运行过程中可以修改当前连接程序运行过程中可以修改当前连接 :EXEC SQL SET CONNECTION EXEC SQL SET CONNECTION connection-name connection-name | DEFAULT;| DEFAULT;v关闭数据库连接关闭数据库连接 EXEC SQL DISCONNECT EXEC SQL DISCONNECT connectionconnection; 如:如: EXEC SQL DISCONNECT TEST;32使用使用ESQ
23、L访问数据库的步骤访问数据库的步骤2 2、ESQLESQL语句的语句的执行状态执行状态由由DBMSDBMS送至送至SQLCASQLCA中;中;1 1、建立与数据库的连接,用、建立与数据库的连接,用主变量主变量从主语言中从主语言中接收接收执行参数执行参数,用,用ESQLESQL操纵数据库;操纵数据库;3 3、主语言、主语言程序从程序从SQLCASQLCA中取出中取出状态状态信息,据此决定信息,据此决定下一步操作;下一步操作;4 4、如果、如果ESQLESQL语句从数据库中成功地检索出数据,语句从数据库中成功地检索出数据,则则通过主变量传给主语言通过主变量传给主语言做进一步处理;做进一步处理;5
24、5、ESQLESQL语言和主语言的不同数据处理方式通过语言和主语言的不同数据处理方式通过游游标标来协调。来协调。6 6、断开与数据库的连接、断开与数据库的连接33五、程序实例五、程序实例例例1依次检查某个系的学生记录,交互式更新某些学生年龄。依次检查某个系的学生记录,交互式更新某些学生年龄。EXEC SQL BEGIN DECLARE SECTION; /*主变量说明开始主变量说明开始*/ char deptname20;char HSno9;char HSname20; char HSsex2;int HSage;int NEWAGE;EXEC SQL END DECLARE SECTION
25、; /*主变量说明结束主变量说明结束*/long SQLCODE;EXEC SQL INCLUDE sqlca; /*定义定义SQL通信区通信区*/34程序实例(续)程序实例(续)int main(void) /*C语言主程序开始语言主程序开始*/ int count = 0;char yn; /*变量变量yn代表代表yes或或no*/printf(Please choose the department name(CS/MA/IS): ); scanf(%s, deptname); /*为主变量为主变量deptname赋值赋值*/EXEC SQL CONNECT TO TESTlocalho
26、st:54321 USER SYSTEM /MANAGER; /*连接数据库连接数据库TEST*/EXEC SQL DECLARE SX CURSOR FOR /*定义游标定义游标*/SELECT Sno, Sname, Ssex, Sage /*SX对应语句的执行结果对应语句的执行结果*/FROM StudentWHERE SDept = :deptname;EXEC SQL OPEN SX; /*打开游标打开游标SX便指向查询结果的第一行便指向查询结果的第一行*/35程序实例(续)程序实例(续)for ( ; ; ) /*用循环结构逐条处理结果集中的记录用循环结构逐条处理结果集中的记录*/
27、 EXEC SQL FETCH SX INTO :HSno, :HSname, :HSsex,:HSage; /*推进游标,将当前数据放入主变量推进游标,将当前数据放入主变量*/if (sqlca.sqlcode != 0) /* sqlcode != 0,表示操作不成功表示操作不成功*/break; /*利用利用SQLCA中的状态信息决定何时退出循环中的状态信息决定何时退出循环*/if(count+ = 0) /*如果是第一行的话,先打出行头如果是第一行的话,先打出行头*/ printf(n%-10s %-20s %-10s %-10sn, Sno, Sname, Ssex, Sage);
28、printf(%-10s %-20s %-10s %-10dn, HSno, HSname, HSsex, HSage); /*打印查询结果打印查询结果*/ printf(UPDATE AGE(y/n)?); /*询问用户是否要更新该学生的年龄询问用户是否要更新该学生的年龄*/ do scanf(%c,&yn); while(yn != N & yn != n & yn != Y & yn != y);36程序实例(续)程序实例(续)if (yn = y | yn = Y) /*如果选择更新操作如果选择更新操作*/ printf(INPUT NEW AGE:); scanf(%d,&NEWAG
29、E); /*用户输入新年龄到主变量中用户输入新年龄到主变量中*/ EXEC SQL UPDATE Student /*嵌入式嵌入式SQL*/SET Sage = :NEWAGEWHERE CURRENT OF SX ; /*对当前游标指向的学生年龄进行更新对当前游标指向的学生年龄进行更新*/ EXEC SQL CLOSE SX; /*关闭游标关闭游标SX不再和查询结果对应不再和查询结果对应*/EXEC SQL COMMIT WORK; /*提交更新提交更新*/EXEC SQL DISCONNECT TEST; /*断开数据库连接断开数据库连接*/378.1 嵌入式嵌入式SQL8.1.1 嵌入式
30、嵌入式SQL的处理过程的处理过程8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信8.1.3 不使用游标的不使用游标的SQL语句语句8.1.4 使用游标的使用游标的SQL语句语句8.1.5 动态动态SQL8.1.6 小结小结388.1.3 不用游标的不用游标的SQL语句语句v不用游标的不用游标的SQL语句的种类语句的种类 说明性语句说明性语句 数据定义语句数据定义语句 数据控制语句数据控制语句 查询结果为单记录的查询结果为单记录的SELECT语句语句 非非CURRENT形式的增删改语句形式的增删改语句 39一一.说明性语句说明性语句n说明性语句是专为在嵌入式说明性语句是
31、专为在嵌入式SQLSQL中说明主变量、中说明主变量、SQLCASQLCA等而设置的。等而设置的。n说明主变量说明主变量 1. EXEC SQL BEGIN DECLARE SECTION; 1. EXEC SQL BEGIN DECLARE SECTION; 2. EXEC SQL END DECLARE SECTION; 2. EXEC SQL END DECLARE SECTION;n说明说明SQLCASQLCA 3. EXEC SQL INCLUDE SQLCA 3. EXEC SQL INCLUDE SQLCA40二二.数据定义语句数据定义语句:例例: : 建立一个建立一个“学生学生”
32、表表StudentStudent EXEC SQL CREATE TABLE Student EXEC SQL CREATE TABLE Student (Sno CHAR(5) NOT NULL UNIQUE, (Sno CHAR(5) NOT NULL UNIQUE, Sname CHAR(20), Sname CHAR(20), Ssex CHAR(1), Ssex CHAR(1), Sage INT, Sage INT, Sdept CHAR(15); Sdept CHAR(15);41三、数据控制语句三、数据控制语句例例: : 把查询把查询StudentStudent表权限授给用户表
33、权限授给用户U1U1 SQLSQL语句:语句: GRANT SELECT ON TABLE Student TO U1; GRANT SELECT ON TABLE Student TO U1; 嵌入式嵌入式SQLSQL语句:语句:EXEC SQL GRANT SELECT ON TABLE Student TO U1; EXEC SQL GRANT SELECT ON TABLE Student TO U1; 42四、查询结果为单记录的四、查询结果为单记录的SELECT语句语句n这类语句不需要使用游标,只需要用这类语句不需要使用游标,只需要用INTO子句指定子句指定存放查询结果的主变量。存放
34、查询结果的主变量。 n语句格式语句格式EXEC SQL SELECT ALL|DISTINCT EXEC SQL SELECT ALL|DISTINCT ,. INTO INTO , ,. . FROM FROM , . . WHERE WHERE GROUP BY GROUP BY HAVING HAVING ORDER BY ORDER BY ASC|DESC;2 ASC|DESC;43例例 根据学生号码查询学生信息。假设已经把根据学生号码查询学生信息。假设已经把要查询的学生的学号赋给了主变量要查询的学生的学号赋给了主变量givensno。EXEC SQL SELECT Sno,Sname
35、,Ssex,Sage,Sdept INTO :Hsno,:Hname,:Hsex,:Hage,:HdeptFROM StudentWHERE Sno=:givensno;四、查询结果为单记录的四、查询结果为单记录的SELECT语句语句44使用注意事项使用注意事项(1) INTO子句、子句、WHERE子句和子句和HAVING短语的条件短语的条件表达式中均可以使用主变量表达式中均可以使用主变量(2)查询返回的记录中,可能某些列为空值查询返回的记录中,可能某些列为空值NULL。可使用指示变量。可使用指示变量。(3) 如果查询结果实际上并不是单条记录,而是多条如果查询结果实际上并不是单条记录,而是多条
36、记录,则程序出错,记录,则程序出错,RDBMS会在会在SQLCA中返回中返回错误信息错误信息 45例例 修改某个学生选修修改某个学生选修1号课程的成绩。号课程的成绩。EXEC SQL UPDATE SC SET Grade=:newgrade /*修改的成绩已赋给主变量修改的成绩已赋给主变量*/ WHERE Cno=1 and Sno=:givensno ; /*学号已赋给主变量学号已赋给主变量givensno*/ 五、非五、非CURRENT形式的增删改语句形式的增删改语句46例例: : 将全体学生将全体学生1 1号课程的考试成绩增加若干分。号课程的考试成绩增加若干分。 假设增加的分数已赋给主
37、变量假设增加的分数已赋给主变量RaiseRaise EXEC SQL UPDATE SC EXEC SQL UPDATE SC SET Grade=Grade+ SET Grade=Grade+:Raise:Raise WHERE Cno=1; WHERE Cno=1;非非CURRENT形式的形式的UPDATE语句语句47例例 某个学生退学了,现要将有关他的所有选课记某个学生退学了,现要将有关他的所有选课记录删除掉。假设该学生的姓名已赋给主变量录删除掉。假设该学生的姓名已赋给主变量stdname。 EXEC SQL DELETE FROM SC WHERE Sno= (SELECT Sno F
38、ROM Student WHERE Sname=:stdname); 非非CURRENT形式的形式的DELETE语句语句48非非CURRENT形式的形式的INSERT语句语句例例 某个学生新选修了某门课程,将有关记录插入某个学生新选修了某门课程,将有关记录插入SC表中。假设插入的学号已赋给主变量表中。假设插入的学号已赋给主变量stdno,课程号已赋给主变量课程号已赋给主变量couno。gradeid=-1; /*用作指示变量,赋为负值用作指示变量,赋为负值*/EXEC SQL INSERT INTO SC(Sno,Cno,Grade) VALUES(:stdno,:couno,:gr :gra
39、deid); 由于该学生刚选修课程,成绩应为空,所以由于该学生刚选修课程,成绩应为空,所以要把指示变量赋为负值要把指示变量赋为负值 498.1 嵌入式嵌入式SQLv8.1.1 嵌入式嵌入式SQL的处理过程的处理过程v8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信v8.1.3 不使用游标的不使用游标的SQL语句语句v8.1.4 使用游标的使用游标的SQL语句语句v8.1.5 动态动态SQLv8.1.6 小结小结508.1.4 使用游标的使用游标的SQL语句语句v必须使用游标的必须使用游标的SQL语句语句查询结果为多条记录的查询结果为多条记录的SELECT语句语句CUR
40、RENT形式的形式的UPDATE语句语句CURRENT形式的形式的DELETE语句语句51一、一、 查询结果为多条记录的查询结果为多条记录的SELECT语句语句v使用游标的步骤使用游标的步骤1. 说明游标说明游标2. 打开游标打开游标3.推进游标指针并取当前记录推进游标指针并取当前记录 4. 关闭游标关闭游标521. 说明游标说明游标v使用使用DECLARE语句语句v语句格式语句格式EXEC SQL DECLARE CURSOR FOR ;v功能功能 是一条说明性语句,这时是一条说明性语句,这时DBMS并不执行并不执行SELECT指定的查询操作。指定的查询操作。532. 打开游标打开游标v使用
41、使用OPEN语句语句v语句格式语句格式 EXEC SQL OPEN ;v功能功能 打开游标实际上是执行相应的打开游标实际上是执行相应的SELECT语句,语句,把所有满足查询条件的记录从指定表取到缓把所有满足查询条件的记录从指定表取到缓冲区中冲区中 这时游标处于活动状态,指针指向查询结果这时游标处于活动状态,指针指向查询结果集中第一条记录集中第一条记录543.推进游标指针并取当前记录推进游标指针并取当前记录 v使用使用FETCH语句语句v语句格式语句格式 EXEC SQL FETCH NEXT|PRIOR| FIRST|LAST FROM INTO ,.;55推进游标指针并取当前记录(续)推进游
42、标指针并取当前记录(续)v功能功能 指定方向推动游标指针,然后将缓冲区中的当指定方向推动游标指针,然后将缓冲区中的当前记录取出来送至主变量供主语言进一步处理前记录取出来送至主变量供主语言进一步处理 NEXT|PRIOR|FIRST|LAST:指定推动游标指:指定推动游标指针的方式针的方式 NEXT:向前推进一条记录:向前推进一条记录 PRIOR:向回退一条记录:向回退一条记录 FIRST:推向第一条记录:推向第一条记录 LAST:推向最后一条记录:推向最后一条记录 缺省值为缺省值为NEXT56推进游标指针并取当前记录(续)推进游标指针并取当前记录(续)n说明说明n(1) (1) 主变量必须与主
43、变量必须与SELECTSELECT语句中的目标列表语句中的目标列表达式具有一一对应关系达式具有一一对应关系n(2) FETCH(2) FETCH语句通常用在一个循环结构中,语句通常用在一个循环结构中,通过循环执行通过循环执行FETCHFETCH语句逐条取出结果集中语句逐条取出结果集中的行进行处理的行进行处理n(3) (3) 为进一步方便用户处理数据,现在一些为进一步方便用户处理数据,现在一些关系数据库管理系统对关系数据库管理系统对FETCHFETCH语句做了扩充,语句做了扩充,允许用户向任意方向以任意步长移动游标指允许用户向任意方向以任意步长移动游标指针针574. 关闭游标关闭游标v使用使用C
44、LOSE语句语句v语句格式语句格式 EXEC SQL CLOSE ;v功能功能 关闭游标,释放结果集占用的缓冲区及其他资源关闭游标,释放结果集占用的缓冲区及其他资源v说明说明 游标被关闭后,就不再和原来的查询结果集相联系游标被关闭后,就不再和原来的查询结果集相联系 被关闭的游标可再次被打开,与新的查询结果相联被关闭的游标可再次被打开,与新的查询结果相联系系58二、二、CURRENT形式的形式的UPDATE语句和语句和DELETE语句语句vCURRENT形式的形式的UPDATE语句和语句和DELETE语句语句的用途的用途 面向集合的操作面向集合的操作 修改或删除所有满足条件的记录修改或删除所有满
45、足条件的记录59CURRENT形式的形式的UPDATE语句和语句和DELETE语句语句(续续)n步骤步骤n(1) DECLARE (1) DECLARE n 说明游标说明游标n(2) OPEN(2) OPENn 打开游标,把所有满足查询条件的记录打开游标,把所有满足查询条件的记录从指定表取至缓冲区从指定表取至缓冲区n(3) FETCH(3) FETCHn推进游标指针,并把当前记录从缓冲区中推进游标指针,并把当前记录从缓冲区中取出来送至主变量取出来送至主变量60CURRENT形式的形式的UPDATE语句和语句和DELETE语句语句(续续)n(4) (4) 检查该记录是否是要修改或删除的记录,检查
46、该记录是否是要修改或删除的记录,是则处理之是则处理之 n(5) (5) 重复第重复第(3)(3)和和(4)(4)步,用逐条取出结果集步,用逐条取出结果集中的行进行判断和处理中的行进行判断和处理n(6) CLOSE(6) CLOSEn 关闭游标,释放结果集占用的缓冲区和关闭游标,释放结果集占用的缓冲区和其他资源其他资源61CURRENT形式的形式的UPDATE语句和语句和DELETE语句语句(续续)n修改或删除当前记录修改或删除当前记录n经检查缓冲区中记录是要修改或删除的记录,经检查缓冲区中记录是要修改或删除的记录,则用则用UPDATEUPDATE语句或语句或DELETEDELETE语句修改或删
47、除该记语句修改或删除该记录录n语句格式语句格式nUPDATE WHERE CURRENT OF WHERE CURRENT OF nDELETE WHERE CURRENT OF WHERE CURRENT OF nWHERE CURRENT OF WHERE CURRENT OF 子句表示修改或删子句表示修改或删除的是该游标中最近一次取出的记录除的是该游标中最近一次取出的记录62CURRENT形式的形式的UPDATE语句和语句和DELETE语句语句(续续)n当游标定义中的当游标定义中的SELECTSELECT语句带有语句带有UNIONUNION或或ORDER BYORDER BY子句时子句时
48、,或者该,或者该SELECTSELECT语句相当于语句相当于定义了一个定义了一个不可更新的视图时不可更新的视图时,不能使用不能使用CURRENTCURRENT形式的形式的UPDATEUPDATE语句和语句和DELETEDELETE语句。语句。63嵌嵌 入入 式式 SQLv8.1.1 嵌入式嵌入式SQL的处理过程的处理过程v8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信v8.1.3 不使用游标的不使用游标的SQL语句语句v8.1.4 使用游标的使用游标的SQL语句语句v8.1.5 动态动态SQLv8.1.6 小结小结64静态静态嵌入式嵌入式SQL的特点的特点n静态静态
49、ESQLESQL所使用的主变量,查询的对象与所使用的主变量,查询的对象与条件都是固定的。条件都是固定的。n用户可以在程序运行过程中根据实际需要输入用户可以在程序运行过程中根据实际需要输入WHEREWHERE子句或子句或HAVINGHAVING子句中某些变量的子句中某些变量的值值。n语句中主变量的语句中主变量的个数与数据类型个数与数据类型在预编译时都在预编译时都是确定的,只是主变量的是确定的,只是主变量的值值是程序运行过程中是程序运行过程中动态输入的。动态输入的。65 8.1.5 动态动态SQLv静态嵌入式静态嵌入式SQL 静态嵌入式静态嵌入式SQL语句能够满足一般要求语句能够满足一般要求 无法
50、满足无法满足要到执行时才能够确定要提交的要到执行时才能够确定要提交的SQL语句,查询条件。语句,查询条件。 v动态嵌入式动态嵌入式SQL 允许在程序运行过程中临时允许在程序运行过程中临时“组装组装”SQL语语句句 支持支持动态组装动态组装SQL语句和动态参数两种形式语句和动态参数两种形式 66动态嵌入式动态嵌入式SQL常用动态常用动态SQLSQL语句语句nEXECUTE IMMEDIATEEXECUTE IMMEDIATEnPREPAREPREPAREnEXECUTEEXECUTEn使用动态使用动态SQLSQL技术更多的是涉及程序设计方面技术更多的是涉及程序设计方面的知识,而不是的知识,而不是
51、SQLSQL语言本身语言本身67动态嵌入式动态嵌入式SQLv一、使用一、使用SQL语句主变量语句主变量 v二、动态参数二、动态参数68一、使用一、使用SQL语句主变量语句主变量vSQL语句主变量语句主变量: 包含的是包含的是SQL语句的内容语句的内容,而不是原来保存数,而不是原来保存数据的输入或输出变量据的输入或输出变量 SQL语句主变量在程序执行期间可以设定不同语句主变量在程序执行期间可以设定不同的的SQL语句,然后立即执行语句,然后立即执行 69使用使用SQL语句主变量(续)语句主变量(续)例例 创建基本表创建基本表TESTEXEC SQL BEGIN DECLARE SECTION;co
52、nst char *stmt = CREATE TABLE test(a int); /* SQL语句主变量语句主变量 */EXEC SQL END DECLARE SECTION;. .EXEC SQL EXECUTE IMMEDIATE :stmt; /* 执行语句执行语句 */70二、动态参数二、动态参数v动态参数动态参数 SQL语句中的可变元素语句中的可变元素 使用参数符号使用参数符号(?)表示该位置的数据在运行时设定表示该位置的数据在运行时设定v和主变量的区别和主变量的区别 动态参数的输入不是编译时完成绑定动态参数的输入不是编译时完成绑定 而是通过而是通过 (prepare)语句准备
53、主变量和执行语句准备主变量和执行(execute)时绑定数据或主变量来完成时绑定数据或主变量来完成 71动态参数(续)动态参数(续)v使用动态参数的步骤:使用动态参数的步骤:1.声明声明SQL语句主变量(含动态参数?)。语句主变量(含动态参数?)。2.准备准备SQL语句语句(PREPARE)。 EXEC SQL PREPARE FROM ; 3.执行准备好的语句执行准备好的语句(EXECUTE) EXEC SQL EXECUTE INTO USING ;72动态参数(续)动态参数(续)例例向向TEST中插入元组。中插入元组。EXEC SQL BEGIN DECLARE SECTION;cons
54、t char *stmt = INSERT INTO test VALUES(?); /*声明声明SQL主变量主变量 */EXEC SQL END DECLARE SECTION;. .EXEC SQL PREPARE mystmt FROM :stmt; /* 准备语准备语句句 */. .EXEC SQL EXECUTE mystmt USING 100; /* 执行语句执行语句 */EXEC SQL EXECUTE mystmt USING 200; /* 执行语句执行语句 */73动态参数(续)动态参数(续)例例EXEC SQL BEGIN DECLARE SECTION; char *
55、query = “UPDATE sc SET grade=grade*1.1 WHERE c#=?; /*声明动态声明动态SQL主变量主变量 */ char *cno=“C4”; EXEC SQL END DECLARE SECTION;. .EXEC SQL PREPARE mysql FROM :query; /* 准备语句准备语句*/EXEC SQL EXECUTE mysql USING :cno; /* 执行语句执行语句 */748.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的处理过程的处理过程8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信8.1
56、.3 不使用游标的不使用游标的SQL语句语句8.1.4 使用游标的使用游标的SQL语句语句8.1.5 动态动态SQL8.1.6 小结小结758.1.6 小小 结结v在嵌入式在嵌入式SQL中,中,SQL语句与主语言语句分工非语句与主语言语句分工非常明确常明确 SQL语句语句直接与数据库打交道,取出数据库中的数据。直接与数据库打交道,取出数据库中的数据。 主语言语句主语言语句控制程序流程控制程序流程对取出的数据做进一步加工处理对取出的数据做进一步加工处理76小结(续)小结(续)vSQL语言是面向集合的,一条语言是面向集合的,一条SQL语句原则上可语句原则上可以产生或处理多条记录以产生或处理多条记录
57、v主语言是面向记录的,一组主变量一次只能存放主语言是面向记录的,一组主变量一次只能存放一条记录一条记录 仅使用主变量并不能完全满足仅使用主变量并不能完全满足SQL语句向应用语句向应用程序输出数据的要求程序输出数据的要求 嵌入式嵌入式SQL引入了游标的概念,用来协调这两引入了游标的概念,用来协调这两种不同的处理方式种不同的处理方式77第八章第八章 数据库编程数据库编程8.1 嵌入式嵌入式SQL8.2 存储过程存储过程8.3 数据库访问技术数据库访问技术788.2 存储过程存储过程vSQL99标准给出标准给出SQL-invoked routines概念:概念: 存储过程存储过程(SQL-invok
58、ed procedure) 函数函数(SQL-invoked function)798.2 存储过程存储过程8.2.1 PL/SQL的块结构的块结构8.2.2 变量常量的定义变量常量的定义8.2.3 控制结构控制结构8.2.4 存储过程存储过程8.2.5 小结小结808.2.1 PL/SQL的块结构的块结构vPL/SQL : SQL的扩展的扩展 -增加了过程化语句功能增加了过程化语句功能 基本结构是块基本结构是块块之间可以互相嵌套块之间可以互相嵌套 每个块完成一个逻辑操作每个块完成一个逻辑操作 81PL/SQL的块结构(续)的块结构(续)vPL/SOL块的基本结构:块的基本结构: 1.定义部分
59、定义部分 DECLARE -变量、常量、游标、异常等变量、常量、游标、异常等 n定义的变量、常量等只能在该基本块中使用定义的变量、常量等只能在该基本块中使用n当基本块执行结束时,定义就不再存在当基本块执行结束时,定义就不再存在82PL/SQL的块结构(续)的块结构(续)vPL/SOL块的基本结构块的基本结构(续续): 2.执行部分执行部分 BEGIN -SQL语句、语句、PL/SQL的流程控制语句的流程控制语句 EXCEPTION -异常处理部分异常处理部分 END;838.2.2 变量常量的定义变量常量的定义1. PL/SQL中定义变量的语法形式是中定义变量的语法形式是: 变量名变量名 数据
60、类型数据类型 NOT NULL:=初值表达式初值表达式或或 变量名变量名 数据类型数据类型 NOT NULL初值表达式初值表达式2. 常量的定义类似于变量的定义常量的定义类似于变量的定义: 常量名常量名 数据类型数据类型 CONSTANT :=常量表达式常量表达式 常量必须要给一个值,并且该值在存在期间或常量的常量必须要给一个值,并且该值在存在期间或常量的作用域内不能改变。如果试图修改它,作用域内不能改变。如果试图修改它,PL/SQL将返回将返回一个异常。一个异常。3. 赋值语句赋值语句 变量名称变量名称:=表达式表达式848.2.3 控制结构控制结构 vPL/SQL 功能:功能:一、条件控制
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肺心病病因介绍
- 亿只肉鸭养殖基地建设项目
- 经营合同培训课件
- 耳内疼病因介绍
- 《数据的表格处理》课件
- 《海得控制公司介绍》课件
- 物流管理基础课件 情景4子情境3 电子商务物流
- 2019-2020学年湖北省武汉市东湖高新区八年级(下)期中数学试卷
- 甲状腺结核病因介绍
- 国际贸易课件-规划-新教材
- MOOC 中药炮制学-河南中医药大学 中国大学慕课答案
- 施工总平面图(标书用)
- 《医学细胞生物学》试题库完整
- 年度品质年终总结
- 2024春形势与政策课件当前国际形势与中国原则立场
- 集中用餐信息公开制度
- 生物信息学(上海海洋大学)智慧树知到期末考试答案2024年
- 用电信息采集系统
- 工程审计工作总结范本
- 2024年中国航天科工集团科技保障中心有限公司招聘笔试参考题库含答案解析
- 教科版小学科学二年级上册教案(全册)教学设计
评论
0/150
提交评论