vlambda博客
学习文章列表

16-mysql基础-mysql中的存储过程

点击蓝色“潭时录”关注我丫

每天和小潭一起快乐的学习~

    你好,我是在学mysql的小潭。在上一期的推文中我们认识了mysql中变量,本期我们将学习mysql中的存储过程。


  • 存储过程定义

存储过程:类似Java中的方法
含义:一组预先编译好的sql语句的集合,理解成批处理语句
好处:1.提高代码的重用性2.简化操作3.减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
  • 创建语法

CREATE PROCEDURE 存储过程名(参数列表)BEGIN 存储过程体(一组合法的sql语句)END注意:参数列表包含三个部分:参数模式 参数名 参数类型举例:IN stuname VARCHAR(20)
参数模式:IN :该参数可以作为输入,也就是该参数需要调用方传入值OUT :该参数可以作为输出,也就是该参数可以作为返回值INOUT :该参数既可以作为输入又可以作为输出,也就是该参数既可以传入值,又可以返回值
如果存储过程体仅有一句话, BEGIN END 可以省略存储过程体中的每条sql语句的结尾要求必须加分号存储过程的结尾可以使用 DELIMITER 重新设置语法:DELIMITER 结束标记案例:DELIMITER $
  • 调用语法

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

  • 案例

用到测试表:

# 创建数据库CREATE DATABASE IF NOT EXISTS  `girls` DEFAULT CHARACTER SET utf8;USE `girls`;
# 创建测试表/*Table structure for table `admin` */DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(10) NOT NULL, `password` varchar(10) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
insert into `admin`(`id`,`username`,`password`) values (1,'john','8888'),(2,'lyt','6666');
/*Table structure for table `beauty` */DROP TABLE IF EXISTS `beauty`;
CREATE TABLE `beauty` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `sex` char(1) DEFAULT '女', `borndate` datetime DEFAULT '1987-01-01 00:00:00', `phone` varchar(11) NOT NULL, `photo` blob, `boyfriend_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
insert into `beauty`(`id`,`name`,`sex`,`borndate`,`phone`,`photo`,`boyfriend_id`) values (1,'A1','女','1988-02-03 00:00:00','182xxxx6577',NULL,8),(2,'A2','女','1987-12-30 00:00:00','182xxxx6577',NULL,9),(3,'A3','女','1989-02-03 00:00:00','182xxxx6567',NULL,3),(4,'A4','女','1993-02-03 00:00:00','182xxxx6579',NULL,2),(5,'A5','女','1992-02-03 00:00:00','182xxxx577',NULL,9),(6,'A6','女','1988-02-03 00:00:00','182xxxx6577',NULL,1),(7,'A7','女','1987-12-30 00:00:00','182xxxx6577',NULL,9),(8,'A8','女','1989-02-03 00:00:00','182xxxx6567',NULL,1),(9,'A9','女','1993-02-03 00:00:00','182xxxx579',NULL,9),(10,'A10','女','1992-02-03 00:00:00','182xxxx9577',NULL,4),(11,'A11','女','1993-02-03 00:00:00','182xxxx6579',NULL,9),(12,'A12','女','1992-02-03 00:00:00','182xxxx9577',NULL,1);
/*Table structure for table `boys` */DROP TABLE IF EXISTS `boys`;
CREATE TABLE `boys` ( `id` int(11) NOT NULL AUTO_INCREMENT, `boyName` varchar(20) DEFAULT NULL, `userCP` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
insert into `boys`(`id`,`boyName`,`userCP`) values (1,'B1',100),(2,'B2',800),(3,'B3',50),(4,'B4',300);

(以下存储过程语句均在cmd窗口中运行)

1.空参列表

#案例:插入到admin表中五条记录USE girls;SELECT * FROM admin;
DELIMITER $CREATE PROCEDURE myp1()BEGIN INSERT INTO admin(username,`password`) VALUES('join1','0000'),('join2','0001'), ('join3','0002'),('join4','0003'), ('join5','0004');END $
#调用CALL myp1()$

16-mysql基础-mysql中的存储过程


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

#案例一,创建存储过程,实现根据女生名查询对应的男对象信息CREATE PROCEDURE myp2(IN beautyName VARCHAR(20))BEGIN SELECT bo.* FROM boys bo RIGHT JOIN beauty b ON bo.id = b.boyfriend_id WHERE b.name = beautyName;END $
#调用CALL myp2('join2')$

16-mysql基础-mysql中的存储过程

#案例二:创建存储过程,实现判断用户是否登录成功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('join1','0001')$

16-mysql基础-mysql中的存储过程


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

#案例一:根据女生名,返回对应的男生对象名CREATE PROCEDURE myp4(IN beautyName VARCHAR(20), OUT boyName VARCHAR(20))BEGIN SELECT bo.boyName INTO boyName FROM boys bo INNER JOIN beauty b ON bo.id = b.boyfriend_id WHERE b.name = beautyName;END $
#调用SET @bName=''$  #定义用户变量接收输出CALL myp4('join1',@bName)$SELECT @bName$

16-mysql基础-mysql中的存储过程

16-mysql基础-mysql中的存储过程

16-mysql基础-mysql中的存储过程

#案例二:根据女生名,返回对应的男生对象名和魅值CREATE PROCEDURE myp5(IN beautyName VARCHAR(20), OUT boyName VARCHAR(20),OUT userCP INT)BEGIN SELECT bo.boyName,bo.userCP INTO boyName,userCP FROM boys bo INNER JOIN beauty b ON bo.id = b.boyfriend_id WHERE b.name=beautyName;END $
#调用CALL myp5('join1',@bName, @usercp)$ #用户变量可不用定义SELECT @bName,@usercp$

16-mysql基础-mysql中的存储过程

16-mysql基础-mysql中的存储过程


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

#案例一:传入a和b两个值,最终a和b都翻倍返回CREATE PROCEDURE myp6(INOUT a INT,INOUT b INT)BEGIN SET a=a*2; SET b=b*2;END $
#调用SET @v1=10$SET @v2=20$CALL myp6(@v1,@v2)$SELECT @v1,@v2$



  • 存储过程的删除

语法: DROP PROCEDURE 存储过程名注意:一次仅能删除一个存储过程

案例

DROP PROCEDURE p1;


  • 查看存储过程的信息

SHOW CREATE PROCEDURE 存储过程名;


小测试

# 创建存储过程实现传入一个日期,格式化成xx年xx月xx日并返回CREATE PROCEDURE test_pro4(IN mydate DATETIME, OUT strDate VARCHAR(50))BEGIN    SELECT DATE_FORMAT(mydate, '%Y年%m月%d日') INTO strDate;END $
# 调用CALL test_pro4(NOW(), @str)$
# 查看SELECT @str $













下期预告:mysql中的函数




如果你喜欢本文,
请长按二维码,关注 潭时录 .
转发至朋友圈,是对我最大的支持。

点个 在看 
喜欢是一种感觉
在看是一种支持
↘↘↘