学习目标:
1.理解什么是handler
2.掌握异常处理的流程
学习导航:
新知学习:
一、什么是异常?
执行SQL语句过程中,出现的各种错误。
二、如何处理异常:
定义在遇到问题时应当采取的处理方式,并保证存储过程或函数在遇到警告或错误时能继续执行,避免程序异常停止运行。1.**语法格式**
DECLARE 处理方式 HANDLER FOR 错误类型 处理语句;
--
例如:当前数据库中没有customer表,如要执行 select * from customer;就要报错误信息:
select * from customer ;
-- [SQL]select * from customer ;
-- [Err] 1146 - Table 'airticket.customer' doesn't exist
-- 存储过程或函数体中可以 定义异常处理
declare continue handler for 1146 begin 处理事件 end;
2.异常处理的三个要素:
(1)For 捕获的异常
(2)处理方案告诉相关模块
(3)捕获异常后 处理程序 exit|continue |undo尚未实现
三、解决添加数据过程中的异常问题:
定义一个存储过程,实现某用户新增一个订单并添加商品,默认数量为1. 调用时提供用户id,商品名称即可。
DROP PROCEDURE if EXISTS proc_1;
create PROCEDURE proc_1(u_id INT,goodsName varchar(50))
BEGIN
DECLARE o_code varchar(20); # 订单编码 格式 O+日期时间+1+oid
DECLARE o_id int; # 订单号
DECLARE order_time datetime; # 下单时间
DECLARE g_id int ; # 商品编号
DECLARE EXIT HANDLER FOR 1452
BEGIN
-- 给控制发送出错消息
SIGNAL SQLSTATE '45000' SET message_text = '外键参照失败';
end;
-- 生成一个订单insert orders(uid,ocode,ordertime)VALUES()
set order_time = NOW();
insert orders(uid,ocode,ordertime)VALUES(u_id,'',order_time);
SET o_id = LAST_INSERT_ID();
SET o_code = CONCAT('o',DATE_FORMAT(order_time,"%y%m%d%h%i%s"),'1',o_id );
-- 完善订单编码
UPDATE orders SET ocode = o_code where oid= o_id;
-- 添加一个订单详情
-- 查询商品编号
select gid into g_id from goods WHERE gname = goodsName;
-- 添加订单详情
INSERT ordersitem(oid,gid,inum) VALUES(O_id,g_id,1);
END;
-- 正常添加
CALL proc_1(3,'三星 500GB SSD固态硬盘 SATA3.0接口 ');
-- 用户110不存在,异常处理
CALL proc_1(110,'三星 500GB SSD固态硬盘 SATA3.0接口 ');