11、存储过程
11.1 存储过程的格式
CREATE PROCEDURE p1()
BEGIN
END
格式:
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(合法有效的SQL语句)
END
注意点:
1、参数列表 包含3个部分 参数模式 参数名 参数类型 ( IN username VARCHAR(20))
参数模式(作用)
IN 表示该参数作为输入,该参数调用的时候传入值
OUT 该参数作为输出,就是返回值
INOUT 既可以当做输入,又可以当做输出,表示的需要传入,也可以输出
2、BEGIN END ,如果存储过程只有一条语句,可以省略
3、关于结束符
存储过程体的每一条SQL语句都需要是合法有效的,一定要加;
存储过程的结尾需要重新声明结束符
DELIMITER 结束符
4、调用的时候,需要CALL 存储过程名()
11.2 关于存储过程中参数的问题
11.2.1 参数可以为空值
DELIMITER $
CREATE PROCEDURE p1()
BEGIN
INSERT INTO brand(brandename)
VALUES('lv'),
('哇哈哈'),
('雪碧'),
('coco');
END$
注意点:
当前存储过程中,没有参数
11.2.2 参数模式为in—单个参数
#根据传入的brande_id查找对应的品牌的名字
CREATE PROCEDURE p2(IN brandeid INT)
BEGIN
SELECT * FROM brand WHERE brand.id=brandeid;
END$
CALL p2(2)
注意点:
1、参数模式 参数名 参数的数据类型
2、调用的过程中,call 存储过程的名字(填写参数)
11.2.3 参数模式为in—多个参数
请利用存储过程,存储多个品牌
CREATE PROCEDURE p3(IN b1 VARCHAR(10),IN b2 VARCHAR(10))
BEGIN
INSERT INTO brand VALUES(0,b1),(0,b2);
END$
CALL p3('百事可乐','可口可乐')
注意点:
1、如果存在多个数据,用','隔开
2、注意调用过程中的参数个数
# 请根据用户传入的用户名和密码,检查登录状态(成功,失败)
DELIMITER $
CREATE PROCEDURE p4(IN username VARCHAR(20),IN upassword VARCHAR(20))
BEGIN
# 声明一个自定义的变量
DECLARE result INT DEFAULT 0;
SELECT COUNT(*) INTO result
FROM userinfo
WHERE userinfo.`name`=username
AND userinfo.`password`=upassword;
# if 语句的使用
SELECT IF(result>0,'成功','失败');
END$
CALL p4('二毛','22')
注意点:
1、声明一个自定义的变量
declare 变量名 数据类型
11.2.4 参数out
根据品牌的名称,返回商品的名称
DELIMITER $
CREATE PROCEDURE p5(IN brandname VARCHAR(20),OUT goodsname VARCHAR(20))
BEGIN
SELECT
goods.`name` INTO goodsname
FROM goods INNER JOIN brand
ON goods.`brande_id`=brand.`id`
WHERE brand.`brandename`=brandname;
END
CALL p5('大润发',@bname)
SELECT @bname
11.2.5 参数inout
INOUT
传入两个数据,将数据翻倍输出
DELIMITER $
CREATE PROCEDURE newp8(INOUT a INT,INOUT b INT)
BEGIN
SET a = a*2;
SET b = b*2;
END$
SET @m=1$
SET @n=2$
SELECT @m
SELECT @n
CALL newp8(@m,@n)
`
11.3查看和删除存储过程
查看:show create procedure 存储名;
删除:drop procedure 存储名;