赞
踩
概念:使用多条语句完成业务的操作。简单的定义存储过程就是多条SQL的集合。
特点:
- Create PROCEDURE 存储过程名称 (参数列表)
- begin过程体
- end;
IN
输入IN var1 Declmal(6,2)
OUT
输出IN var2 Decimal(6,2)
INOUT
输入输出IN var3 Decimal(6,2)
declare 变量名称 变量类型 [default value]
call 存储过程名称
DROP PROCEDURE 存储过程名称
使用 set
和 select into
语句为变量赋值
- set @var := 20
- select sum(price) into total from table_name
if
语句- f 条件 then表达式
- [elseif 条件 then表达式]
- ...
- [else表达式]
- end if;
case
语句- CASE 值 WHTN 匹配值 THEN 结果
- [WHEN 匹配值 THEN 结果]
- ......
- [ELSE 结果]
- END
while
语句- [开始标签:]while 条件 do循环体
- [结尾标签]
- end while;
loop
语句- [开始标签:] loop
- 语句体
- [结尾标签]
- end loop;
iterate/leave
语句通过标签可以实现:
iterate
表示迭代leave
表示离开repeat
语句- repeat
- --循环体
- until 循环条件
- end repeat;
知识点:如果用命令行学习,在写多行SQL时 使用 //
可实现换行。
准备张表order_detail
并插入几条数据
- CREATE TABLE `order_detail` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`detail_name` varchar(255) DEFAULT NULL COMMENT '订单明细',`price` decimal(10,2) DEFAULT NULL COMMENT '价格',`oid` int(11) DEFAULT NULL COMMENT '订单id',PRIMARY KEY (`id`)
- )
- CREATE PROCEDURE slelect_detail ( ) BEGIN
- SELECTdetail_name
- FROMorder_detail;
- END;
CALL slelect_detail ( );
此时就会打印内容:
删除存储过程
DROP PROCEDURE slelect_detail;
oid
为动态的所有订单明细名称,考虑到oid
为动态,需要用户输入,故将oid
作为入参:- CREATE PROCEDURE slelect_detail ( IN order_id INT ) BEGIN
- SELECTdetail_name
- FROMorder_detail
- WHEREoid = order_id;
- END;
oid
为1的用户的订单明细名称call slelect_detail(1);
DROP PROCEDURE slelect_detail;
id
为order_id
,输出总金额为total
- CREATE PROCEDURE slelect_toatal_money ( IN order_id INT, OUT total DECIMAL ( 8, 2 ) )
- BEGIN
- SELECTsum( price ) INTO total
- FROMorder_detail
- WHEREoid = order_id;
- END;
CALL slelect_toatal_money ( 1, @total );
order_id
为1总金额示例SELECT @total;
drop PROCEDURE slelect_toatal_money;
if
语句示例使用控制流程,实现复杂的存储过程。
对输入的order_id
自动加5
,然后判断var
是否小于7
,如果是就查询订单明细价格,否则查询订单明细价格总和:
- create procedure slelect_toatal_money(IN order_id INT)
- begin
- -- 定义变量
- declare var int;
- -- 赋值
- set var= order_id+5;
- -- if 判断
- if var<7 then
- select price from oder_detail where oid = order_id;
- else
- select sum(price) from oder_detail where oid = order_id;
- end if;
- end;
CALL slelect_toatal_money(1);
查询结果:
调用
CALL slelect_toatal_money(2);
知识点:
loop
、while
、repeat
、iterate
都是循环 loop
、while
、repeat
功能几乎相同 iterate
可通过标签的形式调用循环,与leave
语句使用方式一样
CALL slelect_toatal_money(1);
结果 会出现 2组相同 结果:
- CREATE PROCEDURE slelect_toatal_money(IN order_id INt)
- BEGIN-- 定义变量DECLARE var INT;-- 赋值SET var = order_id + 5;-- repeat循环REPEATSELECT price FROM order_detail WHERE oid = order_id;SET var = var + 1;UNTIL var > 7END REPEAT;
- END;
调用示例
repeat
repest
与while
不同之处:while
在执行之前检查条件;repest
在执行之后检查条件:
CALL slelect_toatal_money(2);
结果:
CALL slelect_toatal_money(1);
结果会输出 3组结果:
调用示例
- CREATE PROCEDURE slelect_toatal_money(IN order_id INT)
- BEGIN-- 定义变量DECLARE var INT;-- 赋值SET var := order_id;-- loopselect_loop : LOOPSELECT price + var FROM order_detail WHERE oid = order_id;SET var = var + 1;-- 跳出循环IF var > 3 THENLEAVE select_loop;END IF;END loop;
- END;
调用示例
loop
语句如果var
小于3就计算 价格+var
的值
CALL slelect_toatal_money(2);
结果:
call slelect_toatal_money(1);
结果:
调用示例
- CREATE PROCEDURE slelect_toatal_money(IN order_id INT)
- BEGIN
- -- 定义变量
- DECLARE var INT;
- -- 赋值
- SET var := order_id;
- -- case 判匹配
- CASE var
- WHEN 1 THENSELECT price FROM order_detail WHERE oid = order_id;
- WHEN 2 THENSELECT SUM(price) FROM order_detail WHERE oid = order_id;END CASE;
- END;
调用示例
case
语句示例下边语句实现的效果与上面if
语句实现效果一致:
CALL slelect_toatal_money ( 1 );
输出:
- CREATE PROCEDURE slelect_toatal_money(IN order_id INT)
- BEGIN
- -- 定义变量
- DECLARE var INT;
- -- 赋值
- SET var = order_id + 5;
- -- while
- while var < 7 DOSELECT price FROM order_detail WHERE oid = order_id;SET var = var + 1;END WHILE;
- END;
调用示例
DROP PROCEDURE slelect_toatal_money;
while
语句示例对 变量var
进行判断,如果var
<7就指向查询价格语句,并且var
进行自增
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。