--- title: MySQL笔记: 错误处理 date: 2017-04-28 21:40:00 updated: 2017-04-28 21:40:00 description: "错误处理" categories: [个人笔记] tags: [MySQL, MySQL笔记] --- ```sql -- 状态 -- 0 插入成功 -- -1 选课失败,已选择 -- -2 选课失败,课程已达到人数上限 -- -3 选课失败,课程未审核 -- 插入时要判断的条件: -- 未选择过该课程,否则返回 -1 -- 课程是审核过的,否则返回 -3 -- 课程人数未满, 否则返回 -2 UPDATE course SET available = 0 WHERE course_no = 2; -- 先把2课程可用人数设置为0 SET @state = 0; CALL choose_proc('2013003',2,@state); -- -2 人数已满 SELECT @state,@state2; SET @state = 0; CALL choose_proc('2013003',3,@state); -- -1 已选择过 SELECT @state; SET @state = 0; CALL choose_proc('2013003',4,@state); -- -3 未审核 SELECT @state; SELECT * FROM choose WHERE student_no = '2013003'; -- 自定义错误处理 -- 错误码: 1452 格式: DECLARE 错误处理类型 HANDLER FOR 错误触发条件 自定义错误处理程序 错误处理类型: 1 CONTINUE 2 EXIT 错误触发条件:错误码 DROP PROCEDURE choose_proc; DELIMITER $$ CREATE PROCEDURE choose_proc(IN stu_no VARCHAR(20),IN c_no VARCHAR(20),OUT state INT) MODIFIES SQL DATA BEGIN DECLARE s1 INT; DECLARE s2 VARCHAR(6); DECLARE s3 INT; DECLARE CONTINUE HANDLER FOR 1452 BEGIN SET @errorInfo = '外键约束错误'; END; -- 1. 查询有没有选择过 SELECT COUNT(*) INTO s1 FROM choose WHERE student_no = stu_no AND course_no = c_no; IF(s1 >= 1) THEN SET state = -1; ELSE -- 2. 查询课程是不是已审核的 SELECT STATUS INTO s2 FROM course WHERE course_no = c_no; IF (s2 = '已审核') THEN -- 3. 查询课程是不是人数未满的 SELECT available INTO s3 FROM course WHERE course_no = c_no; IF(s3 >0 ) THEN SET state = 0; -- 插入 INSERT INTO choose VALUES(NULL,stu_no,c_no,NULL,NOW()); -- 这里出的错 -- 如果没有自定义错误处理 下面代码不运行了 SET @state2 = '这里有没有运行?'; ELSE SET state = -2; END IF; ELSE SET state = -3; END IF; END IF; END $$ DELIMITER ; -- 用以下语句测试 SET @state = 0; SET @state2 = ''; SET @errorInfo = ''; CALL choose_proc('2014010',1,@state); SELECT @state,@state2,@errorInfo; -- 在存储过程中,如果sql语句运行出错,比如:外键约束这种错误报错 -- 后面的语句就不会运行了 ```