Mysql学习笔记(9):存储过程
存储过程和函数:类似于java中的方法
好处:
1、提高代码的重用性
2、简化操作
存储过程
含义:一组预先编译好的SQL语句的集合,理解成批处理语句
1、提高代码的重用性
2、简化操作
3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
一、存储过程语法
1. 存储过程的创建
语法:
-——>
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组合法的SQL语句)
END
<——-
参数列表包含三部分: 参数模式 参数名 参数类型
例如: in stuname varchar(20)
参数模式:
- in:该参数可以作为输入,也就是该参数需要调用方传入值
- out:该参数可以作为输出,也就是该参数可以作为返回值
- inout:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
注意:
- SQL中结束标记默认是’;’ ,而在存储过程中每条SQL语句最后都需要使用结束标记表明一个SQL的结束。
- 如果使用结束标记 ‘;’ ,对于一个存储过程,如果执行了一条SQL语句,遇到 ‘;’ 时服务器会认为你当前的存储过程定义结束了,此时会产生错误。
- 使用DELIMITER关键字设置存储过程的结束标记,用“DELIMITER 结束标记”声明当前段分隔符,让编译器把两个”结束标记”之间的内容当做存储过程的代码,而不是普通的SQL语句;
- 最后需要执行 DELIMITER ; 将分隔符还原。
语法:
delimiter 结束标记
案例:
DELIMITER $
CREATE PROCEDURE student()
BEGIN
SELECT * FROM student;
END $
DELIMITER ;
-————-
2. 存储过程的调用
CALL 存储过程名(实参列表);
==========
二 、案例演示
1. 空参列表
1.1 创建存储过程
DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
INSERT INTO student(NAME,grade) VALUES('盖伦',50);
END $
DELIMITER ;
1.2 调用
CALL myp1();
说明:每次调用这个存储过程都会执行存储体中的SQL语句,即向student表中插入一条语句。
-——
2. 带in模式参数的存储过程
2.1 创建
DELIMITER $
CREATE PROCEDURE myp2(IN stuName VARCHAR(20))
BEGIN
SELECT s.* FROM student s WHERE s.name = stuName;
END $
DELIMITER ;
2.2 调用
CALL myp2('盖伦');
说明:
- 定义了一个带输入参数的存储过程,每次调用都会根据参数查询student表。
2.3 拓展
#案例 :创建存储过程实现,用户是否登录成功
CREATE PROCEDURE myp3(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
BEGIN
DECLARE result INT DEFAULT 0;#声明并初始化
SELECT COUNT(*) INTO result#赋值
FROM admin
WHERE admin.username = username
AND admin.password = PASSWORD;
SELECT IF(result>0,'成功','失败');#使用
END $
#调用
CALL myp3('张飞','8888')$
说明:
- 定义了一个双入参的存储过程,里面定义了一个局部变量,并通过查询admin表进行赋值。
- 通过判断admin值显示登陆 成功/失败
-
3. 带out 模式参数的存储过程
3.1 创建
DELIMITER $
CREATE PROCEDURE myp4(IN stuName VARCHAR(20),OUT grade INT)
BEGIN
SELECT s.grade INTO grade FROM student s WHERE s.name = stuName;
END $
DELIMITER ;
这里定义的OUT参数作为一个局部变量存在
3.2 调用
CALL myp4('盖伦',@grade);
定义一个用户变量grade存入存储过程中,让它保存数据。
3.3 查看数据
SELECT @grade;
-——
4. 带inout模式参数的存储过程
案例:传入a和b两个值,最终a和b都翻倍并返回
4.1 创建
DELIMITER $
CREATE PROCEDURE myp5(INOUT a INT ,INOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2;
END $
DELIMITER ;
4.2 调用
SET @m=10;
SET @n=20;
CALL myp8(@m,@n);
SELECT @m,@n;
==========
三、删除存储过程
语法:drop procedure 存储过程名
示例:
DROP PROCEDURE p1;
==========
四、查看存储过程的信息
DESC myp2;
SHOW CREATE PROCEDURE myp2;
还没有评论,来说两句吧...