14. 错误处理

-- 状态
-- 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语句运行出错,比如:外键约束这种错误报错
-- 后面的语句就不会运行了
posted @ 2017-08-25 08:24  ~~晴天~^.^  阅读(142)  评论(0编辑  收藏  举报