https://blog.csdn.net/Olivia_Vang/article/details/100583102?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ECtr-2-100583102-blog-125577361.235%5Ev43%5Epc_blog_bottom_relevance_base9&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ECtr-2-100583102-blog-125577361.235%5Ev43%5Epc_blog_bottom_relevance_base9&utm_relevant_index=5

学习目标:

1.理解什么是handler

2.掌握异常处理的流程

学习导航:

画板

新知学习:

一、什么是异常?

执行SQL语句过程中,出现的各种错误。

二、如何处理异常:

定义在遇到问题时应当采取的处理方式,并保证存储过程或函数在遇到警告或错误时能继续执行,避免程序异常停止运行。

1.**语法格式**

  1. DECLARE 处理方式 HANDLER FOR 错误类型 处理语句;
  2. --

例如:当前数据库中没有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接口 ');

学习小结: