MySQL存储过程和函数使用总结
作者:BuleSky 发布时间:[ 2016/11/17 11:20:09 ] 推荐标签:MySQL 数据库
删除存储过程或者函数
一次只能删除一个存储过程或者函数,删除存储过程或者函数需要有该过程或者函数的ALTER ROUTINE权限。语法如下:
DROP{PROCEDURE|FUNCTION} [IF EXISTS] sp_name
查看存储过程或者函数 查看存储过程或者函数的状态
SHOW {PROCEDURE|FUNCTION} STATUS [LIKE ‘pattern’]
查看存储过程或者函数的定义
SHOW CREATE {PROCEDURE|FUNCTION} sp_name
通过查看information_schema.Routines了解存储过程和函数的信息
除了以上两种方法,还可以查看系统表来了解存储过程和函数的相关信息,通过查看information_schema.Routines可以获得存储过程和函数的名称、类型、语法、创建人等信息。
变量的使用
存储过程和函数中可以使用变量。
变量的定义
通过DECLARE可以定义一个局部变量,该变量的作用范围只能在BEGIN…END块中,可以用在嵌套的块中。变量的定义必须写在复合语句的开头,并且在任何其他语句的前面。可以一次声明多个相同类型的变量。如果需要,可以使用DEFAULT赋默认值。
定义一个变量的语法如下:
DECLAREvar_name[,…] type [DEFAULT value]
例如,定义一个DATE类型的变量,名称是last_month_start:
DECLARElast_month_start DATE;
变量的赋值
变量可以直接赋值,或者通过查询赋值。直接赋值使用SET,可以赋常量或者赋表达式,具体语法如下:
SET var_name =expr[,var_name=expr]…
给刚才定义的变量last_month_start赋值,具体语法如下:
SETlast_month_start = DATE_SUB(CURRENT_DATE(),INTERVAL 1 MONTH);
也可以通过查询结果将结果赋给变量,这要求查询返回的结果必须只有一行,具体语法如下:
SELECTcol_name[,…] INTO var_name[,…] table_expr
示例3:通过查询将结果赋值给变量max_salary。
DELIMITER $$
CREATE FUNCTIONget_max_salary(param_deptno INT)
RETURNS INT(7)
DETERMINISTIC
READS SQL DATA
BEGIN
DECLAREv_max_salary INT(7);
SELECT IFNULL(MAX(SALARY),0)INTO v_max_salary
FROM EMP
WHEREDEPTNO=param_deptno;
RETURNv_max_salary;
END$$
DELIMITER ;
存储过程和函数中的异常及处理
在看到的资料书中都将本小节命名为“条件的定义和处理”。虽然在帮助文档或是语法中使用CONDITION,可以翻译为“条件”,但是,感觉“状态”更为贴切一些。“条件”很容易和“条件语句”之类的混淆。
状态的定义
本小节将直接翻译帮助文档,翻译不正确或不地道的地方还请见谅。
http://dev.mysql.com/doc/refman/5.6/en/declare-condition.html
DECLARE condition_name CONDITION FOR condition_value
condition_value:
mysql_error_code
|SQLSTATE [VALUE] sqlstate_value
DECLARE ...CONDITION语句为指定的状态定义一个名称,该名称所代表的状态可以在DECLARE ... HANDLER中进行处理。
状态的声明必须在游标(cursor)或是处理程序(handler)之前。
condition_value表示与状态名称(condition_name)关联的特定条件或条件类型。它可以是以下几种类型:
<1>mysql_error_code: 表示MySQL状态码的整数。
不要使用状态码0,0代表正常状态而不是异常状态,MySQL状态码列表参考:
SectionB.3, “ServerError Codes and Messages”
<2>SQLSTATE [VALUE] sqlstate_value:五个字符的字符串,表示SQL状态。
不要使用以“00”开头的状态值,以“00”开头的状态值代表正常状态而不是异常状态。参考同上。
声明状态时,若使用伪装错误信息(SIGNAL或RESIGNAL)时必须使用状态值而不能使用状态码(此规定的原因是伪装信息的定义中不支持为其指定状态码)。
为状态声明一个名称可以使代码更加清晰(如果不看列表,很难知道状态码1146是什么意思,在上面的连接中能够看到解释,1146 ;ER_NO_SUCH_TABLE ;table ‘%s.%s’ does’t exist,表不存在),假如,处理程序试图删除一张不存在的表,只有当你知道1051代表的是“unknown table”时你才明白错误的原因。
通过为状态码指定一个名称,才使得处理程序的目的更加明了。
状态的处理定义
DECLARE handler_action HANDLER FORcondition_value[,…] sp_statement
handler_ action:
CONTINUE|EXIT|UNDO
condition_value:
SQLSTATE[VALUE] sqlstate_value
|condition_name
|SQLWARNING
|NOT FOUND
|SQLEXCEPTION
|mysql_error_code
示例4:通过不指定与指定状态处理程序的不同处理熟悉状态处理程序的使用
<1>向emp(id,ename,deptno)表中连续插入两条记录(1,’张三’,1),(1,’李四’,1)没有处理程序时,id重复的执行结果如下:
DELIMITER $$
CREATE PROCEDURE insert_emp()
BEGIN
SET @x=1;
INSERT INTO emp(id,ename,deptno) VALUES(1,'张三',1);
SET @X=2;
INSERT INTO emp(id,ename,deptno) VALUES(1,'李四',1);
SET @X=3;
END $$
DELIMITER ;
CALL insert_emp();
ERROR 1062 (23000): Duplicate entry '1' forkey 'PRIMARY'
SELECT @X;
->2
从后的执行结果可以看出,执行到插入emp.ename=李四的记录时,会主键重复并退出,并没有执行到下面的语句。
<1>向emp(id,ename,deptno)表中连续插入两条记录(1,’张三’,1),(1,’李四’,1)使用处理程序时,id重复的执行结果如下,我们在处理程序加上输出:
DELIMITER $$
CREATE PROCEDURE insert_emp()
BEGIN
DECLAREduplicate_entry CONDITION FOR SQLSTATE '23000';
DECLARECONTINUE HANDLER FOR duplicate_entry
BEGIN
SELECT'遇到异常继续执行';
END;
SET@x=1;
INSERTINTO emp(id,ename,deptno) VALUES(1,'张三',1);
SET@X=2;
INSERTINTO emp(id,ename,deptno) VALUES(1,'李四',1);
SET@X=3;
END $$
DELIMITER ;
CALL insert_emp();
->遇到异常继续执行
SELECT @x;
->3
调用条件处理的过程,再遇到主键重复的错误时,会按照定义的处理方式进行处理,由于例子中定义的CONTINUE,所以会继续执行下面的语句。
handler_action在MySQL5.6中还只支持CONTINUE和EXIT两种,CONTINUE表示继续执行下面的语句,EXIT表示执行终止,UNDO还不支持。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系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 使用指南