《MySQL数据原理与应用》 课件 第9章 存储过程与游标_第1页
《MySQL数据原理与应用》 课件 第9章 存储过程与游标_第2页
《MySQL数据原理与应用》 课件 第9章 存储过程与游标_第3页
《MySQL数据原理与应用》 课件 第9章 存储过程与游标_第4页
《MySQL数据原理与应用》 课件 第9章 存储过程与游标_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

存储过程与游标第9章通过本课程的学习,您将应该:了解数据库的相关概念熟悉数据库工具的使用熟悉SQL语言的规则与规范熟练掌握MySQL数据库管理方法熟练掌握MySQL表结构管理方法熟练掌握表记录的检索方法熟练掌握视图与索引的使用方法熟练掌握数据处理之增删改熟练掌握存储过程与游标的使用方法熟练掌握存储函数的应用熟练掌握触发器的应用熟练掌握事务的基本特性和应用场景熟练掌握数据库安全及管理熟练掌握MySQL数据库备份和恢复操作了解利用MySQL+Java开发一个数据库学习系统并部署课程目标项目部署成功本讲教学目标了解存储的种类和优势。掌握存储过程的创建、调用、查看、修改和删除。了解变量的类别和使用。掌握基本的流程控制语句。通过完成课业任务,熟练掌握存储过程的知识点。通过本讲的学习,您将可以:6.OPTION2.OPTIONOPTION4.OPTION3.5.OPTION存储过程的应用通过不同的工具熟悉管理存储过程。1.OPTION目录Content变量类型介绍流程控制课业任务常见错误及解决方案删除存储过程存储过程的修改游标的使用存储过程的创建、调用与查看存储过程概述010203040506070809存储过程概述019.1存储过程概述存储过程是一组经过预先编译的SQL语句的封装,它由声明式的SQL语句(例如DDL语句和DML语句)以及过程式的SQL语句(例如分支语句和循环语句)组成。在实际操作中,经常需要多条SQL语句处理多个表才能完成一个完整的操作。如果在客户端和服务器端频繁地传输多条SQL语句,那么将会极大地降低命令的执行效率。存储过程预先将多条SQL语句组合成一个程序并存储在MySQL服务器上。当需要执行时,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列SQL语句全部执行,从而大大提高了数据处理速度。9.1存储过程概述存储过程具有以下优点:(1)操作简易性:简化操作,提高了SQL语句的重用性,减少了开发程序员的压力。(2)便利性:减少网络传输量(客户端不需要把所有的SQL语句通过网络发给服务器)。(3)高效性:减少操作过程中的失误,提高效率。(4)安全性:减少了SQL语句在网络中暴露的风险,也提高了数据查询的安全性。存储过程具有以下缺点:(1)存储过程往往被定制于特定的数据库上,因为其支持的编程语言不同。如果需要切换到其他厂商的数据库系统,那么就需要重新编写原有的存储过程。(2)存储过程的性能调优与撰写受到各种数据库系统的限制。存储过程的创建、调用与查看029.2.1创建存储过程在MySQL中,存储程序是用CREATEPROCEDURE语句创建的。使用CALL语句来调用存储过程,且只能使用输出变量传回值。存储过程也可以调用其他存储过程。CREATEPROCEDURE存储过程名([参数[,...]])[特性...]存储过程语句块在MySQL中,可以使用CREATEPROCEDURE语句来创建存储过程,具体的语法格式如下。存储过程名:是该存储过程的名称;参数:是指定存储过程的参数列表,存储过程中也可以不带任何参数。其中,参数由3部分组成,具体的语法格式如下。[IN|OUT|INOUT]参数名类型IN表示输入参数,OUT表示输出参数,INOUT表示该参数既可以作为输入参数也可以作为输出参数;参数名:表示参数名称;类型:表示参数类型,在MySQL中这个类型可以是数据库中任意一种类型。9.2.1创建存储过程存储过程的特性有以下5种取值:(1)LANGUAGESQL:指明使用SQL语句来组成routine_body部分,当前系统仅支持SQL。(2)[NOT]DETERMINISTIC:指明存储过程执行的结果是否是“确定的”。DETERMINISTIC表示结果是确定的,即每次执行存储过程时,对于相同的输入参数产生相同的结果;NOTDETERMINISTIC表示结果是不确定的,即每次执行存储过程时,对于相同的输入参数产生不同的结果。系统默认指定为NOTDETERMINISTIC。(3){CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}:指定使用SQL语句时的限制。CONTAINSSQL表示包含SQL语句,但是这些语句中不包括读写数据的语句;NOSQL表示不包含SQL语句;READSSQLDATA表示包含读数据的SQL语句,但不包含写入数据的SQL语句;MODIFIESSQLDATA表示包括写入数据的SQL语句。系统默认指定为CONTAINSSQL。(4)SQLSECURITY{DEFINER|INVOKER}:指明谁有权限来执行该存储过程。DEFINER表示只有存储过程的创建者才可以执行;INVOKER表示拥有权限的调用者才可以执行。系统默认指定为DEFINER。

