![第8章数据库编程_第1页](http://file3.renrendoc.com/fileroot3/2021-11/6/3cc2771b-52e7-4d62-ac34-86b3140c80e1/3cc2771b-52e7-4d62-ac34-86b3140c80e11.gif)
![第8章数据库编程_第2页](http://file3.renrendoc.com/fileroot3/2021-11/6/3cc2771b-52e7-4d62-ac34-86b3140c80e1/3cc2771b-52e7-4d62-ac34-86b3140c80e12.gif)
![第8章数据库编程_第3页](http://file3.renrendoc.com/fileroot3/2021-11/6/3cc2771b-52e7-4d62-ac34-86b3140c80e1/3cc2771b-52e7-4d62-ac34-86b3140c80e13.gif)
![第8章数据库编程_第4页](http://file3.renrendoc.com/fileroot3/2021-11/6/3cc2771b-52e7-4d62-ac34-86b3140c80e1/3cc2771b-52e7-4d62-ac34-86b3140c80e14.gif)
![第8章数据库编程_第5页](http://file3.renrendoc.com/fileroot3/2021-11/6/3cc2771b-52e7-4d62-ac34-86b3140c80e1/3cc2771b-52e7-4d62-ac34-86b3140c80e15.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第8章 数据库编程 第第8章章 数据库编程数据库编程 8.1 嵌入式嵌入式SQL 8.2 存储过程存储过程 8.3 ODBC编程编程 第8章 数据库编程 8.1 嵌入式嵌入式SQL SQL语言提供了两种不同的使用方式:语言提供了两种不同的使用方式:交互式、嵌交互式、嵌入式入式。 引入嵌入式引入嵌入式SQL的原因?的原因? 1 1)SQLSQL语言是非过程性语言语言是非过程性语言 2 2)事务处理应用需要高级语言)事务处理应用需要高级语言 交互式交互式SQLSQL和嵌入式和嵌入式SQLSQL这两种方式细节上有差别,这两种方式细节上有差别,在程序设计的环境下,在程序设计的环境下,SQLSQL语句要
2、做某些必要的扩充。语句要做某些必要的扩充。第8章 数据库编程 8.1.1 嵌入式嵌入式SQL的处理过程的处理过程 嵌入式嵌入式SQLSQL是是将将SQL语句嵌入程序设计语言中,被嵌入语句嵌入程序设计语言中,被嵌入的程序设计语言,如的程序设计语言,如C、FORTRAN、C+、Java,称为,称为宿宿主语言,简称主语言。主语言,简称主语言。 对对ESQL,DBMS可采用两种方法处理:可采用两种方法处理: 1 1)预编译)预编译 2 2)修改和扩充主语言使之能处理修改和扩充主语言使之能处理SQL语句语句 目前目前采用较多的是预编译的方法。即由采用较多的是预编译的方法。即由DBMS的预处的预处理程序对
3、源程序进行扫描,识别出理程序对源程序进行扫描,识别出SQL语句,把它们转换语句,把它们转换成主语言调用语句,以使主语言编译程序能识别它,最后成主语言调用语句,以使主语言编译程序能识别它,最后由主语言的编译程序将整个源程序编译成目标码。由主语言的编译程序将整个源程序编译成目标码。 第8章 数据库编程 主语言程序 含ESQL语句RDBMS的预处理程序ESQL语句转换为函数调用主语言编译程序目标语言程序ESQL基本处理过程 在在ESQL中,为了能够区分中,为了能够区分SQL语句与主语言语句,所语句与主语言语句,所有有SQL语句都必须加前缀语句都必须加前缀EXEC SQL,以(,以(;)结束成为一)结
4、束成为一个程序片段。个程序片段。 EXEC SQL; 第8章 数据库编程 如下一条交互形式的如下一条交互形式的SQL语句:语句: DROP TABLEStudent; 嵌入到嵌入到C程序中,应写作:程序中,应写作: EXEC SQL DROP TABLEStudent; 嵌入嵌入SQL语句根据其作用的不同,可分为可执行语语句根据其作用的不同,可分为可执行语句和说明性语句两类。可执行语句又分为数据定义、数句和说明性语句两类。可执行语句又分为数据定义、数据控制、数据操纵三种。据控制、数据操纵三种。 在宿主程序中,任何允许出现可执行的高级语言语在宿主程序中,任何允许出现可执行的高级语言语句的地方,都
5、可以写可执行句的地方,都可以写可执行SQL语句;任何允许出现说语句;任何允许出现说明性高级语言语句的地方,都可以写说明性明性高级语言语句的地方,都可以写说明性SQL语句。语句。 第8章 数据库编程 8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信 将将SQL嵌入到高级语言中混合编程,程序中会含嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句:有两种不同计算模型的语句: 1 1) SQL语句,负责操纵数据库,是一种是描述语句,负责操纵数据库,是一种是描述性的面向集合的性的面向集合的SQL语句。语句。 2 2)高级语言语句,负责控制程序流程,是一种过高级语言语
6、句,负责控制程序流程,是一种过程性的高级语言语句。程性的高级语言语句。 它们它们之间应该如何通信呢?之间应该如何通信呢? 第8章 数据库编程 数据库工作单元与源程序工作单元之间通信主要包括:数据库工作单元与源程序工作单元之间通信主要包括: 1 1)向主语言传递)向主语言传递SQLSQL语句的执行状态信息,使主语言能语句的执行状态信息,使主语言能够据此控制程序流程;够据此控制程序流程; 2 2)主语言向)主语言向SQLSQL语句提供参数;语句提供参数; 3 3)将)将SQLSQL语句查询数据库的结果交主语言进一步处理。语句查询数据库的结果交主语言进一步处理。 在嵌入式在嵌入式SQL中,向主语言传
7、递中,向主语言传递SQL执行状态信息主执行状态信息主要用要用SQL通信区(通信区(SQL Communication Area,简称,简称SQLCA)实现;主语言向实现;主语言向SQL语句输入数据主要用语句输入数据主要用主变量(主变量(host variable)实现;实现;SQL语句向主语言输出数据主要用语句向主语言输出数据主要用主变量主变量和游标(和游标(cursor)实现。实现。 第8章 数据库编程 一、一、SQL通信区通信区 SQLCA是一个数据结构。是一个数据结构。1 1、SQLCA的用途的用途1)语句执行后,系统要反馈给应用程序若干信息。)语句执行后,系统要反馈给应用程序若干信息。
8、 描述系统当前工作状态描述系统当前工作状态 描述运行环境描述运行环境2)这些信息将送到)这些信息将送到SQLCA中。中。3)应用程序从)应用程序从SQLCA中取出这些状态信息,据此决定中取出这些状态信息,据此决定接下来执行的语句。接下来执行的语句。第8章 数据库编程 2 2、SQLCA使用方法使用方法(1)定义)定义SQLCA 用用EXEC SQL INCLUDE SQLCA定义定义(2)使用)使用SQLCA SQLCA中有一个存放每次执行中有一个存放每次执行SQL语句后返回代语句后返回代码的变量码的变量SQLCODE。 应用程序每执行完一条应用程序每执行完一条SQL 语句之后都应该测试语句之
9、后都应该测试一下一下SQLCODE的值,以了解该的值,以了解该SQL语句执行情况语句执行情况并做相应处理。并做相应处理。 如果如果SQLCODE等于预定义的常量等于预定义的常量SUCCESS,则,则表示表示SQL语句成功,否则表示出错。语句成功,否则表示出错。第8章 数据库编程 例如在执行删除语句例如在执行删除语句DELETE后,根据不同的执后,根据不同的执行情况,行情况,SQLCA中有下列不同的信息:中有下列不同的信息: 违反数据保护规则,操作拒绝违反数据保护规则,操作拒绝 没有满足条件的行,一行也没有删除没有满足条件的行,一行也没有删除 成功删除,并有删除的行数(成功删除,并有删除的行数(
10、SQLCODE=SUCCESS) 无条件删除警告信息无条件删除警告信息 由于各种原因,执行出错由于各种原因,执行出错 第8章 数据库编程 二、主变量二、主变量 1 1、主变量、主变量 嵌入式嵌入式SQL语句中可以使用主语言的程序变量来输入语句中可以使用主语言的程序变量来输入或输出数据。或输出数据。SQL语句中使用的主语言程序变量简称为主语句中使用的主语言程序变量简称为主变量(变量(Host Variable) 。2 2、主变量的类型、主变量的类型 1 1)输入主变量,由应用程序对其赋值,输入主变量,由应用程序对其赋值,SQL语句引用;语句引用; 2 2)输出主变量,由)输出主变量,由SQL语句
11、对其赋值或设置状态信息,语句对其赋值或设置状态信息,返回给应用程序。返回给应用程序。 利用输入主变量,可指定向数据库中插入数据,可利用输入主变量,可指定向数据库中插入数据,可将数据库中的数据修改为指定值等。利用输出主变量,我将数据库中的数据修改为指定值等。利用输出主变量,我们可以得到们可以得到SQL语句的结果数据和状态。语句的结果数据和状态。第8章 数据库编程 3 3、指示变量、指示变量 一个主变量可以附带一个任选的指示变量(一个主变量可以附带一个任选的指示变量(Indicator Variable)。)。 指示变量是一个整型变量,用来指示变量是一个整型变量,用来“指示指示”所指主变量所指主变
12、量的值或条件。的值或条件。 输入输入主变量可以利用指示变量赋空值,输出主变量可主变量可以利用指示变量赋空值,输出主变量可以利用指示变量检测出是否空值,值是否被截断。以利用指示变量检测出是否空值,值是否被截断。第8章 数据库编程 4 4、在、在SQLSQL语句中使用主变量和指示变量的方法语句中使用主变量和指示变量的方法(1 1)说明主变量和指示变量)说明主变量和指示变量 所有主变量和指示变量必须在所有主变量和指示变量必须在SQL语句语句BEGIN DECLARE SECTION与与END DECLARE SECTION之间进行说明。之间进行说明。BEGIN DECLARE SECTION. .
13、(说明主变量和指示变量说明主变量和指示变量).END DECLARE SECTION第8章 数据库编程 (2 2)使用主变量)使用主变量 说明之后的主变量可以在说明之后的主变量可以在SQL语句中任何一个能语句中任何一个能够使用表达式的地方出现。为了与数据库对象名(表够使用表达式的地方出现。为了与数据库对象名(表名、视图名、列名等)区别,名、视图名、列名等)区别,SQL语句中的主变量名语句中的主变量名前要加冒号(前要加冒号(:)作为标志。)作为标志。(3 3)使用指示变量)使用指示变量 SQL语句中的指示变量前也必须加冒号标志,并语句中的指示变量前也必须加冒号标志,并且要紧跟在所指主变量之后。且
14、要紧跟在所指主变量之后。5 5、在、在SQLSQL语句之外使用主变量和指示变量的方法语句之外使用主变量和指示变量的方法 可以直接引用,不必加冒号。可以直接引用,不必加冒号。第8章 数据库编程 三、游标三、游标 1 1、为什么要使用游标?、为什么要使用游标? SQL语言与主语言具有不同数据处理方式。语言与主语言具有不同数据处理方式。 SQL语言是面向集合的,一条语言是面向集合的,一条SQL语句原则上可以语句原则上可以产生或处理多条记录。产生或处理多条记录。 而主语言是面向记录的,一组主变量一次只能存放而主语言是面向记录的,一组主变量一次只能存放一条记录。一条记录。 所以仅使用主变量并不能完全满足
15、所以仅使用主变量并不能完全满足SQL语句向应用语句向应用程序输出数据的要求,为此嵌入式程序输出数据的要求,为此嵌入式SQL引入了游标的概引入了游标的概念,用游标来协调这两种不同的处理方式。念,用游标来协调这两种不同的处理方式。第8章 数据库编程 2、游标、游标 游标游标是系统为用户开设的一个数据缓冲区,存放是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。语句的执行结果。 每个每个游标区都有一个名字。游标区都有一个名字。 用户用户可以用可以用SQL语句逐一从游标中获取记录,并赋语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。给主变量,交由主语言进一步处理。第8章 数据库
16、编程 四、建立和关闭数据库连接四、建立和关闭数据库连接 嵌入式嵌入式SQL程序要访问数据库必须先连接数据库。程序要访问数据库必须先连接数据库。RDBMS根据用户信息对连接请求进行合法性验证,只有根据用户信息对连接请求进行合法性验证,只有通过了身份验证,才能建立一个可用的合法连接。通过了身份验证,才能建立一个可用的合法连接。1、建立数据库连接、建立数据库连接EXEC SQL CONNECT TO target AS connection-name USER user-name; target是要连接的数据库服务器,可以是常见的服务是要连接的数据库服务器,可以是常见的服务器标识串,如器标识串,如:
17、 ,或者是包,或者是包含服务器标识的含服务器标识的SQL串常量,也可以是串常量,也可以是DEFAULT。 connect-name是可选的连接名,必须是一个有效的标是可选的连接名,必须是一个有效的标识符,在整个程序内只有一个连接时可不指定连接名识符,在整个程序内只有一个连接时可不指定连接名第8章 数据库编程 2、关闭数据库连接、关闭数据库连接 EXEC SQL DISCONNECT connection;3、程序运行过程中可以修改当前连接、程序运行过程中可以修改当前连接 EXEC SQL SET CONNECTION connection-name | DEFAULT;第8章 数据库编程 五、
18、程序实例五、程序实例例例1依次检查某系的学生记录,交互式更新某些学生年龄。依次检查某系的学生记录,交互式更新某些学生年龄。EXEC SQL BEGIN DEC LARE SECTION; /*主变量说明开始*/ char deptname64;char HSno64;char HSname64; char HSsex64;int HSage;intNEWAGE;EXEC SQL END DECLARE SECTION; /*主变量说明结束*/long SQLCODE;EXEC SQL INCLUDE sqlca; /*定义SQL通信区*/第8章 数据库编程 int main(void) /*C
19、语言主程序开始*/ 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 TESTlocalhost:54321 USER SYSTEM /MANAGER; /*连接数据库TEST*/ EXEC SQL DECLARE SX CURSOR FOR /*定义游标*/ SELECT Sno, Sname, Ssex, Sage /*SX对应语句
20、的执行结果*/ FROM Student WHERE SDept = :deptname; EXEC SQL OPEN SX; /*打开游标SX便指向查询结果的第一行*/第8章 数据库编程 for ( ; ; ) /*用循环结构逐条处理结果集中的记录*/ EXEC SQL FETCH SX INTO :HSno, :HSname, :HSsex,:HSage; /*推进游标,将当前数据放入主变量*/ if (sqlca.sqlcode != 0) /* sqlcode != 0,表示操作不成功*/ break; /*利用SQLCA中的状态信息决定何时退出循环*/ if(count+ = 0)
21、/*如果是第一行的话,先打出行头*/ printf(n%-10s %-20s %-10s %-10sn, Sno, Sname, Ssex, Sage); 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);第8章 数据库编程 if (yn = y | yn = Y) /*如果选择更新操作
22、*/printf(INPUT NEW AGE:);scanf(%d,&NEWAGE); /*用户输入新年龄到主变量中*/EXEC SQL UPDATE Student /*嵌入式SQL*/SET Sage = :NEWAGEWHERE CURRENT OF SX ; /*对当前游标指向的学生年龄进行更新*/ EXEC SQL CLOSE SX; /*关闭游标SX不再和查询结果对应*/EXEC SQL COMMIT WORK; /*提交更新*/EXEC SQL DISCONNECT TEST; /*断开数据库连接*/第8章 数据库编程 例例2为了能够更好地理解上面的概念,下面给出带有嵌入为了能够
23、更好地理解上面的概念,下面给出带有嵌入式式SQL的一小段的一小段C程序。程序。EXEC SQL INCLUDE SQLCA; 定义定义SQL通信区通信区EXEC SQL BEGIN DECLARE SECTION; 说明主变量说明主变量CHAR title_id(7);CHAR title(81);INT royalty;EXEC SQL END DECLARE SECTION;main() EXEC SQL DECLARE C1 CURSOR FOR 定义游标定义游标 SELECT tit_id, tit, roy FROM titles; EXEC SQL OPEN C1; 打开游标打开游
24、标 第8章 数据库编程 for(;) EXEC SQL FETCH C1 INTO :title_id, :title, :royalty; if (sqlca.sqlcode SUCCESS) break; printf(Title ID: %s, Royalty: %d, :title_id, :royalty); printf(Title: %s, :title);EXEC SQL CLOSE C1; 关闭游标关闭游标 第8章 数据库编程 8.1.3 不用游标的不用游标的SQL语句语句 不用游标的不用游标的SQL语句有:语句有: 说明性语句说明性语句 数据定义语句数据定义语句 数据控制语
25、句数据控制语句 查询结果为单记录的查询结果为单记录的SELECT语句语句 非非CURRENT形式的形式的UPDATE语句语句 非非CURRENT形式的形式的DELETE语句语句 INSERT语句语句第8章 数据库编程 所有的说明性语句及数据定义与控制语句都不需要所有的说明性语句及数据定义与控制语句都不需要使用游标。它们是嵌入式使用游标。它们是嵌入式SQL中最简单的一类语句,不中最简单的一类语句,不需要返回结果数据,也不需要使用主变量。在主语言中需要返回结果数据,也不需要使用主变量。在主语言中嵌入说明性语句及数据定义与控制语句,只要给语句加嵌入说明性语句及数据定义与控制语句,只要给语句加上前缀上
26、前缀EXEC SQL和语句结束符即可。和语句结束符即可。 INSERT语句也不需要使用游标,但通常需要使用语句也不需要使用游标,但通常需要使用主变量。主变量。 SELECT语句、语句、UPDATE语句、语句、DELETE语句则复语句则复杂些。杂些。第8章 数据库编程 一、说明性语句一、说明性语句 交互式交互式SQL中没有说明性语句,说明性语句是专为中没有说明性语句,说明性语句是专为在嵌入式在嵌入式SQL中说明主变量等而设置的,主要有两条语中说明主变量等而设置的,主要有两条语句:句: EXEC SQL BEGIN DECLARE SECTION; 和和 EXEC SQL END DECLARE
27、SECTION; 两条语句必须配对出现,相当于一个括号,两条语两条语句必须配对出现,相当于一个括号,两条语句中间是主变量的说明。句中间是主变量的说明。 第8章 数据库编程 二、数据定义语句二、数据定义语句 例:例: 建立一个建立一个“学生学生”表表StudentEXEC SQL CREATE TABLE Student(Sno CHAR(5) NOT NULL UNIQUE,Sname CHAR(20),Ssex CHAR(1),Sage INT,Sdept CHAR(15); 数据定义语句中不允许使用主变量。例如下列语句数据定义语句中不允许使用主变量。例如下列语句是错误的:是错误的: EXE
28、C SQL DROP TABLE :table_name; 第8章 数据库编程 三、数据控制语句三、数据控制语句 例:把查询例:把查询Student表权限授给用户表权限授给用户U1EXEC SQL GRANT SELECT ON TABLE Student TO U1; 四、查询结果为单记录的四、查询结果为单记录的SELECT语句语句 在嵌入式在嵌入式SQL中,查询结果为单记录的中,查询结果为单记录的SELECT语句语句需用需用INTO子句指定查询结果的存放地点。语句的格式为:子句指定查询结果的存放地点。语句的格式为:EXEC SQL SELECT ALL|DISTINCT ,. INTO ,
29、. FROM , . WHERE GROUP BY HAVING ORDER BY ASC|DESC;第8章 数据库编程 该语句对交互式该语句对交互式SELECT语句的扩充就是多了一个语句的扩充就是多了一个INTO子句,把从数据库中找到的符合条件的记录,放到子句,把从数据库中找到的符合条件的记录,放到INTO子句指出的主变量中去。使用该语句需要注意:子句指出的主变量中去。使用该语句需要注意: (1) INTO子句、子句、WHERE子句的条件表达式、子句的条件表达式、HAVING短语的的条件表达式中均可以使用主变量,但短语的的条件表达式中均可以使用主变量,但这些主变量必须事先加以说明,并且引用时
30、前面要加上这些主变量必须事先加以说明,并且引用时前面要加上冒号。冒号。 (2)如果数据库中没有满足条件的记录,即查询结果)如果数据库中没有满足条件的记录,即查询结果为空,则为空,则DBMS将将SQLCODE的值置为的值置为100。 (3)如果查询结果实际上并不是单条记录,而是多条)如果查询结果实际上并不是单条记录,而是多条记录,则程序出错,记录,则程序出错,DBMS会在会在SQLCA中返回错误信息。中返回错误信息。第8章 数据库编程 (4)查询返回的记录中,可能某些列值为空值)查询返回的记录中,可能某些列值为空值NULL。 如果如果INTO子句中主变量后面跟有指示变量,则当查子句中主变量后面跟
31、有指示变量,则当查询得出的某个数据项为空值时,系统会自动将相应主变询得出的某个数据项为空值时,系统会自动将相应主变量后面的指示变量置为负值,但不向该主变量执行赋值量后面的指示变量置为负值,但不向该主变量执行赋值操作,即主变量值仍保持执行操作,即主变量值仍保持执行SQL语句之前的值。所以语句之前的值。所以当发现指示变量值为负值时,不管主变量为何值,均应当发现指示变量值为负值时,不管主变量为何值,均应认为主变量值为认为主变量值为NULL。 指示变量只能用于指示变量只能用于INTO子句中,并且也必须事先加子句中,并且也必须事先加以说明,引用时前面要加上冒号。以说明,引用时前面要加上冒号。第8章 数据
32、库编程 例:根据学生号码查询学生信息。假设已将要查询的学生例:根据学生号码查询学生信息。假设已将要查询的学生的学号赋给了主变量的学号赋给了主变量givensno EXEC SQL SELECT Sno, Sname, Ssex, Sage, Sdept INTO :Hsno, :Hname, :Hsex, :Hage, :Hdept FROM Student WHERE Sno=:givensno; 上面的上面的SELECT语句中语句中Hsno, Hname, Hsex, Hage, Hdept和和givensno均是主变量,并均已在前面的程序中说均是主变量,并均已在前面的程序中说明过了。明过
33、了。第8章 数据库编程 例:例: 查询某个学生选修某门课程的成绩。假设已将要查询查询某个学生选修某门课程的成绩。假设已将要查询的学生的学号赋给了主变量的学生的学号赋给了主变量givensno,将课程号赋给了,将课程号赋给了主变量主变量givencno EXEC SQL SELECT Sno, Cno, Grade INTO :Hsno, :Hcno, :Hgrade : Gradeid FROM SC WHERE Sno=:givensno AND Cno=:givencno; 由于学生选修一门课后有可能没有参加考试,即可由于学生选修一门课后有可能没有参加考试,即可为空值,所以在为空值,所以在
34、INTO子句中加了指示变量子句中加了指示变量Gradeid,用,用于指示主变量于指示主变量Hgrade是否为空值。指示变量也需事先说是否为空值。指示变量也需事先说明。执行此语句后,如果明。执行此语句后,如果Gradeid小于小于0,则不论,则不论Hgrade为何值,均认为该学生成绩为空值。为何值,均认为该学生成绩为空值。 第8章 数据库编程 五、非五、非CURRENT形式的形式的UPDATE语句语句 在在UPDATE语句中,语句中,SET子句和子句和WHERE子句中均可子句中均可以使用主变量,其中以使用主变量,其中SET子句中还可以使用指示变量。子句中还可以使用指示变量。例:将全体学生例:将全
35、体学生1号课程的考试成绩增加若干分。假设增加号课程的考试成绩增加若干分。假设增加的分数已赋给主变量的分数已赋给主变量Raise EXEC SQL UPDATE SC SET Grade=Grade+:Raise WHERE Cno=1; 该操作实际上是一个集合操作,该操作实际上是一个集合操作,DBMS会修改所有学会修改所有学生的生的1号课程的号课程的Grade属性列。属性列。第8章 数据库编程 例例6:修改某个学生:修改某个学生1号课程的成绩。假设该学生的学号已赋给号课程的成绩。假设该学生的学号已赋给主变量主变量givensno,修改后的成绩已赋给主变量,修改后的成绩已赋给主变量newgrad
36、e EXEC SQL UPDATE SC SET Grade=:newgrade WHERE Sno=:givensno;例例7 :将计算机系全体学生年龄置:将计算机系全体学生年龄置NULL值值 Sageid=-1; EXEC SQL UPDATE Student SET Sage=:Raise:Sageid WHERE Sdept=CS; 将指示变量将指示变量Sageid赋一个负值后,无论主变量赋一个负值后,无论主变量Raise为为何值,何值,DBMS都会将都会将CS系所有记录的年龄属性置空值。它系所有记录的年龄属性置空值。它等价于:等价于: EXEC SQL UPDATE Student
37、SET Sage=NULL WHERE Sdept=CS; 第8章 数据库编程 六、非六、非CURRENT形式的形式的DELETE语句语句 DELETE语句的语句的WHERE子句中可以使用主变量指子句中可以使用主变量指定删除条件。定删除条件。例:某个学生退学了,现要将有关他的所有选课记录删除例:某个学生退学了,现要将有关他的所有选课记录删除掉。假设该学生的姓名已赋给主变量掉。假设该学生的姓名已赋给主变量stdnameEXEC SQL DELETE FROM SC WHERE Sno= (SELECT Sno FROM Student WHERE Sname=:stdname);第8章 数据库编
38、程 另一种等价实现方法为:另一种等价实现方法为: EXEC SQL DELETE FROM SC WHERE :stdname= (SELECT Sname FROM Student WHERE Studnet.Sno=SC.sno); 显然第一种方法更直接,从而也更高效些。显然第一种方法更直接,从而也更高效些。 如果该学生选修了多门课程,执行上面的语句时,如果该学生选修了多门课程,执行上面的语句时,DBMS会自动执行集合操作,即把他选修的所有课程都会自动执行集合操作,即把他选修的所有课程都删除掉。删除掉。 第8章 数据库编程 七、七、INSERT语句语句 INSERT语句的语句的VALUES
39、子句中可以使用主变量和指子句中可以使用主变量和指示变量。示变量。例:某个学生新选修了某门课程,将有关记录插入例:某个学生新选修了某门课程,将有关记录插入SC表中。表中。假设学生的学号已赋给主变量假设学生的学号已赋给主变量stdno,课程号已赋给主变,课程号已赋给主变量量couno。 gradeid=-1; EXEC SQL INSERT INTO SC(Sno, Cno, Grade) VALUES(:stdno, :couno, :gr:gradeid); 由于该学生刚选修课程,尚未考试,因此成绩列为由于该学生刚选修课程,尚未考试,因此成绩列为空。所以本例中用指示变量指示相应的主变量为空值。
40、空。所以本例中用指示变量指示相应的主变量为空值。第8章 数据库编程 8.1.4 使用游标的使用游标的SQL语句语句 必须使用游标的必须使用游标的SQL语句有:语句有: 查询结果为多条记录的查询结果为多条记录的SELECT语句语句 CURRENT形式的形式的UPDATE语句语句 CURRENT形式的形式的DELETE语句语句 一、查询结果为多条记录的一、查询结果为多条记录的SELECT语句语句 一般情况下,一般情况下,SELECT语句查询结果都是多条记录,语句查询结果都是多条记录,而高级语言一次只能处理一条记录,因此需要以游标机而高级语言一次只能处理一条记录,因此需要以游标机制作为桥梁,将多条记
41、录一次一条送至宿主程序处理,制作为桥梁,将多条记录一次一条送至宿主程序处理,从而把对集合的操作转换为对单个记录的处理。从而把对集合的操作转换为对单个记录的处理。第8章 数据库编程 使用游标的步骤为:使用游标的步骤为: (1)说明游标。)说明游标。 EXEC SQL DECLARE CURSOR FOR ; (2)打开游标。)打开游标。 EXEC SQL OPEN ; (3)推进游标指针并取当前记录。)推进游标指针并取当前记录。EXEC SQL FETCH INTO ,.; (4)关闭游标。)关闭游标。EXEC SQL CLOSE ;第8章 数据库编程 例:查询某个系全体学生的信息。要查询的系名
42、由用户在例:查询某个系全体学生的信息。要查询的系名由用户在程序运行过程中指定,放在主变量程序运行过程中指定,放在主变量deptname中中 EXEC SQL BEGIN DECLARE SECTION; /* 说明主变量说明主变量*/EXEC SQL END DECLARE SECTION;gets(deptname); /* 为主变量为主变量deptname赋值赋值 */EXEC SQL DECLARE SX CURSOR FOR SELECT Sno, Sname, Ssex, Sage FROM Student WHERE SDept=:deptname; /* 说明游标说明游标 */E
43、XEC SQL OPEN SX /* 打开游标打开游标 */第8章 数据库编程 WHILE(1) EXEC SQL FETCH SX INTO :HSno, :HSname, :HSsex, :HSage; /* 取值并送主变量取值并送主变量 */if (sqlca.sqlcode SUCCESS) break; /* 若处理完毕或出现若处理完毕或出现SQL错误,则退出循环错误,则退出循环 */ ./* 由主语言语句进行进一步处理由主语言语句进行进一步处理 */; EXEC SQL CLOSE SX; /* 关闭游标关闭游标 */第8章 数据库编程 二、二、CURRENT形式的形式的UPDAT
44、E语句和语句和DELETE语句语句 非非CURRENT形式的形式的UPDATE语句和语句和DELETE语句都是语句都是集合操作,一次修改或删除所有满足条件的记录。如果只集合操作,一次修改或删除所有满足条件的记录。如果只想修改或删除其中某个记录,则需要用带游标的想修改或删除其中某个记录,则需要用带游标的SELECT语句查出所有满足条件的记录,从中进一步找出要修改或语句查出所有满足条件的记录,从中进一步找出要修改或删除的记录,然后修改或删除之。具体地说就是:删除的记录,然后修改或删除之。具体地说就是: (1) 用用DECLARE语句说明游标。如果是为语句说明游标。如果是为CURRENT形式的形式的
45、UPDATE语句作准备,则语句作准备,则SELECT语句中要用语句中要用FOR UPDATE OF 子句指明将来检索出的数据在指定列是可修改的。如果是子句指明将来检索出的数据在指定列是可修改的。如果是为为CURRENT形式的形式的DELETE语句作准备,则不必使用上语句作准备,则不必使用上述子句。述子句。第8章 数据库编程 (2)用)用OPEN语句打开游标,把所有满足查询条件的记录从语句打开游标,把所有满足查询条件的记录从指定表取到缓冲区中。指定表取到缓冲区中。(3) 用用FETCH语句推进游标指针,并把当前记录从缓冲区语句推进游标指针,并把当前记录从缓冲区中取出来送至主变量。中取出来送至主变
46、量。(4)检查该记录是否是要修改或删除。若是,则用)检查该记录是否是要修改或删除。若是,则用UPDATE语句或语句或DELETE语句修改或删除该记录。这时语句修改或删除该记录。这时UPDATE语语句和句和DELETE语句中要用语句中要用 WHERE CURRENT OF 子句,表示修改或删除的是该游标中最近一次取出的记录,子句,表示修改或删除的是该游标中最近一次取出的记录,即游标指针指向的记录。即游标指针指向的记录。 第第3和和4步通常用在一个循环结构中,通过循环执行步通常用在一个循环结构中,通过循环执行FETCH语句,逐条取出结果集中的行进行判断和处理。语句,逐条取出结果集中的行进行判断和处
47、理。 (5)处理完毕用)处理完毕用CLOSE语句关闭游标,释放结果集占用的语句关闭游标,释放结果集占用的缓冲区和其他资源。缓冲区和其他资源。第8章 数据库编程 例:查询某个系全体学生的信息(要查询的系名由主变量例:查询某个系全体学生的信息(要查询的系名由主变量deptname指定),然后根据用户的要求修改删除其中某些指定),然后根据用户的要求修改删除其中某些记录。记录。EXEC SQL BEGIN DECLARE SECTION; /* 说明主变量说明主变量 deptname,HSno,HSname,HSsex,HSage等等*/EXEC SQL END DECLARE SECTION;get
48、s(deptname); EXEC SQL DECLARE SX CURSOR FOR SELECT Sno, Sname, Ssex, Sage FROM Student WHERE SDept=:deptname; EXEC SQL OPEN SX第8章 数据库编程 WHILE(1) EXEC SQL FETCH SX INTO :HSno, :HSname, :HSsex, :HSage; if (sqlca.sqlcode SUCCESS) break; printf(%s, %s, %s, %d, Sno, Sname, Ssex, Sage); printf(DELETE ? );
49、 scanf(%c,&yn); if (yn=y or yn=Y) EXEC SQL DELETE FROM Student WHERE CURRENT OF SX; /* 删除当前记录删除当前记录 */ ;EXEC SQL CLOSE SX; 第8章 数据库编程 8.1.5 动态动态SQL 静态嵌入式静态嵌入式SQL 静态嵌入式静态嵌入式SQL语句能够满足一般要求语句能够满足一般要求 无法满足要到执行时才能够确定要提交的无法满足要到执行时才能够确定要提交的SQL语句语句 动态嵌入式动态嵌入式SQL 允许在程序运行过程中临时允许在程序运行过程中临时“组装组装”SQL语句语句 支持动态组装支持动
50、态组装SQL语句和动态参数两种形式语句和动态参数两种形式第8章 数据库编程 一、使用一、使用SQL语句主变量语句主变量 程序主变量包含的内容是程序主变量包含的内容是SQL语句的内容,而不是原语句的内容,而不是原来保存数据的输入或输出变量。来保存数据的输入或输出变量。 SQL语句主变量在程序执行期间可以设定不同的语句主变量在程序执行期间可以设定不同的SQL语句,然后立即执行语句,然后立即执行 。例:创建基本表例:创建基本表TESTEXEC SQL BEGIN DECLARE SECTION;const char *stmt = CREATE TABLE test(a int); /* SQL语句
51、主变量语句主变量 */EXEC SQL END DECLARE SECTION;. .EXEC SQL EXECUTE IMMEDIATE :stmt; /* 执行语句执行语句 */第8章 数据库编程 二、动态参数二、动态参数 动态参数是动态参数是SQL语句中的可变元素,使用参数符号语句中的可变元素,使用参数符号(?)表表示该位置的数据在运行时设定。示该位置的数据在运行时设定。 和主变量不同,动态参数的输入不是编译时完成绑定,和主变量不同,动态参数的输入不是编译时完成绑定,而是通过而是通过 (prepare)语句准备主变量和执行语句准备主变量和执行(execute)时绑定数时绑定数据或主变量来
52、完成。据或主变量来完成。 使用动态参数的步骤:使用动态参数的步骤:1.声明声明SQL语句主变量。语句主变量。2.准备准备SQL语句语句(PREPARE)。EXEC SQL PREPARE FROM ;3.执行准备好的语句执行准备好的语句(EXECUTE)EXEC SQL EXECUTE INTO USING ;第8章 数据库编程 例:向例:向TEST中插入元组。中插入元组。EXEC SQL BEGIN DECLARE SECTION;const char *stmt = INSERT INTO test VALUES(?); /*声明声明SQL主变量主变量 */EXEC SQL END DEC
53、LARE SECTION;. .EXEC SQL PREPARE mystmt FROM :stmt; /* 准备语句准备语句 */. .EXEC SQL EXECUTE mystmt USING 100; /* 执行语句执行语句 */EXEC SQL EXECUTE mystmt USING 200; /* 执行语句执行语句 */第8章 数据库编程 8.2.1 PL/SQL的块结构的块结构 PL/SQL是编写数据库存储过程的一种过程语言。它结合了SQL的数据操作能力和过程化语言的流程控制能力,是SQL的过程化发展。 PL/SQL程序的基本结构是块。所有的PL/SQL程序都是由块构成。块之间可
54、以互相嵌套 每个块完成一个逻辑操作 8.2 存储过程存储过程第8章 数据库编程 PL/SOL块的基本结构:块的基本结构: 1、定义部分、定义部分 DECLARE -变量、常量、游标、异常等 n定义的变量、常量等只能在该基本块中使用n当基本块执行结束时,定义就不再存在2、执行部分、执行部分 BEGIN -SQL语句、PL/SQL的流程控制语句 EXCEPTION -异常处理部分 END;第8章 数据库编程 8.2.2 变量常量的定义变量常量的定义1. PL/SQL中定义变量的语法形式是中定义变量的语法形式是: 变量名 数据类型 NOT NULL:=初值表达式或 变量名 数据类型 NOT NULL
55、初值表达式2. 常量的定义类似于变量的定义常量的定义类似于变量的定义: 常量名 数据类型 CONSTANT :=常量表达式 常量必须要给一个值,并且该值在存在期间或常量的作用域内不能改变。如果试图修改它,PL/SQL将返回一个异常。3. 赋值语句赋值语句 变量名称:=表达式第8章 数据库编程 8.2.3 控制结构控制结构 一、一、 条件控制语句条件控制语句 IF-THEN, IF-THEN-ELSE和嵌套的和嵌套的IF语句语句 1. IF condition THEN Sequence_of_statements; END IF 2. IF condition THEN Sequence_of
56、_statements1; ELSE Sequence_of_statements2; END IF;3. 在THEN和ELSE子句中还可以再包括IF语句,即IF语句可以嵌套。第8章 数据库编程 二、循环控制语句二、循环控制语句 LOOP, WHILE-LOOP和和FOR-LOOP 1.最简单的循环语句最简单的循环语句LOOP LOOP Sequence_of_statements; END LOOP; 多数数据库服务器的PL/SQL都提供EXIT、BREAK或LEAVE等循环结束语句,保证LOOP语句块能够结束。第8章 数据库编程 2. WHILE-LOOP WHILE condition
57、LOOP Sequence_of_statements;END LOOP;n每次执行循环体语句之前,首先对条件进行求值n如果条件为真,则执行循环体内的语句序列。n如果条件为假,则跳过循环并把控制传递给下一个语句 3. FOR-LOOP FOR count IN REVERSEbound1 bound2 LOOP Sequence_of_statements;END LOOP;第8章 数据库编程 三、错误处理三、错误处理 如果PL/SQL在执行时出现异常,则应该让程序在产生异常的语句处停下来,根据异常的类型去执行异常处理语句。 SQL标准对数据库服务器提供什么样的异常处理做出了建议,要求PL/S
58、QL管理器提供完善的异常处理机制 。第8章 数据库编程 8.2.4 存储过程存储过程PL/SQL块类型: 命名块:编译后保存在数据库中,可以被反复调用,运行速度较快。存储过程和函数是命名块。 匿名块:每次执行时都要进行编译,它不能被存储到数据库中,也不能在其他的PL/SQL块中调用。第8章 数据库编程 存储过程:由PL/SQL语句书写的过程,经编译和优化后存储在数据库服务器中,使用时只要调用即可。 一、存储过程的优点一、存储过程的优点1. 运行效率高2. 降低了客户机和服务器之间的通信量3. 方便实施企业规则第8章 数据库编程 二、二、 存储过程的用户接口存储过程的用户接口 用户可通过下面的用
59、户可通过下面的SQL语句创建、重命名、执行和删语句创建、重命名、执行和删除存储过程。除存储过程。1. 创建存储过程创建存储过程CREATE Procedure 过程名(参数1,参数2,.) AS;n过程名:数据库服务器合法的对象标识n参数列表:用名字来标识调用时给出的参数值,必须指定值的数据类型。参数也可以定义输入参数、输出参数或输入/输出参数。默认为输入参数。n过程体:是一个。包括声明部分和可执行语句部分 第8章 数据库编程 例: 利用存储过程来实现下面的应用: 从一个账户转指定数额的款项到另一个账户中。CREATE PROCEDURE TRANSFER(inAccount INT, out
60、Account INT, amount FLOAT) AS DECLAREtotalDeposit FLOAT;BEGIN /* 检查转出账户的余额 */ SELECT total INTO totalDeposit FROM ACCOUNT WHERE ACCOUNTNUM=outAccount; IF totalDeposit IS NULL THEN /* 账户不存在或账户中没有存款 */ ROLLBACK; RETURN; END IF; 第8章 数据库编程 IF totalDeposit amount THEN /* 账户账户存款不足 */ ROLLBACK; RETURN;END
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电力工程承包合同范本五篇
- 2025年度家庭窗帘个性化设计与安装合同
- 2025年度建筑工地劳务派遣与用工备案合同
- 2025年度绿色酒店项目桩基检测与施工一体化合同
- 2025年度智能家居产品合作开发居间服务协议合同
- 2025年度画室品牌合作推广与市场营销合同
- 现代零售终端的供应链优化策略
- 2025年度户外广告牌租赁广告创意设计合同
- 2025年度离婚协议中房产租赁与使用协议范本
- 2025年度新能源储能技术研发与应用协议
- DB37-T 3449-2019山东省金属非金属地下矿山通风技术规范
- 山西省大同市基层诊所医疗机构卫生院社区卫生服务中心村卫生所室地址信息
- 项目部、公司成本管理流程图
- CCAA 基于风险的认证合规管理-认证档案质量管理的风险控制
- 高中英语选择性必修二 Unit 1 Period 1 Reading and thinking(课件)(共38张)
- 小学生电子小报通用模板-A4电子小报15
- CAS云计算软件平台深入介绍
- 课堂教学方法与手段(课堂PPT)课件(PPT 16页)
- 固定资产投资统计培训PPT课件
- 氯盐型和环保型融雪剂发展现状
- 平顶山第四届名师名班主任名校长培养方案
评论
0/150
提交评论