MySQL笔记: 错误处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
-- 状态
-- 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语句运行出错,比如:外键约束这种错误报错
-- 后面的语句就不会运行了
文章目录