实验作业(存储过程)
- 变量的使用
- MySQL中变量分为:全局变量、会话变量、用户变量、局部变量。
什么是变量:变量是程序中存放数据的容器,实为一块有名字的内存空间,变量空间的名字就是变量名,变量空间中存放的数据就是变量值。
在编写存储过程时,有时会需要使用变量保存数据处理过程中的值。在mysql中,变量可以在子程序中声明并使用,这些变量的作用是在begin…end程序中。
想要在存储过程中使用变量,首先需要定义变量。在储存过程中使用declare语句定义变量,具体语法如下:
Declare 变量名 数据类型 default value(value意思为赋予的值值);
如果没有default字句,变量的初始值为null。
举例说明:declare myvar int
- 定义条件
在实际开发中,经常需要对特定的条件进行处理这些条件可以联系到错误以及子程序中的一般流程控制。定义条件是事先定义程序执行过程中遇到的问题,处理程序定义在遇到这些问题时应当采取的处理方式,并且保证存储过程在遇到警告或错误时能继续执行。
定义条件语法格式:
Declare 条件名 condition for
举例说明
定义“ERROR1148(42000)”错误,名称为command_not_allowed。可以用两种不同的方法来定义,具体代码如下:
方法一:使用sqlstate_value
Declare command_not_allowed condition for
方法二:使用mysql_error_code
Declare command_not_allowed condition for
- 定义处理程序
定义完条件后,还需要定义针对此条件的处理程序。Mysql中用declare语句定义处理程序,具体语法格式如下:
Declare handler_type handler for
Handler_type:continue|exit,continue表示遇到错误不处理,继续执行,exit表示遇到错误马上退出。
condition_value:表示错误类型,可以有以下取值:
- sqlstate[value]: sqlstate_value包含5个字符的字符串错误值。
- condition_name表示delcare condition 定义的错误条件名称
- sqlwarning匹配所有以01开头的sqlstate错误代码。
- not found 匹配所有以02开头的sqlstate错误代码。
- sqlexception匹配所有没有被sqlwarning或not found捕获sqlstate错误代码。
- mysql_error_code匹配数值类型错误代码。
定义处理程序的两种方式;
- 捕获sqlstate_values
Declare continue condition for
解析:如果遇到sqlstate_value值为“42s02”,则执行continue操作,并且输出“’no_such_table”信息。
- 捕获mysql_error_code
Declare continue condition for
解析:如果遇到mysql_error_code值为“1146”,则执行continue操作,并且输出“no_such_table”信息。
- 练习题:创建数据库和数据表
首先创建一个名为test_proc的数据库。
使用test_proc数据库,并按以下要求创建数据表test_t。
字段id:设置数据类型int(11)、主键约束;
- 练习题:输入如下代码(建议使用记事本文件(*.txt)输入代码,之后复制到mysql服务器执行,这样在代码出现错误的时候就可以方便更改)。
输入以上代码后,调用储存过程“call demo”,并分别输入select @x2和select@x查看变量值。将调用储存过程和查看变量值的结果截图提交:
- 光标的使用
在编写存储过程时,查询语句可能会返回多条记录,如果数据量非常大,则需要使用光标来逐条读取查询结果集中的记录。光标是一种用于轻松处理多行数据的机制。
- 光标的声明(亦称“游标”)
想要使用光标处理结果集中的数据,需要先声明光标。光标必须声明在声明变量、条件之后,声明处理程序之前。Mysql中使用declare关键字来声明光标。声明光标的具体语法格式如下:
Declare cursor_name cursor for select_statement;
在上述语法格式中,cursor_name表示光标的名称;select_statement表示select语句的内容,返回一个用于创建光标的结果集。
接来下声明一个名为cursor_student的光标,示例代码如下:
Declare cursor_student cursor for select s_name,s_gender from student;
其中s_name、s_gender是变量,需要在使用前定义。
- 光标的使用
声明完光标后就可以使用光标了,使用光标之前首先要打开光标。Mysql中打开光标、使用光标、关闭光标的语法格式如下:
(2.1)打开光标:Open cursor_name;
(2.2)使用光标:Fetch cuosor_name into var_name…;
在上述语法格式中,cursor_name表示参数的名称,var_name表示将光标中的select语句查询出来的信息存入该参数中,需要注意的是,var_name必须在声明光标之前定义好。
举例说明:使用名称为cursor_student的光标。将查询出来的信息存入s_name和s_gender中,示例代码如下:
Fetch cursor_student into s_name,s_gender;
(2.3)光标的关闭
关闭光标:cloes cursor_name;
值得一提的是,如果没有明确地关闭光标,它会在其声明的复合语句的末尾被关闭。
- 流程控制的使用
通过前面的学习,已经了解了创建存储过程时所用到的基本知识,在编写存储过程时还有一个非常重要的部分—流程控制。流程控制语句用于将多个sql语句划分或组合成符合业务逻辑的代码块。Mysql中的流程控制语句包括:if语句、case语句、loop语句、while语句、leave语句、iterate语句和repeat语句。
每个流程中可能包含一个单独语句,也可能是使用begin…end构造的复合语句,可以嵌套。
- 综合案例—存储过程应用
创建一个stu表
- 字段id:设置数据类型int(11);
- 字段name:设置数据类型varchar(50);
- 字段class:设置数据类型varchar(50);
练习题:向stu数据表添加如下数据:
- 创建一个存储过程
创建一个存储过程“addcount”,能够获取表stu中的记录数、id值小于10的id值总和。代码如下:
这个存储过程创建了一个cur_id的光标,使用这个光标来获取每条记录的id,使用repeat循环语句来实现所有id号相加。
请将以上代码输入并截图提交(截图mysql服务器窗口代码):
建议使用记事本文件(*.txt)输入以上代码,之后复制到mysql服务器执行。
调用存储过程语句
Call addcount(@conut);
查看返回结果语句
Select @count,@sum;
请将“调用存储过程”和“查看返回结果”截图提交:
- 存储过程其他知识点
- 查看所有的存储过程语句
Show procedure status\G
- 查看存储过程的状态(如果查看的是当前数据库下的存储过程,无需”数据库名.”作为前缀)
Show create procedure 数据库名.存储过程名;
举例说明
- 删除存储过程语句(如果删除当前数据库下的存储过程,无需”数据库名.”作为前缀)
Drop procedure 数据库名.存储过程名;
举例说明