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()$
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')$
#案例二:创建存储过程,实现判断用户是否登录成功
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')$
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$
#案例二:根据女生名,返回对应的男生对象名和魅值
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$
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中的函数