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;

 

posted @ 2019-06-15 21:43  爱鑫一击  阅读(1276)  评论(0编辑  收藏  举报