mysql-存储过程

假如想象 提交于 2020-03-03 06:39:32

存储过程和函数

含义:一组预先编译好的SQL语句集合
好处:
1、提高代码的重用性
2、简化操作
2、减少编译次数和与数据库服务器得到连接次数,提高效率

一、创建语法

CREATE PROCEDURE 存储过程名称(参数列表)
BEGIN
存储过程体(一组合法的SQL语句)
END

注意:
1、参数列表包含三部分
参数模式 参数名 参数类型
例如:IN stuname VARCHAR(20)

参数模式
IN:所修饰参数可作为输入,也就是该参数需要调用方传入
OUT:所修饰参数作为输出,也就是该参数可作为返回值
INOUT:所修饰参数既可以作为输入又可以作为输出,也就是需要传入值,有可以返回

2、如果存储过程体仅仅只有一句话,BEGIN END 可以省略
-存储过程体中的每条SQL语句结尾必须加分号
-存储过程的结尾可以使用DELIMITER重新设置
语法:DELIMITER 结束标记 -如:DELIMITER $

二、调用语法

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

USE girls;

示例:

# 1、【空参列表】案例:插入到admin表中五条记录
以下语句在CMD中执行
SELECT * FROM admin;

DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
	INSERT INTO admin(username,PASSWORD) 
	VALUES('john1','0000'),('rose','1234'),('lily','0987'),('bob','2345'),('lucy','9878');

END $


# 调用
CALL myp1()$

# 查看
SELECT * FROM admin$
以 $ 代替分号结尾

在这里插入图片描述

# 案例2:创建带in模式的存储过程
# 根据女神名,查询对应的男朋友信息【in】

CREATE PROCEDURE myp2(IN beautyname VARCHAR(20))
BEGIN
	SELECT b.*
	FROM boys b
	RIGHT OUTER JOIN beauty g
	ON b.id=g.boyfriend_id
	WHERE g.name=beautyname;
	
END $

# 调用
CALL myp2('柳岩')$

# 出现Increect string value :'\\\'error时,改变字符集
SET NAMES bgk$

在这里插入图片描述
在这里插入图片描述

# 案例3:创建存储过程,实现用户是否登录成功【两个in】
# admin中用户名和密码两个参数
CREATE PROCEDURE myp4(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
BEGIN
	DECLARE result INT DEFAULT '';  # 声明并初始化
	SELECT COUNT(*) intoresult  # 赋值
	FROM admin a
	WHERE a.username = username
	AND a.password = PASSWORD;
	
	SELECT IF(result>0,'成功','失败'); # 使用
END $
# 如果没有加a.,按就近原则,username和password表示传入的两个值

# 调用
CALL myp4('john','8888')$

在这里插入图片描述

# 案例4:根据女神名,返回对应的男神名【in out】

CREATE PROCEDURE myp5(IN girlname VARCHAR(20),OUT boyname VARCHAR(20))
BEGIN
	SELECT b.boyName INTO boyname
	FROM beauty g
	LEFT OUTER JOIN boys b
	ON b.id=g.boyfriend_id
	WHERE g.name=girlname;
END $

SET @boyname$  # 定义用户名称,或不定义,直接在下面写@boyname
CALL myp5('双儿',@boyname)$
# 查看
SELECT@boyname$

在这里插入图片描述

# 案例5:根据女神名,返回对应的男神名及魅力值【in out out】
CREATE PROCEDURE myp6(IN girlname VARCHAR(20),OUT boyname VARCHAR(20),OUT userCP INT)
BEGIN
	SELECT b.boyName,b.userCP INTO boyname, userCP
	FROM beauty g
	LEFT OUTER JOIN boys b
	ON b.id=g.boyfriend_id
	WHERE g.name=girlname;
END $

CALL myp6('王语嫣',@boyname,@usercp)$
SELECT @boyname,@usercp$

在这里插入图片描述

# 案例6:传入a b两个值,要求两个值翻倍并返回【inout】
CREATE PROCEDURE myp7(INOUT a INT, INOUT b INT)
BEGIN
	SET a=a*2;
	SET b=b*2;
END $

SET @m=10;  # 定义用户变量
SET @n=8;
CALL myp7(@m,@n)$  # 调用
SELECT @m,@n$  # 查看

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!