最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

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");

关键词: