天天观热点:17)错误处理
时间:2023-06-02 01:12:25 来源:博客园
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");
标签:
最新文章推荐
- 天天观热点:17)错误处理
- 科技赋能“晋电外送” 环球视讯
- 比亚迪5月销量超24万,同比增长109.4%|全球今亮点
- 普通快递的流程_普通快递
- LV于6月1日涨价,部分涨幅超11%
- 天天时讯:日本强推核污染水排海遭多方反对 业内人士:政府在做危险的事情
- 乔家大院景区介绍_乔家大院景区 焦点关注
- 韩赴日核污染水排海考察团公布考察结果 引社会各界不满 环球要闻
- 全球快资讯丨“六一”国际儿童节北京举办庆祝活动丰富多彩
- 超全!2023绍兴拆迁计划进度表来了…这几个村开始登记、丈量 天天最新
- 环球速递!月活超3亿的B站瞄准消费金融,已对接多个助贷平台
- 观澜亭|孩子的节日,做最好的“减法”_世界时快讯
- 焦点简讯:欧联决赛-布努两次扑点 塞维利亚点球大战5-2罗马夺冠
- 联合光电股东户数减少64户,户均持股16.76万元
- 动态焦点:库克跑了,马斯克来了!特斯拉联手中国打造第二个苹果?
- 重庆市2023年养老金上调方案及补发时间最新消息 重庆市养老金2023年上涨多少_世界视点
- 世界快报:“微实事”点亮“微心愿”——六安市裕安区开展“六一”圆梦活动
- 上合组织秘书长张明考察洛川苹果产业
- 最资讯丨日本投3.5万亿日元“抢救”少子化,被问“钱从哪来?”
- 当前观察:百万粉撬动千万销售额!美妆段子手如何戳中消费者需求?
X 关闭
资讯中心

2022-09-16
新疆(含兵团)15日新增本土无症状感染者1例
2021-10-18

2021-10-18

2021-10-18
X 关闭