企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
转载自:https://blog.csdn.net/weixin_42364301/article/details/113441294 **** **1. 什么是处理程序** 处理程序可以预测程序执行过程中可能出现的问题,并给出相应的解决办法。 <br/> **2. 定义处理程序的语法** ```sql DECLARE handler_type HANDLER FOR condtion_value[,...] sp_statement - handler_type:错误处理方式,有3个可选则 - CONTINUE:表示遇到错误不处理,继续执行 - EXIT:表示遇到错误马上退出 - UNDO:表示遇到错误后,撤销之前的所有操作,MysqL中,暂时不支持这样的操作 - sp_statement:遇到错误后需要执行的存储过程 - condition_value:错误类型,有6个可选值 - SQLSTATE sqlstate_value:包含5个字符的字符串错误值 - condition_name:自定义的错误条件名称 - sqlWARNING:匹配所有以01开头的sqlSTATE错误代码 - NOT FOUND:匹配所有以02开头的sqlSTATE错误代码 - sqlEXCEPTION:匹配所有没有被sqlWARNING或NOT FOUND捕获的sqlSTATE错误代码 - MysqL_error_code:匹配数值类型错误代码 ``` <br/> **3. 6种错误类型的处理程序** ```sql # SQLSTATE value_ # 如果遇到value_值为42S02,则执行CONTINUE操作,并定义一个用户变量@info DECLARE CONTINUE HANDLER FOR sqlSTATE '42S02' SET @info='NO_SUCH_TABLE'; # MysqL_error_code # 如果遇到MysqL_error_code值为1146,则执行CONTINUE操作,并定义一个用户变量@info DECLARE CONTINUE HANDLER FOR 1146 SET @info='NO_SUCH_TABLE'; # condition_name # 先定义条件,然后再调用条件 # 这里先定义no_such_table条件,遇到1146错误,就执行CONTINUE操作 DECLARE no_such_table CONDITION FOR 1146; DECLARE CONTINUE HANDLER FOR no_such_table SET @info='ERROR'; # sqlWARNING # 捕获所有以01开头的错误代码,然后执行EXIT操作,并定义一个用户变量@info DECLARE EXIT HANDLER FOR sqlWARNING SET @info='ERROR'; # NOT FOUND # 捕获所有以02开头错误代码,然后执行EXIT操作,并定义一个用户变量@info DECLARE EXIT HANDLER FOR NOT FOUND SET @info='NO_SUCH_TABLE'; # sqlEXCEPTION # 捕获所有没有被sqlWARNING或NOT FOUND捕获的错误代码,然后执行EXIT操作,并定义一个用户变量@info DECLARE EXIT HANDLER FOR sqlEXCEPTION SET @info='ERROR'; ``` <br/> **4. 演示** ```sql mysql> delimiter $ mysql> create procedure handler() -> begin -> declare continue handler for sqlstate '23000' set @result='0'; -> -- id为1的键已存在,所以这里会报错 -> insert into account values(1, '赵六', 'zhaoliu'); -> set @result = '1'; -> insert into account values(4, '田七', 'tianqi'); -> set @result = '2'; -> end $ mysql> call handler() $ # 等于2,说明遇到错误了还是继续往下执行 mysql> select @result $ +---------+ | @result | +---------+ | 2 | +---------+ ```