轉載自: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 |
+---------+
```
- MySQL
- MySQL是什么
- MySQL環境搭建
- centos7-MySQL8
- windows-MySQL8
- 數據庫軟件
- sqlyog軟件安裝
- navicat軟件安裝
- powerDesigner軟件安裝
- RDBMS術語
- SQL語句組成
- 數據庫系統組成
- 數據庫操作
- 數據表操作
- 查詢語句
- 基本語法
- 子查詢
- 表連接
- 查詢語句執行順序
- 事務
- 事務是什么
- 事務的作用
- 事務的4個特性
- 事務隔離級別
- 事務的實現
- 索引
- 索引的作用
- 索引操作
- 存儲引擎
- 備份與恢復
- 視圖
- 視圖是什么
- 視圖的作用
- 創建視圖
- 查看視圖
- 更改視圖
- DML操作視圖
- 刪除視圖
- 存儲過程與函數
- 過程與函數是什么
- 存儲過程操作
- 定義存儲過程
- 調用存儲過程
- 查看存儲過程
- 刪除存儲過程
- 修改存儲過程
- 函數操作
- 過程與函數區別
- 流程控制
- if語句
- case語句
- while循環語句
- repeat循環語句
- loop循環語句
- 變量
- 處理程序
- 光標
- Redis
- 簡介
- 下載與安裝
- 命令操作redis數據庫
- 通用命令
- 數據操作
- 持久化
- Windows上的持久化操作
- 數據庫設計
- 數據庫設計過程
- ER模型圖
- MongoDB
- MongoDB是什么?
- MongoDB特性
- MongoDB 數據模型
- 安裝MongoDB
- MongoDB認證
- Database操作
- Collection操作
- Document操作
- 插入
- 查詢
- 更新
- 刪除
- buckWrite
- MongoDB索引
- 副本集
- 聚焦分析
- 事務管理
- 寫關注
- 讀關注