17)错误处理
declare关键字:
自定义错误处理程序时,需使用declare关键字,格式如下:
declare 错误处理类型 handler for 错误触发条件 自定义错误处理程序;
其中,错误处理类型:continue exit;
错误触发条件:预定义、MySQL错误代码、自定义错误触发条件、ANSI标准错误代码
自定义错误处理程序位置: 变量、游标声明之后,但是在语句执行之前;
1)采用预定义的触发条件:
该触发包括:sqlwarning、sqlexception、not found;
设计一个输出给定学号的姓名;没有学号的输出 ‘没有学号为 的学生’;
delimiter $$ create procedure get_name_proc(in stu_no char(11), out stu_name char(10)) begin declare exit handler for not found begin select concat('没有学号为',stu_no,'的学生 ') error; end; select student_name into stu_name from student where student_no=stu_no; end; $$ delimiter ;
测试:可以看到对于没有学号的,输出符合预期;
set @stu_name = ''; call get_name_proc('2023001',@stu_name);
select @stu_name;
call get_name_proc('2023009',@stu_name);

2)使用MySQL错误处理代码
我们向课程表 执行一条插入失败命令;注意,此前我们的 teacher_no 已经是unique约束的;

唯一约束的 MySQL错误处理代码是1062;23000是对应的ANSI编号;
我们可以设计一个向课程表中插入新项 的过程,但是该项中的教师 已经开设了一门课,提示错误;
delimiter $$ create procedure insert_course_proc(in c_name char(10),in cnt int,in des varchar(100),in tea_no char(10)) begin declare exit handler for 1062 begin select '该教师已经提交了一门选修课!' error; end; insert into course(course_name,up_limit,description,teacher_no) values(c_name,cnt,des,tea_no); end; $$ delimiter ;
测试:
call insert_course_proc('java',150,'暂无','001');

3)使用ANSI标准错误代码
还是使用上面的例子,只是替换了一句declare:
declare exit handler for 1062 #将上面这句替换为下面 declare exit handler for sqlstate '23000'


4)自定义错误触发条件
语法为:
declare 错误触发条件 condition for 错误代码;
还是上面例子,替换为:
declare exit handler for 1062 #将上面这句替换为下面: declare unique_error condition for 1062; declare exit handler for unique_error


5)捕获多个错误处理程序
那么是否可以一个存储过程处理多个错误程序呢?当然可以;比如这个例子,teacher_no 不仅可能会违反唯一约束,还有可能违反外键约束;

可以看出违反外键约束 的MySQL错误处理代码是 1452;
由此,我们设计一个 违反外键约束和唯一约束 的错误处理过程:
delimiter $$ create procedure insert_course4_proc(in c_name char(10),in cnt int,in des varchar(100),in tea_no char(10)) begin declare exit handler for 1452 select '该教师不存在!' error; declare exit handler for 1062 begin select '该教师已经提交了一门选修课!' error; end; insert into course(course_name,up_limit,description,teacher_no) values(c_name,cnt,des,tea_no); end; $$ delimiter ; #测试 call insert_course4_proc('java',150,'暂无','009'); call insert_course4_proc('java',150,'暂无','001');

浙公网安备 33010602011771号