Mysql学习笔记(020)-存储过程
#存储过程
1 #存储过程和函数 2 /* 3 存储过程和函数: 4 类似于java中的函数 5 好处: 6 1.提高代码的重用性 7 2.简化操作 8 9 */ 10 #存储过程 11 /* 12 含义:一组预先编译的sql语句的集合,理解成批处理语句 13 1.提高代码的重用性 14 2.简化操作 15 3.减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率 16 17 18 */ 19 20 #一、创建语法 21 22 CREATE PROCEDURE 存储过程名(参数列表) 23 BEGIN 24 存储过程体(一组合法有效的sql语句) 25 END 26 27 注意: 28 1、参数列表包含三部分 29 参数模式 参数名 参数类型 30 举例: 31 IN stuname VARCHAR(20) 32 33 参数模式: 34 in:该参数可以做输入,也就是说需要调用方传入值 35 out:该参数可以作为输出,也就是该参数可以作为返回值 36 inout:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值 37 38 2、如果存储过程体仅仅只有一句话,begin end可以省略 39 40 3、存储过程体中的每条sql语句的结尾要求必须加分号, 41 存储过程的结尾可以使用delmiter 重新设置 42 语法: 43 DELIMITER 结束标记; 44 案例: 45 DELIMITER $ 46 47 48 #二、调用语法 49 50 CALL 存储过程名(实参列表); 51 52 #1.空参列表 53 #案例:插入到admin表中五条记录 54 SELECT * FROM admin; 55 56 DELIMITER $ 57 CREATE PROCEDURE myp1() 58 BEGIN 59 INSERT INTO admin(username,`password`) VALUES('john1','0000'),('lily','0000'),('rose','0000'),('jack','0000'),('tom','0000'); 60 END $ 61 #命令行以上命令 62 63 #调用 64 CALL myp1()$ 65 SELECT * FROM admin; 66 67 #2、创建带in模式参数的存储过程 68 #案例1:创建存储过程实现 根据女神名,查询对应的男神嘻嘻 69 70 CREATE PROCEDURE myp2(IN beautyName VARCHAR(20)) 71 BEGIN 72 SELECT bo.* 73 FROM boys bo 74 RIGHT JOIN beauty b ON bo.id=b.boyfriend_id 75 WHERE b.name=beautyName 76 END $ 77 #调用 78 CALL myp2('柳岩')$ 79 80 #案例2:创建存储过程实现,用户是否登录成功 81 82 creat PROCEDURE myp3(IN username VARCHAR(20),IN PASSWORD VARCHAR(20)) 83 BEGIN 84 DECLARE result INT DEFAULT 0;#声明并初始化 85 SELECT COUNT(*) INTO result#赋值 86 FROM admin 87 WHERE admin.username = username 88 ADD admin.password= PASSWORD; 89 90 SELECT IF(result>0,'成功','失败');#使用 91 END $ 92 93 #调用 94 CALL myp3('张飞','8888')$ 95 96 #3、创建带out模式的存储过程 97 98 #案例1:根据女神名返回男神名 99 CREATE PROCEDURE myp5(INT beautyName VARCHAR(20),OUT boyName VARCHAR(20)) 100 BEGIN 101 SELECT bo.boyName INTO boyName 102 FROM boys bo 103 INNER JOIN beauty b ON bo.id = b.boyfriend_id 104 WHERE b.name=beautyName; 105 106 END$ 107 108 #调用 109 SET @bName$ 110 CALL myp5('小昭',@bname)$ 111 SELECT @bName$ 112 113 #案例2:根据女神名,返回对应的男神名和男神魅力值 114 115 CREATE PROCEDURE myp6(INT beautyName VARCHAR(2),OUT boyName VARCHAR(20),OUT boyName VARCHAR(20),OUT usercp INT) 116 BEGIN 117 SELECT bo.boyName,bo.usercp INTO boyName,usercp 118 FROM boys bo 119 INNER JOIN beauty b ON bo.id = b.boyfriend_id 120 WHERE b.name=beautyName; 121 END$ 122 123 #调用 124 CALL myp6('小昭',@bName,@usercp)$ 125 126 SELECT @bName,@usercp; 127 128 #4、创建带inout模式参数的存储过程 129 #案例1:传入a和b两个值,最终a和b翻倍并返回 130 131 creat PROCEDURE myp8(INOUT a INT,INOUT b INT) 132 BEGIN 133 SET a=a*2; 134 SET b=b*2; 135 END$ 136 137 #调用 138 SET @m=10$ 139 SET @n=20$ 140 CALL myp(@m,@n)$ 141 SELECT @m,@n$ 142 143 144 #二、删除存储过程 145 #语法:drop procedure 存储过程名#只能删除一个 146 DROP PROCEDURE p1; 147 148 #三、查看存储过程的信息 149 DESC myp2;#错误的 150 SHOW CREATE PROCEDURE myp2;#没法修改存储过程中的语句
案例讲解
#一、创建存储过程实现传入用户名和密码,插入到admin表中
CREATE PROCEDURE test_pro1(IN username VARCHAR(20),IN loginPwd VARCHAR(20))
BEGIN
INSERT INTO admin(admin.username,PASSWORD) VALUES(username,loginPwd);
END$
#二、创建存储过程或函数实现传入女神编号,返回女神名和女神电话
CREATE PROCEDURE test_pro2(IN id INT,OUT NAME VARCHAR(20),OUT phone VARCHAR(20))
BEGIN
SELECT b.name,b.phone INTO NAME,phone
FROM beauty b
WHERE b.id =id;
END$
#三、穿件存储过程或函数实现传入两个女神生日,返回大小
CREATE PROCEDURE test_pro3(INT birth1 DATETIME,INT birth2 DATETIME,OUT result INT)
BEGIN
SELECT DATEDIFF(birth1,birth2) INTO result;
END$
#四、创建存储过程或函数实现传入一个日期,格式化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 $
#五、创建存储过程或函数实现传入女神名,返回:女神 and 男神 格式的字符串
如传入:小昭
返回:小昭 AND 张无忌
DROP test_pr
CREATE PROCEDURE test_pro5(IN beautyName VARCHAR(20),OUT str VARCHAR(50))
BEGIN
SELECT CONCAT(beautyName,' and ',IFNULL(boyname,'null'))
FROM boys bo
RIGHT JOIN beauty b ON b.boyfriend_id = bo.id
WHERE b.name=beautyName;
END $
CALL test_pro5('小昭',@str)$
#六、创建存储过程或函数,根据传入的条目数和起始索引,查询beauty表的记录
CREATE PROCEDURE test_pro6(IN startIndex INT,IN size INT)
BEGIN
SELECT * FROM beauty LIMIT startIndex,size;
END $
CALL test_pro6(3,5)$
小结

浙公网安备 33010602011771号