十、存储过程和函数

存储过程

含义

​ 一组预先编译好SQL语句的集合,理解成批处理语句,单比批处理强大的多。

优点

* 提高语句的重用性
* 简化操作
* 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

创建语法

create procedure 存储过程名(参数列表)
begin
	存储过程体(合法有效的SQL语句)
end;

注意

1、参数列表包含三部分

​ 参数模式 参数名 参数类型

​ 举例:in param_name varchar(20)

​ 参数模式:

​ in (入参)

​ out (返回值)

​ inout (入参和返回值)

2、如果存储过程体仅仅只有一句话,begin end关键字可以省略,存储过程中的每条SQL语句的结尾必须加分号。存储过程的结尾可以用 delimiter 重新设置

语法:delimiter 结束标记,举例如:delimiter $

调用语法

call 存储过程名(实参列表);

存储过程演示

1、空参列表

插入到 admin 表中五条记录

select * from admin; # 查询现有数据
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | zhangsan | 123456   |
+----+----------+----------+
# 创建存储过程
delimiter $
create procedure insert_admin()
begin
	insert into admin(username, `password`) values
	('111', '123456'), 
	('222', '123456'), 
	('333', '123456'), 
	('444', '123456'), 
	('555', '123456');
end $
# 执行存储过程
call insert_admin();
# 再次查看 admin 表信息
select * from admin;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | zhangsan | 123456   |
|  2 | 111      | 123456   |
|  3 | 222      | 123456   |
|  4 | 333      | 123456   |
|  5 | 444      | 123456   |
|  6 | 555      | 123456   |
+----+----------+----------+

2、有参列表(in)

创建存储过程,根据用户名查询对应数据

# 查看 admin 表信息
select * from admin;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | zhangsan | 123456   |
|  2 | 111      | 123456   |
|  3 | 222      | 123456   |
|  4 | 333      | 123456   |
|  5 | 444      | 123456   |
|  6 | 555      | 123456   |
+----+----------+----------+
# 创建存储过程
create procedure query_admin_by_name(in user_name varchar(255))
begin
    select * from admin where username = user_name;
end;
# 执行存储过程
call query_admin_by_name('111');
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  2 | 111      | 123456   |
+----+----------+----------+

创建存储过程,根据用户名、面查询用户登录状态

# 创建存储过程
create procedure `check_login`(in user_name varchar(255), in `password` varchar(255))
begin
	# 声明变量并初始化
	declare result int default 0;
	select 
	  count(*) into result  # 赋值
	from admin a where a.username = user_name and a.`password` = `password`;
	select if(result > 0, '成功', '失败');
end
# 执行存储过程
call check_login('111', '123456');
+----------+
| 登录结果 |
+----------+
| 成功     |
+----------+
# 执行存储过程
call check_login('111', '46513131');
+----------+
| 登录结果 |
+----------+
| 失败     |
+----------+

3、有返回值(out)

根据用户名,返回对应 id 编号

# 创建存储过程
create procedure `query_id_by_username`(in user_name varchar(255), out result_id int(11))
begin
	select 
	  id into result_id
	from 
	  admin 
	where username = user_name;
end
# 执行存储过程
call query_id_by_username('111', @result_id);
select @result_id;
+------------+
| @result_id |
+------------+
|          2 |
+------------+
call query_id_by_username('444', @result_id);
select @result_id;
+------------+
| @result_id |
+------------+
|          5 |
+------------+

4、带inout的存储过程

传入a和b两个值,最终a和b都乘以2返回

# 创建存储过程
create procedure test_inout(inout a int(11), inout b int(11))
begin
	select (a * 2), (b * 2);
end;
# 调用存储过程
set @a = 2;
set @b = 4;
call test_inout(@a,@b);
+---------+---------+
| (a * 2) | (b * 2) |
+---------+---------+
|       4 |       8 |
+---------+---------+

存储过程的删除

语法

drop procedure 存储过程名;

存储过程的查看

语法

show create procedure 存储过程名;
在这里插入图片描述

函数

含义

一组预先编译好SQL语句的集合,理解成批处理语句,单比批处理强大的多。

优点

  • 提高语句的重用性
  • 简化操作
  • 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

和存储过程区别

  • 存储过程:可以有0个返回,也可以有过个返回值,适合做一些批量插入、批量更新等
  • 函 数:有且只有一个返回值,适合做处理数据后返回一个结果

创建语法

语法

create function 函数名(参数列表) returns 返回类型
begin
	函数体
end

注意

  • 参数列表包含两部分:参数名、参数类型
  • 函数体:肯定会有return语句,如果没有会报错,如果return语句
    没有放在函数体最后也不报错,但不建议这样做
  • 函数体中仅有一句话,则可以省略 begin end 语句
  • 使用 delimiter 语句设置结束标记

调用语法

语法

select 函数名(参数列表);

实际案例

无参有返回

返回用户数

# 创建存储过程
create function count_admin() returns int
begin
	declare result int default 0;
	select count(*) into result from admin;
	return result;
end;
# 调用函数
select count_admin();
+---------------+
| count_admin() |
+---------------+
|             6 |
+---------------+

有参有返回

根据用户名返回密码

# 创建存储过程
create function query_password_by_username(user_name varchar(20)) returns varchar(50)
begin
	declare result varchar(50) default '';
	select a.`password` into result 
	from admin a where a.username = user_name;
	return result;
end
# 调用函数
select query_password_by_username('111');
+-----------------------------------+
| query_password_by_username('111') |
+-----------------------------------+
| 123456                            |
+-----------------------------------+

函数的查看

show create function 函数名;

函数的删除

drop function 函数名;

posted @ 2019-09-14 20:39  achnly  阅读(182)  评论(0编辑  收藏  举报