存储过程:一组为了完成特定功能的SQL语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字给出参数来执行它
简而言之,一组预先编译号的SQL语句的集合,理解成批处理语句
如果这样还不理解,我们直接可以理解成类似于java的方法,C中的函数
使用存储过程的好处:
1.提高代码的重用性
2.简化操作
3.减少了编译器次数并且减少了和数据库服务器的连接次数,提高了效率
在我们使用存储过程时,要先理解SQL中的变量定义的方法
具体在上一篇博文有介绍:
MySQL之变量
首先需要学习存储过程的基本语法规则:
一.创建存储过程
语法:
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组合法的SQL语句;
END [结束标记]
注意(这部分需要重点记忆):
1.参数列表包含三部分:参数模式 参数名 参数类型
参数模式:
IN:该参数可以作为输入,该参数需要调用方传入值
OUT:该参数可以作为输出,也就是该参数可以作为返回值
INOUT:该参数即可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
2.如果存储过程体仅仅只有一句话,BEGIN END可以省略(我们可以把BEGIN END理解成C语言的大括号)
3.存储过程体中的每条SQL语句的结尾要求必须加分号
存储过程的结尾([结束标记])可以使用DELIMITER重新设置
语法:
DELIMITER 结束标记
案例:
DELIMITER // (设置之后’//‘表示原来的’;’)
二.调用
语法:
CALL 存储过程名(实参列表);
三.删除存储过程
语法:
DROP procedure 存储过程名;
四.查看存储过程的信息
语法:
SHOW CREATE PROCEDURE 存储过程名;
下面结合实例理解:
现在有一张表名为boys的表如下
案例一(演示空参存储过程):要求创建存储过程stb,调用查询表的全部信息
DELIMITER // #由于存储过程语句必须以分号结尾,且不代表语句结束,所以我们要对结束标记重命名
CREATE PROCEDURE stb() #创建存储过程
BEGIN
SELECT *
FROM boys; #语句结尾必须加分号
END // #一定要有结束标记
DELIMITER ; #恢复结束标记
CALL stb(); #调用存储过程
案例二(演示带in模式的存储过程):要求创建存储过程intb,插入指定数据,并且查询结果
DELIMITER //
CREATE PROCEDURE intb(IN tName VARCHAR(10),IN tCP INT)
BEGIN
INSERT INTO boys(boyName,userCP) VALUES (tName,tCP); #插入语句,直接使用变量
SELECT * #查询插入结果
FROM boys;
END //
DELIMITER ;
CALL intb('赵丽颖',666); #直接写上参数
案例三(演示待out模式的存储过程):要求创建存储过程outtb,指定boyName,返回并输出他的userCP的值
DELIMITER //
CREATE PROCEDURE outtb(IN tName VARCHAR(10),OUT tCP INT)
BEGIN
SELECT userCP INTO tCP #INTO表示赋值,如果有多个值格式:select a,b into A,B
FROM boys
WHERE boyName = tName;
END //
DELIMITER ;
CALL outtb('黄晓明',@TTcp); #这里使用用户变量不需要定义,可以直接使用,并且用此变量接收返回值
SELECT @TTcp; #查询变量
案例四(带有inout模式的存储过程):创建一个存储过程iotb,传入a,b两个值,最终a,b翻10倍返回
DELIMITER //
CREATE PROCEDURE iotb(INOUT ta INT,INOUT tb INT)
BEGIN
SET ta := ta*10; #直接给局部变量赋值
SET tb := tb*10;
END //
DELIMITER ;
SET @a := 1; #定义并初始化用户变量的值
SET @b := 2;
CALL iotb(@a,@b); #使用用户变量传递和接收值
SELECT @a,@b; #查询用户变量的值