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;












你可能感兴趣的:(mysql)