自定义错误处理程序时,需使用declare关键字,格式如下:
(资料图片)
declare 错误处理类型 handler for 错误触发条件 自定义错误处理程序;
其中,错误处理类型:continue exit;
错误触发条件:预定义、MySQL错误代码、自定义错误触发条件、ANSI标准错误代码
自定义错误处理程序位置: 变量、游标声明之后,但是在语句执行之前;
该触发包括: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);
我们向课程表 执行一条插入失败命令;注意,此前我们的 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");
还是使用上面的例子,只是替换了一句declare:
declare exit handler for 1062#将上面这句替换为下面declare exit handler for sqlstate "23000"
语法为:
declare 错误触发条件 condition for 错误代码;
还是上面例子,替换为:
declare exit handler for 1062#将上面这句替换为下面:declare unique_error condition for 1062;declare exit handler for unique_error
那么是否可以一个存储过程处理多个错误程序呢?当然可以;比如这个例子,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");
X 关闭
Copyright © 2015-2022 中公纸业网版权所有 备案号:沪ICP备2022005074号-18 联系邮箱:5855973@qq.com