MySQL存储过程和函数使用总结
作者:BuleSky 发布时间:[ 2016/11/17 11:20:09 ] 推荐标签:MySQL 数据库
在上面的示例中嵌套了BEGIN…END内部的BEGIN…END末尾要使用定义的DELIMITER($$),这点需要注意,如果使用后面的;结尾则会视为结束,造成创建失败。
光标的使用
在存储过程和函数中,可以使用光标对结果集进行循环的处理,光标的使用包括光标的声明,OPEN、FETCH和CLOSE,其语法分别如下:
<1>声明光标
DECLARE cursor_name CURSOR FORselect_statement
<2>打开光标
OPEN cursor_name
<3>使用光标
FETCH cursor_name INTO var_name[,var_name]…
<4> 关闭光标
CLOSE cursor_name
示例5:对emp表按照行进行循环的处理,按照deptno的不同累加salary的值,判断循环结束的条件是NOT FOUND的状态,当FETCH光标找不到下一条记录的时候,会关闭光标然后退出程序。
DELIMITER $$
CREATE PROCEDURE dept_salary_sum()
BEGIN
DECLAREi_dept_no int;
DECLAREi_salary int(5);
DECLAREcur_emp CURSOR FOR SELECT deptno,salary FROM emp;
DECLAREEXIT HANDLER FOR NOT FOUND CLOSE cur_emp;
SET@salary_sum_dept1=0;
SET@salary_sum_dept2=0;
OPENcur_emp;
REPEAT
FETCHcur_emp INTO i_dept_no,i_salary;
IFi_dept_no=1 THEN
SET@salary_sum_dept1=@salary_sum_dept1+i_salary;
ELSE
SET@salary_sum_dept2=@salary_sum_dept2+i_salary;
ENDIF;
UNTIL0 END REPEAT;
CLOSEcur_emp;
END $$
DELIMITER ;
CALL dept_salary_sum();
SELECT @salary_sum_dept1,@salary_sum_dept2;
->50000 27000
注意:变量,状态,处理程序,光标都是通过DECLARE定义的,他们之间是有先后顺序要求的。变量和状态必须在前面声明,然后才能是光标的声明,后才可以是处理程序的声明。
流程控制
可以使用IF、CASE、LOOP、LEAVE、ITERATE、REPEAT及WHILE语句进行流程的控制。详细说明及示例参考对应版本的官网。5.6版本:
http://dev.mysql.com/doc/refman/5.6/en/flow-control-statements.html
IF语句
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
CASE语句
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE
或者
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
上面光标的例子中,IF语句也可以使用CASE语句来完成:
CASE
WHEN i_dept_no =1 THEN
SET@salary_sum_dept1=@salary_sum_dept1+i_salary;
ELSE
SET@salary_sum_dept2=@salary_sum_dept2+i_salary;
END CASE;
或者:
CASE i_dept_no
WHEN 1 THEN
SET@salary_sum_dept1=@salary_sum_dept1+i_salary;
ELSE
SET @salary_sum_dept2=@salary_sum_dept2+i_salary;
END CASE;
LOOP语句
[begin_label:] LOOP
statement_list
END LOOP [end_label]
LOOP实现简单的循环,退出循环的条件需要使用其它的语句定义,通常可以使用LEAVE语句实现。如果不在statement_list中增加退出循环的语句,那么LOOP语句可以用来实现简单的死循环。
示例6:简单LOOP循环
CREATE PROCEDURE doiterate(p1 INT)
BEGIN
label1: LOOP
SETp1 = p1 + 1;
IFp1 < 10 THEN
ITERATE label1;
ENDIF;
LEAVE label1;
ENDLOOP label1;
SET@x = p1;
END;
LEAVE语句
LEAVE label
用来从标注的流程构造中退出,通常和BEGIN…END或者循环一起使用。如上面的例子。
ITERATE语句
ITERATE label
ITERATE语句必须用在循环中,作用是跳过当前循环的剩下的语句,直接进入下一轮循环。如上面的例子。
REPEAT语句
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
有条件的循环控制语句,当满足条件的时候退出循环。在示例5中使用REPEAT语句来实现光标的循环获得。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
在测试数据库性能时,需要注意哪些方面的内容?测试管理工具TC数据库报错的原因有哪些?怎么解决?数据库的三大范式以及五大约束编程常用的几种时间戳转换(java .net 数据库)优化mysql数据库的几个步骤数据库并行读取和写入之Python实现深入理解数据库(DB2)缓冲池(BufferPool)国内三大云数据库测试对比预警即预防:6大常见数据库安全漏洞数据库规划、设计与管理数据库-事务的概念SQL Server修改数据库物理文件存在位置使用PHP与SQL搭建可搜索的加密数据库用Python写一个NoSQL数据库详述 SQL 中的数据库操作详述 SQL 中的数据库操作Java面试准备:数据库MySQL性能优化
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南