(5)SCOMMENT'string':提供存储过程的注释或描述信息。9.2.1创建存储过程存储过程语句块表示SQL代码的内容,也是存储过程的主体,通常使用BEGIN和END来标识SQL代码的开始和结束。DELIMITER//CREATEPROCEDUREs_procedure()BEGIN

SELECT*FROMtb_student;END//DELIMITER;创建一个名为“s_procedure”的存储过程,其作用是查询“tb_student”数据表中的所有信息,SQL语句如下所示。【案例9.1】创建一个存储过程。9.2.1创建存储过程说明:(1)“DELIMITER//”,这条语句的作用是将MySQL的结束符设置为“//”,因为默认的SQL结束标记是“;”,而存储过程中可能会出现多条SQL语句,这些SQL语句又以“;”结尾。为了防止语句冲突,需要使用“DELIMITER”关键字来自定义结束符。存储过程创建完成之后,再通过“DELIMITER;”语句恢复默认结束符。也可使用其他符号,例如“DELIMITER$$”。(2)存储过程执行的语句块:可以是单条SQL语句,也可以是由BEGIN…END结构组成的复合语句块。在这个例子中,我们使用了BEGIN和END来标识存储过程执行的代码段。(3)创建存储过程之前必须指定该存储过程所在的数据库,可以通过“USE数据库名称”语句来指定。执行上述SQL语句,运行结果如右图所示,存储过程创建成功。9.2.2调用存储过程存储过程创建完成后,必须使用CALL语句才能调用,具体的语法格式如下。存储过程名:表示调用的存储过程的名称,如果要调用其他数据库中的存储过程,需要使用“CALL数据库名.存储过程名”的格式;参数:表示调用该存储过程使用的参数列表。该参数列表需要与当前调用的存储过程定义时的参数列表保持一致。如果没有参数时,则可以省略括号“()”。CALL存储过程名([参数[,...]])

9.2.2调用存储过程【案例9.2】调用存储过程。执行“CALLs_procedure”语句可以调用【案例9.1】中创建的存储过程“s_procedure”。运行结果如下图所示,该结果显示了“tb_student”数据表的所有信息,等同于执行“SELECT*FROMtb_student”语句。9.2.3查看存储过程1.使用SHOWSTATUS语句查看存储过程在MySQL中可以使用SHOWSTATUS语句查看存储过程的状态,具体的语法格式如下。SHOWPROCEDURESTATUS[LIKE'存储过程名']

该语句是一个MySQL的扩展,它可以返回存储过程的特征,如数据库名称、类型、创建者、创建日期和修改日期等;

