错误捕获语句
如果没有发生错误,这种形式的块儿只是简单地执行所有语句,然后转到END之后的下一个语句。但是如果在执行的语句内部发生了一个错误,则这个语句将会回滚,然后转到EXCEPTION列表。寻找匹配错误的第一个条件。若找到匹配,则执行对应的handler_statements,然后转到END之后的下一个语句。如果没有找到匹配,则会向事务的外层报告错误,和没有EXCEPTION子句一样。错误码可以捕获同一类的其他错误码。
也就是说该错误可以被一个包围块用EXCEPTION捕获,如果没有包围块,则进行退出函数处理。
condition的名称可以是SQL标准错误码编号说明的任意值。特殊的条件名OTHERS匹配除了QUERY_CANCELED之外的所有错误类型。
如果在选中的handler_statements里发生了新错误,则不能被这个EXCEPTION子句捕获,而是向事务的外层报告错误。一个外层的EXCEPTION子句可以捕获它。
示例:
当控制到达给y赋值的地方时,会有一个division_by_zero错误失败。这个错误将被EXCEPTION子句捕获。而在RETURN语句里返回的数值将是x的增量值。
示例 :UPDATE/INSERT异常
B模式下新增declare声明的错误捕获语法。
与exception语法相同都是在执行语句内部发生错误时触发异常处理寻找匹配错误的第一个条件。若找到匹配,则执行对应的statement,否则抛出异常。与exception语法不同的是declare有两种行为,一种是exit,在声明exit异常处理语句并匹配到错误条件时会将已经正确执行的语句提交,在执行完声明的异常处理statement后退出;另一种行为是continue,与exit行为不同在执行语句发生错误触发异常处理语句并匹配到错误条件时会跳过错误语句,继续执行剩余语句。
由于OG异常处理机制与M*数据库不同,只在SQL执行发生异常时才进行异常处理,产生warning等不进行异常处理。
- condition_value
- SQLSTATE [VALUE] sqlstate_value:sqlstate错误码。
- condition_name:条件名。
- SQLWARNING:’01’开头的sqlstate错误码。
- NOT FOUND:’02’开头的sqlstate错误码。