第三节:存储过程

一、存储过程

  1、存储过程

    含义:一组预先编译好的 SQL 语句的集合,理解成批处理语句。

  2、好处

    (1)提高代码的重用性,简化操作;

    (2)简化应用开发人员的很多工作;

    (3)减少了编译次数并且减少了和数据库和应用服务器的连接次数及传输,提高了效率

二、语法

  1、创建语法

CREATE PROCEDURE 存储过程名(参数列表)
BEGIN

	存储过程体(一组合法的SQL语句)
END

    注意:

    (1)参数列表包含三部分

      参数模式  参数名  参数类型

      例如:

in stuName varchar(20)

       参数模式:

      in:该参数可以作为输入,也就是该参数需要调用方法传入值;

      out:该参数可以作为输出,也就是该参数可以作为返回值;

      inout:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值;

      

    (2)如果存储过程体仅仅只有一句话,begin、end 可以省略

        存储过程体中的每条 SQL 语句的结尾要求必须加分号;

        存储过程的结尾可以使用 delimiter  重新设置;

        语法:

delimiter 结束标记

       案例:

delimiter $

  

  2、调用语法

CALL 存储过程名(实参列表);

  

  3、删除存储过程

    语法:

drop procedure 存储过程名

    注意:只能删除一个存储过程,不能删除多个。

     举例:

DROP PROCEDURE p1;   #正确写法
DROP PROCEDURE p2,p3;#错误写法

  

  4、查看存储过程的信息

SHOW CREATE PROCEDURE  myp2;

  

三、案例演示

  1、空参列表

    案例:插入到 admin 表中五条记录

    存储过程:

 1 SELECT * FROM admin;
 2 
 3 DELIMITER $
 4 CREATE PROCEDURE myp1()
 5 BEGIN
 6     INSERT INTO admin(username,`password`) 
 7     VALUES('john1','0000'),('lily','0000'),('rose','0000'),('jack','0000'),('tom','0000');
 8 END $
 9 
10 
11 #调用
12 CALL myp1()$

  2、创建带in模式参数的存储过程

    案例1:创建存储过程实现 根据女神名,查询对应的男神信息

    存储过程:

 1 CREATE PROCEDURE myp2(IN beautyName VARCHAR(20))
 2 BEGIN
 3     SELECT bo.*
 4     FROM boys bo
 5     RIGHT JOIN beauty b ON bo.id = b.boyfriend_id
 6     WHERE b.name=beautyName;
 7     
 8 
 9 END $
10 
11 #调用
12 CALL myp2('柳岩')$

    案例2:创建存储过程实现,用户是否登录成功

 1 CREATE PROCEDURE myp4(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
 2 BEGIN
 3     DECLARE result INT DEFAULT 0;#声明并初始化
 4     
 5     SELECT COUNT(*) INTO result#赋值
 6     FROM admin
 7     WHERE admin.username = username
 8     AND admin.password = PASSWORD;
 9     
10     SELECT IF(result>0,'成功','失败');#使用
11 END $
12 
13 #调用
14 CALL myp3('张飞','8888')$

  3、创建out 模式参数的存储过程

    案例1:根据输入的女神名,返回对应的男神名

    存储过程:

 1 CREATE PROCEDURE myp6(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20))
 2 BEGIN
 3     SELECT bo.boyname INTO boyname
 4     FROM boys bo
 5     RIGHT JOIN
 6     beauty b ON b.boyfriend_id = bo.id
 7     WHERE b.name=beautyName ;
 8     
 9 END $
10 
11 #调用
12 SET @bName$
13 CALL myp5('小昭', @bName)$

    案例2:根据输入的女神名,返回对应的男神名和魅力值

    存储过程:

 1 CREATE PROCEDURE myp7(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT usercp INT) 
 2 BEGIN
 3     SELECT boys.boyname ,boys.usercp INTO boyname,usercp
 4     FROM boys 
 5     RIGHT JOIN
 6     beauty b ON b.boyfriend_id = boys.id
 7     WHERE b.name=beautyName ;
 8     
 9 END $
10 
11 
12 #调用
13 CALL myp7('小昭',@name,@cp)$
14 SELECT @name,@cp$

  4、创建带inout模式参数的存储过程

    案例1:传入a和b两个值,最终a和b都翻倍并返回

    存储过程:

 1 CREATE PROCEDURE myp8(INOUT a INT ,INOUT b INT)
 2 BEGIN
 3     SET a=a*2;
 4     SET b=b*2;
 5 END $
 6 
 7 #调用
 8 SET @m=10$
 9 SET @n=20$
10 CALL myp8(@m,@n)$
11 SELECT @m,@n$

四、练习

   1、创建存储过程实现传入用户名和密码,插入到admin表中

1 CREATE PROCEDURE test_pro1(IN username VARCHAR(20),IN loginPwd VARCHAR(20))
2 BEGIN
3     INSERT INTO admin(admin.username,PASSWORD)
4     VALUES(username,loginpwd);
5 END $

  2、创建存储过程实现传入女神编号,返回女神名称和女神电话

1 CREATE PROCEDURE test_pro2(IN id INT,OUT NAME VARCHAR(20),OUT phone VARCHAR(20))
2 
3 BEGIN
4     SELECT b.name ,b.phone INTO NAME,phone
5     FROM beauty b
6     WHERE b.id = id;
7 
8 END $

  3、创建存储存储过程或函数实现传入两个女神生日,返回大小

1 CREATE PROCEDURE test_pro3(IN birth1 DATETIME,IN birth2 DATETIME,OUT result INT)
2 BEGIN
3     SELECT DATEDIFF(birth1,birth2) INTO result;
4 END $

  4、创建存储过程或函数实现传入一个日期,格式化成xx年xx月xx日并返回

1 CREATE PROCEDURE test_pro4(IN mydate DATETIME,OUT strDate VARCHAR(50))
2 BEGIN
3     SELECT DATE_FORMAT(mydate,'%y年%m月%d日') INTO strDate;
4 END $
5 
6 CALL test_pro4(NOW(),@str)$
7 SELECT @str $

  5、创建存储过程或函数实现传入女神名称,返回:女神 and 男神  格式的字符串

    如:传入:小昭

      返回:小昭 AND 张无忌

 1 DROP PROCEDURE test_pro5 $
 2 CREATE PROCEDURE test_pro5(IN beautyName VARCHAR(20),OUT str VARCHAR(50))
 3 BEGIN
 4     SELECT CONCAT(beautyName,' and ',IFNULL(boyName,'null')) INTO str
 5     FROM boys bo
 6     RIGHT JOIN beauty b ON b.boyfriend_id = bo.id
 7     WHERE b.name=beautyName;
 8     s
 9 END $
10 
11 CALL test_pro5('柳岩',@str)$
12 SELECT @str $

  6、创建存储过程或函数,根据传入的条目数和起始索引,查询beauty表的记录

1 DROP PROCEDURE test_pro6$
2 CREATE PROCEDURE test_pro6(IN startIndex INT,IN size INT)
3 BEGIN
4     SELECT * FROM beauty LIMIT startIndex,size;
5 END $
6 
7 CALL test_pro6(3,5)$
原文地址:https://www.cnblogs.com/niujifei/p/14986757.html