? 一组预先编译好SQL语句的集合,理解成批处理语句,单比批处理强大的多。
* 提高语句的重用性
* 简化操作
* 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
create procedure 存储过程名(参数列表)
begin
存储过程体(合法有效的SQL语句)
end;
1、参数列表包含三部分
? 参数模式 参数名 参数类型
? 举例:in param_name varchar(20)
? 参数模式:
? in (入参)
? out (返回值)
? inout (入参和返回值)
2、如果存储过程体仅仅只有一句话,begin end关键字可以省略,存储过程中的每条SQL语句的结尾必须加分号。存储过程的结尾可以用 delimiter 重新设置
语法:delimiter 结束标记,举例如:delimiter $
call 存储过程名(实参列表);
插入到 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 |
+----+----------+----------+
创建存储过程,根据用户名查询对应数据
# 查看 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');
+----------+
| 登录结果 |
+----------+
| 失败 |
+----------+
根据用户名,返回对应 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 |
+------------+
传入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语句的集合,理解成批处理语句,单比批处理强大的多。
减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
函 数:有且只有一个返回值,适合做处理数据后返回一个结果
create function 函数名(参数列表) returns 返回类型
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 函数名;
原文:https://www.cnblogs.com/yliucnblogs/p/11520119.html