PROCEDURE:表示查看的是存储过程;LIKE'存储过程名':表示需要匹配的存储过程名称。如果省略存储过程名称,则会返回所有存储过程的状态信息,否则只会返回与指定名称匹配的存储过程的状态信息。需要注意的是,SHOWSTATUS语句只能用于查询当前连接的存储过程信息,如果需要查询其他数据库中的存储过程信息,则需要先使用USE语句切换到相应的数据库。说明:9.2.3查看存储过程执行“SHOWPROCEDURESTATUSLIKE‘s_p%’\G”语句可以查看名称以“s_p”开头的存储过程的详细信息,在语句结尾后添加“\G”标记,可以让显示的信息更加有条理。运行结果如下图所示,通过运行结果可以了解到是否存在名为“s_procedure”存储过程,并列出该存储过程所在的数据库、所有者、修改时间等详细信息。【案例9.3】查看存储过程的状态。9.2.3查看存储过程2.使用SHOWCREATE语句查看存储过程或存储函数在MySQL中,除了可以使用SHOWSTATUS语句之外,还可以使用SHOWCREATE语句查看存储过程的状态,具体的语法格式如下。SHOWCREATEPROCEDURE存储过程名该语句同样是一个MySQL的扩展,它可以返回存储过程的定义、字符集等信息;存储过程名:表示存储过程的名称。9.2.3查看存储过程执行“SHOWCREATEPROCEDUREs_procedure\G”语句,查看“s_procedure”存储过程的定义信息,在语句结尾处添加“\G”标记,可以让显示的信息更加有条理。运行结果如下图所示,通过运行结果可以得到存储名称、存储的具体SQL语句、字符集等详细信息。这个结果对于理解存储过程是如何定义和实现的非常有帮助,也可以使用这个语句来将存储过程的定义作为备份或迁移的一部分。【案例9.4】查看存储过程的定义信息。9.2.3查看存储过程3.通过routines表查询存储过程或存储函数在MySQL中,存储过程和存储函数的信息都存储在information_schema数据库下的routines表中。可以通过查询该表中的记录来获取存储过程或存储函数的信息,具体的语法格式如下。SELECT*FROMinformation_schema.routinesWHEREROUTINE_NAME=存储过程名ANDROUTINE_TYPE='PROCEDURE';ROUTINE_NAME:表示所要查询的存储过程的名称;ROUTINE_TYPE:表示查询的是存储过程。如果存储过程和存储函数名称相同,则需要在WHERE子句中指定ROUTINE_TYPE的值。9.2.3查看存储过程通过查询系统information_schema数据库下的routines数据表来获取存储过程的详细信息。例如,查询类型为存储过程、名称为“s_procedure”的存储过程的信息,在SQL语句结尾后加上“\G”标记,让显示的信息更有条理。SQL语句如下所示。【案例9.5】通过routines表查询存储过程。SELECT*FROMinformation_schema.routinesWHEREROUTINE_NAME=‘s_procedure’ANDROUTINE_TYPE='PROCEDURE'\G

9.2.3查看存储过程执行上述SQL语句,运行结果如下图所示,其中包含了“s_procedure”存储过程的名称、类型、所属数据库、创建时间、修改时间等详细信息,这些信息可以对存储过程的设计和维护提供非常有用的帮助。游标的使用039.3游标的使用在MySQL中,查询语句常常返回多行数据。如果数据量很大,则不能逐行处理数据。因此,在存储过程或函数中,可以使用游标来逐个读取查询结果。通过控制游标的移动,用户可以按需要查看和操作这些数据,但不能跳过任何记录。注意:MySQL中游标只能在存储过程或存储函数中使用。DECLARE游标名称CURSORFOR查询条件语句1.声明游标在MySQL中,可以使用DECLARE语句来声明游标,具体的语法格式如下。游标名称:表示需要定义的游标名称;查询条件语句:表示SELECT语句,可以是简单查询,也可以是复杂查询,但不能包含INTO语句;游标的声明必须在变量和条件声明语句之后,在声明处理程序之前。9.3游标的使用参数1[,参数2]...:表示FETCH语句从结果集中获取一行数据,并将此数据存储到参数1、参数2等定义的变量中。FETCH游标名称INTO参数1[,参数2]...OPEN游标名称2.打开游标使用OPEN关键字打开先前声明的游标,具体的语法格式如下。这个语句会将游标与相应的查询结果集关联起来,以便对查询结果集中每条记录进行处理。如果游标未被先前声明,则OPEN语句会报错。3.使用游标使用游标的具体的语法格式如下。FETCH语句每执行一次,然后游标指针就会后移一行。通常需要与循环语句配合。如果所有的结果行都已被检索,再次执行该FETCH语句将产生ERROR1329(02000)错误。9.3游标的使用(1)创建存储过程“cursor_grade”,该存储过程中有三个参数:IN模式的参数c_name用于接收具体的课程名;以及两个OUT模式的参数s_id和g_score,分别用于获取查询结果中的学生学号和课程分数。(2)在变量声明语句之后,声明cur_score游标,再从tb_grade数据表中根据course_id字段查询出student_id和grade_score字段的值。(3)在WHILE循环语句中,使用FETCH关键字逐行获取SELECT语句中的数据。(4)当WHILE循环结束时,必须显式地关闭游标。CLOSE游标名称4.关闭游标使用CLOSE关键字关闭先前声明的游标,具体的语法格式如下。如果游标未打开,则使用该语句会报错。需要注意的时,如果游标未被明确地关闭,则该游标在它声明的复合语句的末尾自动关闭。【案例9.6】创建存储过程。根据给定的课程名称,利用游标查询遍历查询该门课程的学生学号和成绩的结果集。9.3游标的使用CREATEPROCEDURE‘cursor_grade’(INc_name

VARCHAR(50),OUTs_id

BIGINT,OUTg_score

TINYINT)BEGIN

DECLAREflagBOOLEANDEFAULT(TRUE);

DECLAREcur_score

CURSORFORSELECTstudent_id,grade_score

FROMtb_gradeWHEREcourse_id

=(SELECTcourse_id

FROMtb_course

WHEREcourse_name

=c_name);

DECLAREEXITHANDLERFORNOTFOUNDSETflag=FALSE; #定义一个错误异常,当有SQLEXCEPTION异常,SQLWARNING警告,NOTFOUND这3种错误时,退出执行,并将局部变量flag的值修改为FALSE。

OPENcur_score;

WHILEflagDO#当flag的值为TRUE时,执行WHILE循环;否则退出循环

FETCHcur_score

INTOs_id,g_score;

SELECTs_id,g_score;

ENDWHILE;END具体的SQL语句如下所示。9.3游标的使用执行上述SQL语句,运行结果如下图所示,在存储过程中声明游标成功。9.3游标的使用执行“CALLcursor_grade(‘面向对象程序设计’,@student_id,@grade_score)”语句,运行结果如下图所示,调用存储过程“cursor_grade”,该存储过程使用游标从tb_grade表中查询和遍历该课程中所有学生的成绩和学号,并将每个学生的学号和成绩分别逐行输出。存储过程的修改049.4存储过程的修改ALTERPROCEDURE存储过程名[特性...]在MySQL中,可以通过ALTER关键字修改已经创建的存储过程的特性。但是无法修改存储过程中的参数和过程体定义语句,具体的语法格式如下。特性:表示存储过程的特性。详情见【9.2.1创建存储过程】中对特性的说明。9.4存储过程的修改ALTERPROCEDUREs_procedureREADSSQLDATASQLSECURITYINVOKER;修改【案例9.1】创建的存储过程“s_procedure”,将其读写权限修改为READSSQLDATA并指明调用者可以执行,SQL语句如下所示。执行上述SQL语句,运行结果如下图所示,修改存储过程“s_procedure”成功。【案例9.7】修改存储过程。9.4存储过程的修改修改前执行“SELECT*FROMinformation_schema.routines

WHEREROUTINE_NAME=‘s_procedure’ANDROUTINE_TYPE=‘PROCEDURE’\G”SQL语句查看名为“s_procedure”的存储过程的详细信息,运行结果如下图所示,运行结果表明存储过程的SQLDATEACCESS属性为“CONTAINSSQL”,这表示该存储过程具有执行SQL语句的权限。SECURITYTYPE属性为“DEFINER”,这表示只有存储过程的创建者才能够调用和执行存储过程,并获得执行权限。9.4存储过程的修改修改后再次执行“SELECT*FROMinformation_schema.routines

WHEREROUTINE_NAME=‘s_procedure’ANDROUTINE_TYPE=‘PROCEDURE’\G”SQL语句查看名为“s_procedure”的存储过程的详细信息,运行结果如下图所示,通过运行结果可以看到已经看到【案例9.7】的需求修改成功。删除存储过程059.5删除存储过程执行“DROPPROCEDUREs_procedure”SQL语句,可以删除名为“s_procedure”的存储过程,如下图所示,存储过程“s_procedure”已经删除成功。DROPPROCEDURE[IFEXISTS]存储过程名称在MySQL中,可以通过DROP关键字删除存储过程,具体的语法格式如下。IFEXISTS:该子句是一个可选项。它可以判断存储过程是否存在,若存在则执行删除操作;若不存在,则不进行任何操作,同时产生一条可以使用“SHOWWARNINGS”查看的警告。【案例9.8】删除存储过程s_procedure。变量类型介绍069.6变量类型介绍在MySQL中,我们可以定义并使用四种不同类型的变量。其中,局部变量是在SQL语句块的BEGIN...END中定义,并且作用域仅限于该语句块。用户变量是以@符号开头定义的,作用范围为当前会话(连接)中的所有SQL语句。会话变量和全局变量由MYSQLD服务器维护,其作用范围分别为当前会话和整个服务器。说明:全局变量的修改将影响服务器的整体操作,而会话变量的修改只会影响当前连接的具体操作。因此,在使用全局变量和会话变量时需要特别谨慎。9.6.1局部变量DECLARE变量名称1[,变量名称2]...数据类型[DEFAULT默认值];1.定义变量在MySQL中,局部变量一般用在SQL语句块的BEGIN...END中,其作用域仅限于该语句块,在该语句块执行完毕后,局部变量就会消失。局部变量是通过使用DECLARE语句进行定义,具体的语法格式如下。变量名称:表示局部变量的名称;DEFAULT:为局部变量提供默认值,如果没有DEFAULT语句,则局部变量的初始值为NULL。在使用局部变量时应该确保变量名称的唯一性,否则可能会出现命名冲突的问题。【案例9.9】定义局部变量使用DECLARE语句定义名为var的局部变量,类型为INT类型,默认值为66,SQL语句如下所示。DECLAREvarINTDEFAULT66;9.6.1局部变量SET变量名称1=参数1[,变量名称2=参数2]...;2.为变量赋值定义局部变量之后,可以通过使用SET语句为局部变量赋值,从而改变它们的默认值,具体的语法格式如下。BEGIN...END语句块中的SET语句赋值的变量可以是系统变量或用户变量。【案例9.10】使用SET语句为局部变量var赋值。使用DECLARE关键字定义了一个名为var的整型局部变量,并将其默认值设置为66。接着,使用SET关键字将变量var的值修改为1。最后,使用SELECT语句查询该代码块内局部变量var的值,SQL语句如下所示。DECLAREvarINTDEFAULT66;SETvar=1;SELECTvar;9.6.1局部变量除了使用SET语句赋值外,还可以通过SELECT...INTO...语句将选定的字段名称分别赋值给对应位置的局部变量名称。具体的语法格式如下。查询条件表达式[WHERE...]:表示需要进行查询的SQL语句,同时包括了WHERE关键字以及表名称。【案例9.11】使用SELECT...INTO...语句为局部变量赋值。使用DECLARE关键字声明局部变量cla_name和dep_id,通过SELECT...INTO...语句从“tb_class”数据表中查询class_id是“B0001”的记录,并将查询结果中的class_name和department_id字段的值分别赋值给局部变量cla_name和dep_id,最后,SQL语句如下所示。DECLAREcla_name

