MySQL中的存储过程、函数及简单应用
1,什么是存储过程、函数
存储过程和函数是从5.0版本开始支持的,两者在定义上十分类似的,都是事先经过编译和存储在数据库中的SQL语句的集合,就相当于java中的方法。
2,存储过程、函数的好处
1,对于开发人员来说,可以极大的简化他们的工作。
2,将有关数据的处理都放在了数据库端,这样就减少了数据库和应用服务器之间的传输,提高了数据的处理效率。
3,存储过程和函数的区别
1,函数必须有返回值,存储过程没有。
2,存储过程的参数可以是IN,OUT或者INOUT类型,而函数只能是IN类型。
4,存储过程的小案例
下面的小案例是在Navicat中实现的。
写案例之前先准备一个简单的表格:
CREATE TABLE `users` ( `u_id` int(4) NOT NULL AUTO_INCREMENT, `u_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, `u_age` int(4) DEFAULT NULL, PRIMARY KEY (`u_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
插入以上几条数据。
在Navicat中新建存储过程的步骤:右击‘函数’->新建函数->过程->选择参数->完成
1,创建一个无参的
CREATE DEFINER=`root`@`localhost` PROCEDURE `noParamName_select`() BEGIN #Routine body goes here... select u_name as '用户名' from users where u_id = 1; END
我们只需要写BEGIN和END之间的代码就好了,其他的Navicat会为我们创建好。
#无参
call noParamName_select();#调用方式是用call关键字
2,IN类型参数
CREATE DEFINER=`root`@`localhost` PROCEDURE `inParamName_select`(IN `user_id` int) BEGIN #Routine body goes here... select u_name as '用户名' from users where u_id = user_id; END
改过程的作用是根据输入的用户id,查询对应的用户名
#IN参数 call inParamName_select(2);
3,OUT类型参数
CREATE DEFINER=`root`@`localhost` PROCEDURE `outParamName_select`(OUT `user_name` varchar(20)) BEGIN #Routine body goes here... select u_name into user_name from users where u_id = 2; END
这里要注意,形参类型把varchar后面一定要加长度,否则就会出现错误
#OUT参数查id call outParamId_select(@a);
select @a;
对于OUT类型的参数,在调用函数时也要传参,使用@开头,因为OUT类型的参数的是作为输出,所以最后使用select进行查询。
4,IN类型参数和OUT类型参数一起用
CREATE DEFINER=`root`@`localhost` PROCEDURE `inAndOutParamName_select`(IN `user_id` int,OUT `user_name` varchar(20)) BEGIN #Routine body goes here... select u_name into user_name from users where u_id = user_id; END
#同时使用IN和OUT参数查询用户名 call inAndOutParamName_select(1,@n); select @n as '用户名';
5,INOUT参数,既作为输入又作为输出。
BEGIN #Routine body goes here... set @number = num; #设置变量 select @number + 10 into num; END
#INOUT参数 set @num = 2; call inoutParamName_select(@num); select @num;