mysql handlers,2 Handlers

在撰写stored routines时,MySQL提供一种很特别的宣告语法,你可以使用它宣告「handler」,handler用来处理stored routines中可能会发生的错误,让你可以针对发生的错误执行必要的补救工作,也可以防止stored routines因为发生错误而中止。首先要特别注意宣告「handler」的位置:

mysql_15_snap_03.png

Handler是用来处理错误用的,所以在宣告的时候,要设定处理的错误种类和决定后续的流程。下列是宣告handler的语法:

mysql_15_snap_04.png

Handler的宣告包含发生的错误时要执行的叙述,如果有多个叙述时,就一定要使用「BEGIN-END」区块,把这些叙述放在区块中:

mysql_15_snap_05.png

下列是一个新增部门资料的procedur,呼叫它的时候要提供部门编号、名称与地点三个参数,这个procedure会使用你的参数帮你新增一笔纪录到「cmdev.dept」表格中,新增后会显示「Success!」的讯息:

mysql_15_snap_06.png

下列是呼叫「cmdev.test_handler」procedure的范例:

mysql_15_snap_07.png

因为在「cmdev.dept」表格的定义中,部门编号「deptno」栏位设定为primary key,所以它的栏位值是不可以重复的。所以如果再执行一次上列呼叫「cmdev.test_handler」procedure的范例:

mysql_15_snap_08.png

在执行一个stored routine的过程中,如果发生任何错误,MySQL都会停止继续执行,再传回错误编号与错误讯息,告诉呼叫的人发生了什么状况:

mysql_15_snap_09.png

撰写stored routines处理资料库的工作,除了之前已经讨论过的许多好处外,使用handler来处理错误,让执行工作的过程可以更加顺利,也是使用stored routines的主要原因。

下列的范例同样是提供新增部门资料功能的procedure,不过为了希望发生索引值重复的错误时,不要因为错误而中断执行的工作,也不要传回错误编号与错误讯息,而是自己显示一个错误讯息,清楚的告诉使用者发生了什么状况。这样的需求就必须在procedure中加入handler的宣告。索引值重复的SQL state是「23000」,这个编号会使用在handler的宣告中:

mysql_13_snap_66.png

加入handler宣告的stored routines,在执行过程中如果没有发生任何问题,handler是没有任何作用的,stored routines会正常的执行完所有的叙述:

mysql_15_snap_11.png

呼叫加入handler的宣告的「cmdev.test_handler2」,如果没有发生任何问题,在新增部门纪录后会显示「Success!」的讯息:

mysql_15_snap_12.png

如果在执行过程中发生任何问题了,MySQL会使用发生的错误编号,与你在handler宣告中指定的错误执行比对的工作,如果一样的话,接下来就交由handler来处理这个错误,MySQL就不会中断执行与回传错误:

mysql_15_snap_13.png

呼叫加入handler的宣告的「cmdev.test_handler2」时,如果指定的部门编号在资料表中已经存在,执行新增的叙述时就会发生发生索引值重复的错误。这种错误的SQL state是「23000」,MySQL错误编号是「1062」:

mysql_15_snap_14.png

在宣告handler时,除了指定handler要处理哪一种错误外,还要根据自己的需求,决定处理错误以后的后续流程:

mysql_15_snap_15.png

一个宣告为「EXIT」的handler,在执行完handler包含的叙述以后,会离开handler所在的区块;而宣告为「CONTINUE」的handler,执行的流程会像这样:

mysql_15_snap_16.png

上列新增部门资料的procedure范例,根据新增纪录的结果,会显示「Success!」或「Error!」两种结果。如果希望不论新增纪录成功或发生问题,都要把结果储存到下列的「cmdev.deptlog」表格中: 栏位名称 型态 NULL 索引 预设值 其它资讯 说明

logno bigint(20) NO PRI NULL auto_increment 纪录编号

logdt timestamp NO CURRENT_TIMESTAMP 日期时间

message varchar(64) YES NULL 讯息

下列的范例使用「CONTINUE HANDLER」来执行新增部门纪录资料,而且会记录执行后的结果:

mysql_15_snap_17.png

呼叫「test_handler3」procedure后,如果没有发生任何问题,除了新增部门纪录外,还会新增一笔成功的讯息到「cmdev.deptlop」表格:

mysql_15_snap_18.png

如果新增部门纪录时发生错误,「CONTINUE HANDLER」会把「v_message」变数值设定为「Error!」,然后再新增一笔错误的讯息到「cmdev.deptlop」表格:

mysql_15_snap_19.png

下列的范例是呼叫「test_handler3」procedure后,纪录在「cmdev.deptlop」表格中的结果:

mysql_15_snap_20.png

索引值重复与不允许NULL值的错误,都是属于SQL state中的「23000」,如果你想要分别处理这两种错误的话,你可以针对每一种错误,宣告不同的handler来处理,不过在指定错误时,就要使用MySQL错误编号:

mysql_15_snap_21.png

下列的范例是呼叫「test_handler4」procedure后,纪录在「cmdev.deptlop」表格中的结果:

mysql_15_snap_22.png

在宣告handler时指定的错误情况有下列几种:

mysql_15_snap_23.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值