VARCHAR(50);DECLAREdep_id

VARCHAR(20);SELECTclass_name,department_id

INTOcla_name,dep_id

FROMtb_class

WHEREclass_id

='B0001';SELECT字段名称[,...]INTO变量名称[,...]查询条件表达式

[WHERE...];

9.6.2用户变量1.使用SET语句为变量赋值用户变量是基于会话变量实现的,可以起到暂存值、传递值的作用。同时,一个客户端定义的变量不能被其他客户端看到或使用。当数据库实例连接或断开的时候,变量就会消失。MySQL中用户变量不用事前声明,但变量名必须以“@”开头,其形式为“@变量名”。设置用户变量有两种方式:在MySQL中,可以使用SET语句来分配和赋值变量的值。SET语句支持使用“=”或“:=”作为分配符。分配给每个变量的参数可以为整数、实数、字符串或者NULL值,具体的语法格式如下。SET@变量名称1=参数1[,@变量名称2=参数2]...或SET@变量名称1:=参数1[,@变量名称2:=参数2]...在MySQL中,声明一个用户变量并为其赋值时,是不严格限制数据类型的。变量的数据类型由用户赋给它的值的类型决定,因此变量在运行时可以持有各种类型(例如数字、字符串、日期和NULL值等)。相比之下,在SQLServer中,使用DECLARE语句声明变量时必须严格指定其数据类型。9.6.2用户变量【案例9.12】声明三个用户变量,并进行简单运算。SET@var1=0,@var2=0,@var3=0;使用SELECT语句查询“@varl:=(@var2:=1)+@var3:=4”以及其他三个用户变量的值,SQL语句如下所示。SELECT@var1:=(@var2:=1)+@var3:=4,@var1,@var2,@var3;执行上述SQL语句,运行结果如右图所示,从运行结果可得出计算的结果。使用SET语句声明三个用户变量var1、var2和var3,并将它们的值赋值为0,SQL语句如下所示。注意:当为用户变量分配值时,应使用":="作为赋值操作符。如果使用"="赋值,则在非SET语句中,"="可被视为比较操作符。9.6.2用户变量2.使用SELECT语句为变量赋值SELECT@变量名称1:=参数1[,@变量名称2:=参数2]...;或SELECT@变量名称1:=字段名称FROM表名[WHERE...];【案例9.13】使用SELECT语句为变量赋值。执行“SELECT@var;”语句,定义一个变量@var并初始化值为NULL;再次执行“SELECT@var:=1;”语句,变量@var的值为1,运行结果如右图所示,SELECT语句为@var赋值成功。SELECT语句一般用来输出用户变量,比如SELCECT@变量名称,用于输出数据源不是表格的数据。而在使用SELECT语句为变量赋值时,必须用“:=”方式。具体的语法格式如下。9.6.3会话变量MySQL服务器为每个连接的客户端维护一系列会话变量。在客户端连接数据库实例时,使用相应全局变量的当前值对客户端的会话变量进行初始化。设置会话变量不需要特殊权限,但客户端只能更改自己的会话变量,而不能更改其他客户端的会话变量。会话变量的作用域仅限于当前连接。在该连接断开后,其设置的所有会话变量均失效,而无法再次访问。SETSESSION变量名称;SET@@SESSION.变量名称;SHOWSESSIONVARIABLESlike'变量名称';SHOWSESSIONVARIABLES;前三种方式中的变量名称对应的是会话变量;SHOWSESSIONVARIABLES语句查看的是所有的会话变量。查看会话变量的方式有四种,具体的语法格式如下。9.6.3会话变量有三种方式可以设置会话变量的值,具体的语法格式如下。对于“SET变量名称=参数;”尽管没有指定SESSION关键字,但在MySQL中默认使用SESSION。查看或设置会话变量的值时,也可以使用LOCAL关键字来替代。因为在MySQL中LOCAL是SESSION的同义词,均用于控制变量的作用域。SETSESSION变量名称=参数;SET@@SESSION.变量名称=参数;SET变量名称=参数;说明:9.6.4全局变量全局变量影响服务器整体操作。在服务器启动时,它会将所有全局变量初始化为默认值。这些默认值可以在选项文件或在命令行指定的选项中进行更改。要想更改全局变量,必须具有SUPER权限。全局变量作用于SERVER的整个生命周期,但是当服务器重启后,所有变量的设置都将恢复为默认值。要想让全局变量重启后继续生效,需要更改相应的配置文件my.ini。9.6.4全局变量查看全局变量的方式有三种,具体的语法格式如下。SETGLOBAL变量名称=参数;SET@@GLOBAL.变量名称=参数;SHOWGLOBALVARIABLES语句查看的是所有的全局变量;

