如何在MySQL中自定义函数和存储过程
本篇文章给大家分享的是有关如何在MySQL中自定义函数和存储过程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
1、前置条件
MySQL数据库中存在表user_info,其结构和数据如下:
mysql>descuser_info;+-----------+----------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+-----------+----------+------+-----+---------+-------+|id|int(10)|NO|PRI|NULL|||name|char(20)|NO||NULL|||passwd|char(40)|NO||NULL|||email|char(20)|NO||NULL|||phone|char(20)|NO||NULL|||role|char(10)|NO||NULL|||sex|char(10)|NO||NULL|||status|int(10)|NO||NULL|||createAt|datetime|NO||NULL|||exprAt|datetime|NO||NULL|||validDays|int(10)|NO||NULL|||delAt|datetime|YES||NULL||+-----------+----------+------+-----+---------+-------+12rowsinset(0.10sec)mysql>select*fromuser_info;+----+--------------+----------+------------+-------------+--------+------+--------+---------------------+---------------------+-----------+-------+|id|name|passwd|email|phone|role|sex|status|createAt|exprAt|validDays|delAt|+----+--------------+----------+------------+-------------+--------+------+--------+---------------------+---------------------+-----------+-------+|1|StephenWang7|py123456|123@qq.com|15103887470|admin|male|200|2019-04-1220:11:30|2019-04-1920:11:30|30|NULL||2|StephenWang8|123456|123@qq.com|15103887470|viewer|male|200|2019-04-1220:11:30|2019-04-1920:11:30|30|NULL|+----+--------------+----------+------------+-------------+--------+------+--------+---------------------+---------------------+-----------+-------+2rowsinset(0.00sec)
2、自定义函数
函数:可以完成特定功能的一段SQL集合。MySQL支持自定义函数来完成特定的业务功能。
创建自定义函数(User Defined Function 简称UDF)的语法如下:
create function <函数名称> ([参数1] [类型1], [参数N] [类型N])
returns <类型>
return
<函数主体>
调用UDF的语法如下:
select <函数名称> ([参数])
创建无参的UDF
示例1:查询user_info表中有多少条记录
#定义函数mysql>createfunctionuser_info_count()->returnsint(10)->return->(selectcount(*)fromuser_info);
调用函数user_info_count()
mysql>selectuser_info_count();+-------------------+|user_info_count()|+-------------------+|2|+-------------------+1rowinset(0.00sec)
创建有参UDF
示例2:根据id查询用户name。
#定义函数mysql>createfunctionqueryNameById(uidint(10))->returnschar(20)->return->(selectnamefromuser_infowhereid=uid);QueryOK,0rowsaffected(0.01sec)
调用函数,查询id为1的用户名称。
mysql>selectqueryNameById(1);+------------------+|queryNameById(1)|+------------------+|StephenWang7|+------------------+1rowinset(0.00sec)
查看UDF
查询系统中所有的UDF
showfunctionstatus;
查询指定的UDF
#showcreatefunction函数名称;mysql>showfunctionqueryNameById;ERROR1064(42000):YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'queryNameById'atline1mysql>showfunctionqueryNameById();ERROR1064(42000):YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'queryNameById()'atline1mysql>showcreatefunctionqueryNameById();ERROR1064(42000):YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'()'atline1mysql>showcreatefunctionqueryNameById;+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+|Function|sql_mode|CreateFunction|character_set_client|collation_connection|DatabaseCollation|+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+|queryNameById|ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION|CREATEDEFINER=`root`@`localhost`FUNCTION`queryNameById`(uidint(10))RETURNSchar(20)CHARSETlatin1return(selectnamefromuser_infowhereid=uid)|utf8|utf8_general_ci|latin1_swedish_ci|+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+1rowinset(0.00sec
修改UDF
如果想要修改函数的内容,先删除后再重新创建。
删除UDF
删除UDF语法如下:
drop function <函数名称>;
示例3:删除函数queryNameId后再次调用并观察现象。
mysql>dropfunctionqueryNameById;QueryOK,0rowsaffected(0.45sec)mysql>selectqueryNameById(1);ERROR1305(42000):FUNCTIONrms.queryNameByIddoesnotexistmysql>
3、存储过程
存储功能和自定义函数相似,也是一组完成特定功能的SQL语句集合。把复杂或频繁调用的SQL提前写好并指定一个名称。待到要使用时,直接调用即可。
定义存储过程的语法如下:
CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>
[过程参数[,…] ] 格式
[ IN | OUT | INOUT ] <参数名> <类型>
#语法定义来自:http://c.biancheng.net/view/2593.html
创建无参的存储过程
示例4:查询用户name。
mysql>DELIMITER//mysql>craeteprocedurequeryName()->begin->selectnamefromuser_info;->end//
关于DELIMITER命令,修改MySQL结束命令的字符。默认的结束命令字符为分号,当存储过程中包含多条语句时,遇到第一个分号会作为存储过程结束的标志。这样不符合预期,因此需要修改默认结束命令字符。 DELIMITER //就是将结束命令字符修改为//。调用存储过程的命令为:call 存储过程名称。
#此时的命令的结束符号为//不是;mysql>callqueryName()//+--------------+|name|+--------------+|StephenWang7||StephenWang8|+--------------+2rowsinset(0.00sec)QueryOK,0rowsaffected(0.00sec)
创建带参数的存储过程
示例5:根据id查询name。
mysql>createprocedurequeryNameById->(Inuidint(15))->begin->selectnamefromuser_infowhereid=uid;->end->//QueryOK,0rowsaffected(0.03sec)
调用存储过程queryNameById
mysql>callqueryNameById(1);->//+--------------+|name|+--------------+|StephenWang7|+--------------+1rowinset(0.03sec)QueryOK,0rowsaffected(0.04sec)
修改存储过程
如果想创建存储过程的内容可以先删除再重新创建存储过程。
查看存储过程
showcreateprocedure<过程名称>
mysql>showcreateprocedurequeryNameById;->//+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+|Procedure|sql_mode|CreateProcedure|character_set_client|collation_connection|DatabaseCollation|+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+|queryNameById|ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION|CREATEDEFINER=`root`@`localhost`PROCEDURE`queryNameById`(Inuidint(15))beginselectnamefromuser_infowhereid=uid;end|utf8|utf8_general_ci|latin1_swedish_ci|+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+1rowinset(0.04sec)
删除存储过程
drop procedure <过程名称>
删除存储过程queryNameById
mysql>dropprocedurequeryNameById//QueryOK,0rowsaffected(0.02sec)mysql>callqueryNameById(1)//ERROR1305(42000):PROCEDURErms.queryNameByIddoesnotexist
4、总结
自定义函数和存储过程都是完成特定功能的SQL集合,那么他们有什么不同呢?
a、调用方式不同
#自定义函数
select <函数名>
#存储过程
call <存储过程名>
b、自定义函数不能有输出参数,而存储过程可以。
c、自定义函数必须要包含return语句,而存储过程则不需要。
以上就是如何在MySQL中自定义函数和存储过程,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。