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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

上列新增部门资料的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」来执行新增部门纪录资料,而且会记录执行后的结果:

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

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

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

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

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

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

mysql handlers,2 Handlers相关推荐

  1. Go 每日一库之 gorilla/handlers

    简介 上一篇文章中,我们介绍了 gorilla web 开发工具包中的路由管理库gorilla/mux,在文章最后我们介绍了如何使用中间件处理通用的逻辑.在日常 Go Web 开发中,开发者遇到了很多 ...

  2. ansible介绍、安装、远程执行命令、拷贝文件或目录、远程执行脚本、管理任务计划、安装包和管理服务、playbook、变量、循环、条件判断、handlers、安装nginx、管理配置文件

    24.15 ansible介绍 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系 ...

  3. Ansible批量安装mysql数据

    1.构建安装目录 mkdir -p /ansible/roles/mysql/{defaults,files,handlers,meta,tasks,templates,vars} defaults ...

  4. node mysql崩溃_Node出错导致运行崩溃的解决方案

    许多人都有这样一种映像,NodeJS比较快: 但是因为其是单线程,所以它不稳定,有点不安全,不适合处理复杂业务: 它比较适合对并发要求比较高,而且简单的业务场景. 在Express的作者的TJ Hol ...

  5. ansible 详解

    文章目录 一.ansible 简介 1.1 ansible 是什么? 1.2 ansible 特点 1.3 ansible 架构图 二.ansible 任务执行 2.1 ansible 任务执行模式 ...

  6. III 25 git

    自动化运维: 网络层(接入层.汇聚层.核心层): LB+HA(L4.L7): 服务层(reverse proxy cache.应用层.web层.SOA层.分布式层.DAL): 数据层(分布式缓存.No ...

  7. html5无意义标签,无意义的div和span标签

    HTML 元素是块级元素,它是可用于组合其他 HTML 元素的容器. 元素没有特定的含义.除此之外,由于它属于块级元素,浏览器会在其前后显示折行. 如果与 CSS 一同使用, 元素可用于对大的内容块设 ...

  8. Ansible:Ansibl项目生产环境快速布局

    Tips:与前文 <进击的 Ansible(一):Ansible 快速入门> 一样,本文使用的 Ansible 版本 2.5.4,项目演示环境 MacOS.由于 Ansible 项目开发活 ...

  9. Ansible中的playbook详解

    首先简单说明一下playbook,playbook是什么呢? 根本上说playbook和shell脚本没有任何的区别,playbook就像shell一样,也是把一堆的命令组合起来,然后加入对应条件判断 ...

最新文章

  1. 经典爬虫:用Scrapy爬取百度股票
  2. 腾讯AI Lab开源800万中文词的NLP数据集 | 资源
  3. Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货
  4. php 图片上传打印路径,php上传图片到指定位置路径保存到数据库的具体实现
  5. 智能家居(1)行业发展分析
  6. 高阶的Parser:可变运算优先级
  7. go TCP 粘包原理和解决方案
  8. 激光导航AGV的停车精度受环境变化的影响有多大?
  9. 【HTML 教程系列第 13 篇】HTML 中的超链接标签 a,看这一篇就够了
  10. java中的原型模式_原型模式(原型设计模式)详解
  11. 如何修改github博客主题
  12. Python 程序员需要知道的 30 个技巧
  13. Threejs实现模拟管道液体流动
  14. 网易2018年校招真题----堆棋子
  15. 阿里云轻量和云服务器ECS区别对比大全(很详细)
  16. 数字IC开发软件介绍
  17. barrier linux,Linux Barrier I/O 实现分析笔记
  18. 公式编辑神器-MathType
  19. PHPMyWind编辑器支持pdf自动上传
  20. 【测控电路】V/f转换器

热门文章

  1. 大数问题(一个特别大的数需要用数组或字符串来表示)
  2. python logger.debug_Python logger模块
  3. 深度网络模型裁剪和发布正规化
  4. 3DSlicer30:VS-Qt5VSaddin-qt4.8.7dev
  5. 以Delphi Package架构多人开发应用程序环境
  6. ASP.NET应用程序设计的10大技巧
  7. 多组测试数据(求和)IV
  8. 批处理以当前时间为文件名创建文件
  9. S5PV210开发 -- UART 详解
  10. DM368开发 -- 硬件认识