变量名称:对应的是全局变量名称。SHOWGLOBALVARIABLES;SET@@GLOBAL.变量名称;SHOWGLOBALVARIABLESlike'变量名称';

有两种方式可以设置全局变量的值,具体的语法格式如下。注意:此处的GLOBAL不能省略。如果设置变量时不指定GLOBAL、SESSION或者LOCAL,MySQL默认使用SESSION。流程控制079.7流程控制流程控制语句用来根据不同的条件控制语句的执行。在MySQL中用来构造控制流程的语句有IF语句、CASE语句、LOOP语句、WHERE语句、LEAVE语句、ITERATE语句以及REPEAT语句。其中,IF语句和CASE语句用于条件判断,LOOP语句用于循环控制,LEAVE语句用于中断LOOP语句,ITERATE语句用于中断当前循环并开始下一轮循环,REPEAT语句用于重复执行一段语句。每个流程中可能包含一个单独的语句,或者是使用BRGIN...END构造的复合语句。使用BEGIN...END构造复合语句时,可以进行嵌套。如果需要执行循环操作,可以使用WHILE语句和REPEAT语句来实现类似的功能。需要注意的是,MySQL语句中不支持标准的FOR循环。注意:以下示例代码全部在存储过程中使用。9.7.1分支结构1.IF语句IF条件表达式1THENSQL语句1[ELSEIF条件表达式2THENSQL语句2]...[ELSESQL语句3]ENDIF条件表达式:如果条件表达式的值为TRUE,则THEN后面相应的SQL语句会被执行。如果条件表达式的值为FALSE,则执行ELSE语句里的SQL语句。注意:MySQL中的IF()函数不同于这里的IF语句。IF()函数通常用于查询中的条件表达式。IF语句用于在存储过程或函数中构建条件判断语句。它们的语法、使用方法和使用场景都不同。IF语句是流程控制语句中最常用的条件判断语句之一。根据是否满足一个或多个条件,IF语句执行不同的代码块,以完成相应的任务,具体的语法格式如下。9.7.1分支结构【案例9.14】IF语句的使用。IFval

>0

THENSELECT'val的值大于0';

