为什么使用存储过程
存储过程可以带参数,也可以返回结果
可以包含数据操纵语句、变量、逻辑控制语句等。
存储过程的优点:
- 执行速度更快
- 允许模块化程序设计
- 提高系统安全性
- 减少网络流通量
存储过程语法
创建存储过程
CREATE PROCEDURE
存储过程名( 参数1,参数2… )
[存储过程选项]
Begin
Sql语句
…
End
创建存储过程usp_pname:查询某个产品的供应商姓名、供应商地址、邮政编码,产品名称,产品价格
CREATE PROCEDURE usp_pname()
BEGIN
SELECT DISTINCT vname,vaddress,vzip,pname,pprice FROM product INNER JOIN recruit
ON recruit.pid=product.pid INNER JOIN vendor
ON recruit.vid=vendor.vid ;
END
调用存储过程
CALL 存储过程名称( 参数1,参数2... );
CALL usp_pname('小米Note2');
删除存储过程
DROP PROCEDURE 存储过程名;
DROP PROCEDURE usp_pname;
存储过程的参数
• 和Java语言的方法一样,参数可选
• 参数分为输入参数、输出参数 、输入输出参数
• 输入参数允许有默认值
存储过程的参数分三种:
输入参数
输出参数
输入输出参数
输入参数(in):
向存储过程传入值
CREATE PROCEDURE usp_pname(in name VARCHAR(20))
BEGIN
SELECT DISTINCT vname,vaddress,vzip,pname,pprice FROM product INNER JOIN recruit
ON recruit.pid=product.pid INNER JOIN vendor
ON recruit.vid=vendor.vid WHERE pname=name;
END
CALL usp_pname('小米Note2');
输出参数(out):
调用存储过程后,传出执行结果
创建查找指定科目的最高分 输入参数科目,输出参数分数
CREATE PROCEDURE usp_maxScore(IN suname VARCHAR(10),OUT maxSc INT)
BEGIN
-- 查询指定科目的最高分
SELECT MAX(socre) FROM score INNER JOIN `subject` ON score.subid=`subject`.subid
WHERE subname=suname INTO maxSc;
-- 把查询的结果赋值给maxSc
END
-- 成员变量 语法: @变量名 @max
CALL usp_maxScore('MySQL',@max);
-- 查询最高分
SELECT @max;
输入输出参数(inout):
把数据传递给存储过程和将存储过程的返回值传递给外部使用者
CREATE PROCEDURE usp_age(INOUT age INT)
BEGIN
SET age=age+10;
END
-- 定一个变量
SET @age=10;
CALL usp_age(@age);
SELECT @age;
存储过程变量
常用的存储过程变量分为两种:用户变量和局部变量。
(1)用户变量:用户定义的变量就叫用户变量,以"@“开始,形式为”@变量名"。用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效
(2)局部变量:作用范围在begin到end语句块之间。在该语句块里设置的变量。declare语句专门用于定义局部变量。 DECLARE
变量名 [,…] 变量类型[DEFAULT value]
变量之间的区别
局部变量与用户变量的区分在于两点:
用户变量是以"@"开头的。局部变量没有这个符号。 定义变量不同,局部变量使用declare语句定义 。
作用范围。局部变量只在begin-end语句块之间有效。在begin-end语句块运行完之后,局部变量就消失了。
变量赋值
SET 变量名=expr[va_name=expr]...
局部变量
set t1=0;
用户变量
SET @t1=0;
SELECT @t1=0;
变量赋值,SELECT语句
SELECT ... INTO语句
SELECT col_name[,...] INTO var_name[,...] table_expr
存储过程管理
描述 | 格式 |
---|---|
查看存储过程定义 | SHOW PROCEDURE STATUS; |
查看指定存储过程定义 | SHOW CREATE PROCEDURE 存储过程名称 |
调用存储过程 | CREATE PROCEDURE 存储过程名称(参数); |
删除存储过程 | DROP PROCEDURE 存储过程名; |
流程控制语句
MySQL流程控制语句有以下几种:
顺序结构控制语句:BENGIN…END语句。
分支结构控制语句:IF-ELSE和CASE-END语句。
循环结构控制语句:WHILE语句。
IF-ELSE
IF 条件 THEN 输出结果
[ELSE IF 条件 THEN 输出结果 ...
[ELSE 输出结果 ]
END IF
mysql平均分,大于60分,成绩优秀
CREATE PROCEDURE usp_avgScore()
BEGIN
DECLARE str1 VARCHAR(20);
-- 查询平均成绩
SELECT AVG(socre) FROM score INNER JOIN `subject` ON score.subid=`subject`.subid
WHERE subname='MySQL' INTO @avgScore;
-- 判断
IF @avgScore>60 THEN
SET str1='成绩优秀';
ELSE
set str1='成绩差';
END IF;
SELECT str1 AS 结果;
END
CALL usp_avgScore();
CASE-END
CASE case_value
WHEN 条件1 THEN 结果1
[WHEN 条件2 THEN 条件2] ...
[ELSE 其他结果1]
END CASE
CREATE PROCEDURE usp_bonus(IN bonus INT)
BEGIN
DECLARE str VARCHAR(30);
CASE bonus
WHEN 500 THEN SET str='真少';
WHEN 2000 THEN SET str='给点力';
WHEN 10000 THEN SET str='够嗨皮的了';
ELSE SET str='真好';
END CASE;
SELECT str;
END
CALL usp_bonus(500);
WHILE语句
WHILE 条件 DO
sql语句
END WHILE
使用循环显示1-10之间的奇数
CREATE PROCEDURE even()
BEGIN
DECLARE num INT;
SET num=1;
WHILE num<=10 DO
SELECT num;
SET num=num+2;
END WHILE;
END
CALL even();