存储过程和函数:类似于java中的方法
好处:
1 提高代码的重用性
2 简化操作
存储过程:一组雨欣编译好的sql语句集合,理解成批处理语句
1 提高代码的重用性
2 简化操作
3 减少编译次数并且减少了和数据库服务器的连接次数,提高效率
语法:
1.创建语法
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组合法的sql语句)
END
注意:
1.参数列表包含三部分
参数模式 参数名称 参数类型
举例:
IN stuname VARCHAR(20)
参数模式:
1.IN:该参数可以作为输入,也就是说改参数需要
2.OUT:该参数可以作为输入,也就是该参数可以作为返回值
3.INOUT:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
2.如果存储过程体仅仅只有一句话,BEGIN END可以省略
3.存储过程体中的每条sql语句结尾必须加分号;
4.存储过程的结尾可以使用DELIMITER重新设置
语法:
DELIMITER 结束标记
DELIMITER $
2.调用语法:
CALL 存储过程名(实参列表);
样例:
1.无参构造方法
CREATE PROCEDURE myp1()
BEGIN
INSERT INTO `user` (name,age)
VALUES ('吴孟达',18),('刘丹',20),('吴振',21);
END;
调用:
call myp1();
2.创建带in模式的存储过程
2.1 单个参数:
案例1:按照传入名称的不同,实现根据人名查询信息
声明:
CREATE myp2(IN user_nmae VARCHAR(20))
BEGIN
SELECT * from `user` WHERE `name`=user_nmae;
END
调用:
call myp2('吴孟达');
此时有个问题,如果传入参数和表的列名相同怎么办??
![](https://img2022.cnblogs.com/blog/1349485/202205/1349485-20220525203911613-1711566507.png)
多个参数的存储过程:
场景:按照姓名和年龄在用户表中找,如果找到,返回成功,找不到,返回失败!
CREATE `myp3`(IN name VARCHAR(20),IN age INT)
BEGIN
#定义局部变量,默认值是0
DECLARE result INT DEFAULT 0;
#给局部变量赋值
SELECT COUNT(1) INTO result
FROM `user`
WHERE user.name=name
and user.age=age;
#使用局部变量,if函数的使用,后面会详细讲
SELECT IF(result>0,'成功','失败');
END
![](https://img2022.cnblogs.com/blog/1349485/202205/1349485-20220525203938427-613203980.png)
创建带OUT模式的存储过程
1.单个的out模式返回值
场景:根据传入的id值,获取用户名称
声明:传入out模式的参数
CREATE PROCEDURE myp4(IN id int,OUT name VARCHAR(20))
BEGIN
#使用查询into的形式进行赋值
select `user`.name into name
from user
where `user`.id=id;
END
调用:
1.不声明用户变量
CALL myp4(1,@user_name);
select @user_name;
2.声明用户变量
#声明一个用户变量(作用域在当前会话都有效,必须有值,没值会报错)
set @u_name='';
#调用传入
call myp4(1,@u_name);
#查询
select @u_name;
2.多个out模式的返回值
场景:传入id,获取用户和名称
声明:
CREATE PROCEDURE myp5(in id int,out name varchar(20),out age int)
begin
#注意,给两个out模式的返回值赋值,使用into作为分界,第一个和第一个对应...
select u.name,u.age into name,age
from user u
where u.id=id;
end
调用:
call myp5(1,@name,@age);
select @name,@age;
创建带INOUT模式参数的存储过程
场景,定义两个变量,变量翻倍并返回
创建:
create procedure myp6(inout a int,inout b int)
begin
set a=a*2;
set b=b*2;
end
调用:
传入的必须是变量,所以定义用户变量并赋值
set @a=2;
set @b=3;
call myp6(@a,@b);
select @a,@b;
返回:
@a @b
4 6
存储过程的删除
DROP procedure 存储过程名;
每次只能删除一个
查看储存过程的信息
1.查看表的信息:
desc 表名;
2.查看视图信息:
desc 视图名;
3.查看存储过程的信息:
![](https://img2022.cnblogs.com/blog/1349485/202205/1349485-20220525204127924-382044676.png)