ELSESELECT'val的值小于或等于0';ENDIF;使用IF语句,判断val值是否大于0,如果val的值大于0,则输出字符串“val的值大于0”;否则输出字符串“val的值小于或等于0”,SQL语句如下所示。9.7.1分支结构2.CASE语句CASE条件表达式WHEN参数表达式1THENSQL语句1[WHEN参数表达式2THENSQL语句2]...[ELSESQL语句3]ENDCASE条件表达式:决定了接下来哪一个WHEN语句会被执行;参数表达式:如果某个参数表达式的取值与条件表达式的值相同,则执行对应的THEN关键字后的SQL语句;SQL语句:表示对应参数表达式后面的执行内容;ENDCASE:CASE语句都要使用ENDCASE结束。除IF语句之外,CASE语句也是用来进行条件判断的,它提供了多个条件进行选择,可以实现比IF语句更复杂的条件判断。CASE语句有两种语法格式。第一种语法格式如下:9.7.1分支结构使用CASE语句,当val值为“男”时,输出字符串“输入的性别是男性”;当val值为“女”时,输出字符串“输入的性别是女性”;否则输出字符串“输入有误”,SQL语句如下所示。CASEval

WHEN'男'THEN'输入的性别是男性';

WHEN'女'THEN'输入的性别是女性';

ELSESELECT'输入有误';ENDCASE;【案例9.15】

CASE语句的使用方法一。9.7.1分支结构CASEWHEN参数表达式1THENSQL语句1[WHEN参数表达式2THENSQL语句2]...[ELSESQL语句3]ENDCASE与第一种格式不同的是,CASE语句将逐个评估每个WHEN子句,直到找到第一个匹配条件的子句为止。如果找到匹配条件的子句,则会执行THEN子句中的SQL语句。如果没有找到匹配条件的子句,则会执行ELSE子句中的SQL语句。第二种语法格式如下:注意:在存储过程中,当使用CASE语句时,必须使用ENDCASE来终止语句。此外,不能在CASE语句内部使用ELSENULL语句,因为它会使结果集中的全部值都变成NULL值,导致存储过程的性质不再满足。9.7.1分支结构使用CASE语句,当val值为0时,输出字符串“val的值为0”;当val值大于0时,输出字符串“val的值大于0”;当val值小于0时,输出字符串“val的值小于0”;否则输出字符串“输入有误”,SQL语句如下所示。CASE

WHENEval

=0THENSELECT'val的值为0';

WHENEval

>0THENSELECT'val的值大于0';

WHENEval

<0THENSELECT'val的值小于0';

ELSESELECT'输入有误';ENDCASE;【案例9.16】

CASE语句的使用方法二。IF和CASE语句的差异:(1)IF仅对单条件进行判断,返回值为“是”或“否”两种情况。(2)CASE可以根据多个条件进行判断,并且返回一个或多个不同的值。9.7.2循环结构1.LOOP语句[标注名称:]LOOPSQL语句ENDLOOP[标注名称]标注名称:标记LOOP循环的开始和结束,同时这两个参数必须相同,但是可以省略;SQL语句:循环需要执行的内容。LOOP语句可以使某些特定的语句重复执行,实现简单的循环功能。与IF和CASE语句不同,LOOP不进行条件判断。另外,LOOP语句本身没有停止循环的语句,必须使用LEAVE语句等来停止循环并跳出循环过程。具体的语法格式如下。9.7.2循环结构【案例9.17】LOOP语句的使用。DECLAREvarINTDEFAULT1;num:#标注循环开始LOOPSELECTvar;IFvar>=10THENLEAVEnum;ENDIF;SETvar=var+1;ENDLOOPnum;#标注循环结束num是该示例中LOOP语句的标注名称,可省略。LOOP循环都以ENDLOOP结束。使用LOOP语句进行循环执行var值加1的操作,当val值小于10时,循环重复执行;当var值大于等于10时,使用LEAVE语句退出循环,SQL语句如下所示。说明:9.7.2循环结构2.WHILE语句[标注名称:]WHILE条件表达式DOSQL语句ENDWHILE[标注名称]标注名称:标记WHILE循环的开始和结束,同时这两个参数必须相同,但是可以省略;条件表达式:只有满足条件表达式时循环才可执行;SQL语句:循环的执行内容;ENDWHILE:WHILE循环需要使用ENDWHILE来结束。WHILE语句与LOOP语句一样,可以实现简单的循环功能,但它需要一个带条件的循环过程。每次语句执行前,会对条件表达式进行判断,如果表达式返回值为TRUE,则执行循环中的语句,否则,退出循环。具体的语法格式如下。9.7.2循环结构【案例9.18】WHILE语句的使用。#声明局部变量DECLAREsumINT;DECLAREnumINT;SETsum=0;SETnum=1;WHILEnum<=10DO#判断num的值是否满足循环开始条件SETsum=sum+num;SETnum=num+1;ENDWHILE;#结束循环SELECTsum;#查询当前代码块内sun的值使用WHILE语句,当num的值小于等于10时,会重复执行1-10的累加计算,当num的值大于10时,终止循环并跳出循环语句,SQL语句如下所示。9.7.2循环结构3.REPEAT语句[标注名称:]REPEATSQL语句UNTIL条件表达式ENDREPEAT[标注名称]标注名称:标记REPEAT循环的开始和结束,同时这两个参数必须相同,但是可以省略;SQL语句:循环的执行内容;UNTIL:执行完循环内容后,会判断UNTIL关键字后的条件表达式的值。如果条件表达式的值为TRUE,则再次执行循环;如果条件表达式的值为FALSE,则跳出循环;ENDREPEAT:REPEAT循环都要使用ENDREPEAT结束。REPEAT语句也是带有条件控制的循环语句。与WHILE语句不同的是,REPEAT语句是创建一个带条件判断的循环过程,当每次语句执行完毕后,会对条件表达式进行判断,如果表达式返回值为TRUE,则循环结束,否则重复执行循环中的语句。具体的语法格式如下。9.7.2循环结构【案例9.19】REPEAT语句的使用。DECLAREsumINT;DECLAREnumINT;SETsum=0;SETnum=1;REPEATSETsum=sum+num;SETnum=num+1;UNTILnum>10ENDREPEAT;#判断num的值是否满足循环继续条件SELECTsum;使用REPEAT语句,当num的值小于等于10时,将重复执行1-10的累加计算,SQL语句如下所示。9.7.2循环结构LOOP和WHILE/REPEAT的差异:(1)LOOP是一种非条件控制的循环结构,因此需要使用跳转语句结束循环。(2)WHILE/REPEAT是条件控制的循环结构,无须使用跳转语句结束循环。WHILE和REPEAT的差异:(1)WHILE

