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()BEGININSERT 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))BEGINSELECT bo.*FROM boys boRIGHT JOIN beauty b ON bo.id = b.boyfriend_idWHERE b.name = beautyName;END $#调用CALL myp2('join2')$
#案例二:创建存储过程,实现判断用户是否登录成功CREATE PROCEDURE myp3(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))BEGINDECLARE result INT DEFAULT 0; #声明并初始化SELECT COUNT(*) INTO result #赋值FROM adminWHERE admin.username = usernameAND 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))BEGINSELECT bo.boyName INTO boyNameFROM boys boINNER JOIN beauty b ON bo.id = b.boyfriend_idWHERE 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)BEGINSELECT bo.boyName,bo.userCP INTO boyName,userCPFROM boys boINNER JOIN beauty b ON bo.id = b.boyfriend_idWHERE 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)BEGINSET 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))BEGINSELECT DATE_FORMAT(mydate, '%Y年%m月%d日') INTO strDate;END $# 调用CALL test_pro4(NOW(), @str)$# 查看SELECT @str $
下期预告:mysql中的函数
