-- 状态
-- 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语句运行出错,比如:外键约束这种错误报错
-- 后面的语句就不会运行了