MySQL存储过程的“异常处理”

  

问:何为异常?

答:程序在执行过程中有可能出错,运行时错误叫做异常。

默认情况下,当存储过程运行出错时,过程会立即终止,并打印系统错误消息。

,

实验环境:

 MySQL存储过程的“异常处理

 mysql> use 网球
  Reading  table 方式、for  completion  of  table 以及column 名字
  你还要turn  off 却;能够feature 用get  a  quicker  startup  with  a
  
  Database 改变了
  mysql>, show 表+ - - - - - - - - - - - - - - - - - - - +
  |,Tables_in_TENNIS  |
  + - - - - - - - - - - - - - - - - - - - +
  | |,COMMITTEE_MEMBERS 
  |,MATCHES ,,,,,,,,, |
  |,PENALTIES ,,,,,,, |
  |,PLAYERS ,,,,,,,,, |
  |,TEAMS ,,,,,,,,,,, |
  + - - - - - - - - - - - - - - - - - - - + 5,rows  set 拷贝(0.00,sec) 

 MySQL存储过程的“异常处理

因为前面的实验多数用此数据库,库表结构就不再赘述了。

,

例:创建过程,插入一个重复的2号球队

 MySQL存储过程的“异常处理

 mysql> delimiter  $ $
  mysql>, create  procedure  duplicate_teams (,,,,,out  p_processed 短整型),,,,,,begin ,,,,,set  p_processed=1,,,,,,,insert  into  TEAMS 值(2,27岁的“第三”),,,,,,,set  p_processed=2,,,,,→最终获得$ $
  mysql>, delimiter ;
  mysql>, call  duplicate_teams (@processed); ERROR  1062年,(23000):,Duplicate  entry  ' 2 ', for  key 主要'mysql>, select  @processed; + - - - - - - - - - - - - +
  | |,@processed 
  + - - - - - - - - - - - - +
  |,NULL ,,,,, |
  + - - - - - - - - - - - - + 

 MySQL存储过程的“异常处理

解析:客户端调用存储过程,运行出错,打印错误信息,过程被终止,没有输出。

,

一、定义异常处理:

声明…处理程序语句:

通过条件的定义和处理,可以在定义过程中,针对可能遇到的问题,做出相应的处理步骤。(也就是定义一个异常处理程序,指定当过程某条语句出错时,相应的采取什么操作)

 MySQL存储过程的“异常处理

 DECLARE  handler_action 处理程序
  ,,,FOR  condition_value  [, condition_value],…
  ,,,的声明
  
  handler_action:
  ,,,CONTINUE ,,, |退出
  
  condition_value:
  ,,,mysql_error_code ,,, |, SQLSTATE (价值),sqlstate_value ,,, |, condition_name ,,, |, SQLWARNING ,,, |, NOT  FOUND ,,, |, SQLEXCEPTION 

 MySQL存储过程的“异常处理

注意:声明……处理程序语句必须出现在变量或条件声明的后面。

当某个错误(condition_value)发生时——→执行指定的语句(声明——记录错误信息),执行完之后再决定如何操作(handler_action)。

1, handler_action

继续:继续执行当前的程序(接着执行出错的SQL语句的下一条语句);

退出:当前程序终止(退出当前声明所在的开始结束),

目前还不支持撤销功能。

2,声明

可以是单条语句或复合语句。

3, condition_value指明处理程序被何种条件触发,如果条件被触发,却没有处理程序被声明用于处理该条件,程序的进行将取决于条件类型。【顶】

,

,

二,单个异常处理程序

在输出参数中包含出错消息的SQLSTATE码。

例1:创建过程,插入一个重复的2号球队,继续

 MySQL存储过程的“异常处理

 mysql> DELIMITER  $ $
  mysql>, CREATE , PROCEDURE  small_mistake1 (,
  ,,,,,OUT  error  VARCHAR (5)),,
  ,,,,,BEGIN ,,,,,DECLARE  CONTINUE  HANDLER  FOR  SQLSTATE “23000”,
  ,,,,,SET  error =,‘23000’,,,,, #用来记录错误发生时的一些信息,,,,,,,,,,,,,,,
  ,,,,,select 误差;,,,,,,SET  error =,‘00000’,,,,,,,select 误差;,,,,,,,,,INSERT  INTO  TEAMS 价值(“第三”2,27日);,,#会出错的语句,,,,,,,,,SET  error =,”23001年,,,,,,
  ,,,,,结束$ $
  mysql>, DELIMITER ;
  mysql>, call  small_mistake1 (@a); + - - - - - - - +
  | |,error 
  + - - - - - - - +
  |,NULL  |
  + - - - - - - - +
  
  + - - - - - - - +
  | |,error 
  + - - - - - - - +
  |,00000 |
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

MySQL存储过程的“异常处理”