语句是当满足条件的情况下执行循环内的语句,否则退出循环。(2)REPEAT语句则需要执行完循环中的语句后才对条件表达式进行判断。如果表达式返回值为TRUE,则循环结束,否则,继续执行循环中的语句。9.7.3跳转语句1.LEAVE语句LEAVE标注名称标注名称是循环的标志,LEAVE语句可以用在循环语句内,或者以BEGIN和END包裹起来的程序体内。LEAVE语句主要用于跳出所有被标注的流程控制构造。具体的语法格式如下。9.7.3跳转语句【案例9.20】LEAVE语句的使用。DECLAREvarINTDEFAULT1;num:LOOPSELECTvar;IFvar>=10THENLEAVEnum;#满足条件时退出循环ENDIF;SETvar=var+1;ENDLOOPnum;使用LEAVE语句,循环执行var值加1的操作,当val值小于10时,循环重复执行;当var值大于等于10时,使用LEAVE语句跳出循环,SQL语句如下所示。9.7.3跳转语句2.ITERATE语句ITERATE标注名称ITERATE是“重新开始循环”的意思,它只能用在LOOP、REPEAT和WHILE语句内,用于跳过循环中余下的语句并将执行顺序转到语句段开头处,重新开始下一次循环。具体的语法格式如下。9.7.3跳转语句【案例9.21】ITERATE语句的使用。CREATEPROCEDUREmyProc()BEGINDECLAREcountINT;SETcount=0;increment:LOOPSETcount=count+1;#对count的值进行累加IFcount<10THENITERATEincrement;#跳转到下一次循环ENDIF;IFcount>15THENLEAVEincrement;#跳出循环ENDIF;SELECTcount;ENDLOOPincrement;END使用ITERATE语句,初始化count=0,如果count的值小于10时,重复执行count加1的操作;当count大于10且小于15时,打印出当前count的值;当count大于15时,退出循环,SQL语句如右所示。9.7.3跳转语句LEAVE和ITERATE的差异:(1)LEAVE用于终止循环并跳出循环语句块。(2)ITERATE用于跳过循环中余下的语句并开始下一次循环。因此,当不满足某些条件需要跳出循环时,一般需要在ITERATE语句后使用LEAVE语句来结束循环。课业任务089.8课业任务课业任务9-1使用WHILE语句求1-100累加和课业任务9-2使用LOOP语句、ITERATE语句和LEAVE语句求1-100累加和课业任务9-3创建存储过程以求某位同学的成绩课业任务9-4使用Workbench工具求1-100累加和课业任务9-5使用Navicat工具求某系的人数王小明想使用MySQL和Java开发一个数据库学习系统。在前面的章节中,他已

温馨提示

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

最新文档

评论

0/150

提交评论