1. 程式人生 > >Mysql 異常處理流程

Mysql 異常處理流程

mysql儲存過程也提供了對異常處理的功能:通過定義HANDLER來完成異常宣告的實現

語法如下:

DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement handler_type: CONTINUE | EXIT condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code

Handlers型別:

1, EXIT: 發生錯誤時退出當前程式碼塊(可能是子程式碼塊或者main程式碼塊) 2, CONTINUE: 傳送錯誤時繼續執行後續程式碼

condition_value:

condition_value支援標準的SQLSTATE定義;

SQLWARNING是對所有以01開頭的SQLSTATE程式碼的速記

NOT FOUND是對所有以02開頭的SQLSTATE程式碼的速記

SQLEXCEPTION是對所有沒有被SQLWARNINGNOT FOUND捕獲的SQLSTATE程式碼的速記

除了SQLSTATE值,MySQL錯誤程式碼也被支援

但是對於mysql而言,優先順序如下: MySQL Error code > SQLSTATE code > 命名條件

使用SQLSTATE還是MySQL Error Code?

1,SALSTATE是標準,貌似會更portable,但是實際上MySQL、DB2、Oracle等等的儲存程式語法大相徑庭,所以portable的優勢不存在 2,MySQL error code與SQLSTATE並不是一一對應的,比如很多MySQL error code都對映到同一SQLSTATE code(HY000)

當MySQL客戶端碰到錯誤時,它會報告MySQL error code和相關的SQLSATE code:

mysql > CALL nosuch_sp(); ERROR 1305 (42000): PROCEDURE sqltune.nosuch_sp does not exist

具體的sqlsdate和mysql error code的對應可以在http://dev.mysql.com/doc/的MySQL reference manual的附錄B找到完整的最新的error codes

condition_name:命名條件

MySQL error code或者SQLSTATE code的可讀性太差,所以引入了命名條件:

語法:

Java程式碼 複製程式碼 收藏程式碼
  1. DECLARE condition_name CONDITION FOR condition_value   
  2. condition_value:   
  3.     SQLSTATE [VALUE] sqlstate_value   
  4.   | mysql_error_code  
DECLARE condition_name CONDITION FOR condition_value

condition_value:
    SQLSTATE [VALUE] sqlstate_value
  | mysql_error_code

 使用:

Java程式碼 複製程式碼 收藏程式碼
  1. # original   
  2. DECLARE CONTINUE HANDLER FOR 1216 MySQL_statements;   
  3. # changed   
  4. DECLARE foreign_key_error CONDITION FOR 1216;   
  5. DECLARE CONTINUE HANDLER FOR foreign_key_error MySQL_statements;  
# original
DECLARE CONTINUE HANDLER FOR 1216 MySQL_statements;

# changed
DECLARE foreign_key_error CONDITION FOR 1216;
DECLARE CONTINUE HANDLER FOR foreign_key_error MySQL_statements;

  用condition_name為錯誤程式碼起了個別名。

示例1:Duplicate entry Handler

Sql程式碼 複製程式碼 收藏程式碼
CREATE PROCEDURE sp_add_location
    (in_location    VARCHAR(30),
     in_address1    VARCHAR(30),
     in_address2    VARCHAR(30),
     zipcode        VARCHAR(10),
     OUT out_status VARCHAR(30))
BEGIN
    DECLARE CONTINUE HANDLER
        FOR 1062
        SET out_status='Duplicate Entry';

    SET out_status='OK';
    INSERT INTO locations
        (location,address1,address2,zipcode)
    VALUES
        (in_location,in_address1,in_address2,zipcode);
END;

示例2: Last Row Handler

Sql程式碼 複製程式碼 收藏程式碼
CREATE PROCEDURE sp_not_found()
    READS SQL DATA
BEGIN
    DECLARE l_last_row INT DEFAULT 0;
    DECLARE l_dept_id INT:
    DECLARE c_dept CURSOR FOR
        SELECT department_id FROM departments;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_last_row=1;

    OPEN c_dept;
    dept_cursor: LOOP
        FETCH c_dept INTO l_dept_id;
        IF (l_last_row=1) THEN
            LEAVE dept_cursor;
        END IF;
    END LOOP dept_cursor;
    CLOSE c_dept;
END;

綜合示例:

Sql程式碼 複製程式碼 收藏程式碼
  1. CREATEPROCEDURE sp_add_department   
  2.     (p_department_name     VARCHAR(30),   
  3.      p_manager_surname     VARCHAR(30),   
  4.      p_manager_firstname   VARCHAR(30),   
  5.      p_location            VARCHAR(30),   
  6. OUT p_sqlcode         INT,   
  7. OUT p_status_message  VARCHAR(100))   
  8. BEGIN
  9.     /* START Declare Conditions */   
  10. DECLARE duplicate_key CONDITION FOR 1062;   
  11. DECLARE foreign_key_violated CONDITION FOR 1216;   
  12.     /* ENDDeclare COnditions */   
  13.     /* START Declare variables and cursors */   
  14. DECLARE l_manager_id INT;   
  15. DECLARE csr_mgr_id CURSORFOR
  16. SELECT employee_id FROM employees   
  17. WHERE surname=UPPER(p_manager_surname)   
  18. AND firstname=UPPER(p_manager_firstname);   
  19.     /* ENDDeclare variables and cursors */   
  20.     /* START Declare Exception Handlers */   
  21. DECLARECONTINUE HANDLER FOR duplicate_key   
  22. BEGIN
  23. SET p_sqlcode=1052;   
  24. SET p_status_message='Duplicate key error';   
  25. END;   
  26. DECLARECONTINUE HANDLER FOR foreign_key_violated   
  27. BEGIN
  28. SET p_sqlcode=1216;   
  29. SET p_status_message='Foreign key violated';   
  30. END;   
  31. DECLARECONTINUE HANDLER FORNOT FOUND   
  32. BEGIN
  33. SET p_sqlcode=1329;   
  34. SET p_status_message='No record found';   
  35. END;   
  36.     /* ENDDeclare Exception Handlers */   
  37.     /* START Execution */   
  38. SET p_sqlcode=0;   
  39. OPEN csr_mgr_id;   
  40. FETCH csr_mgr_id INTO l_manager_id;   
  41.     IF p_sqlcode<>0 THEN     /* Failed to get manager id */   
  42. SET p_status_message=CONCAT(p_status_message,' when fetching manager id');   
  43. ELSE                     /* Got manager id, we can try andinsert */   
  44. INSERTINTO departments (department_name, manager_id, location)   
  45. VALUES(UPPER(p_department_name), l_manager_id, UPPER(p_location));   
  46.         IF p_sqlcode<>0 THEN /* Failed toinsert new department */   
  47. SET p_status_message=CONCAT(p_status_message, ' when inserting new department');   
  48. END IF;   
  49. END IF;   
  50. CLOSE csr_mgr_id;   
  51.     /* END Execution */   
  52. END

相關推薦

Mysql 異常處理流程

mysql儲存過程也提供了對異常處理的功能:通過定義HANDLER來完成異常宣告的實現 語法如下: DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement handler_type: CONTINUE | EXIT cond

SpringMVC源碼分析-400異常處理流程及解決方法

defining count ror error this 設計模式 進入 如何 16px 本文設計SpringMVC異常處理體系源碼分析,SpringMVC異常處理相關類的設計模式,實際工作中異常處理的實踐。 問題場景 假設我們的SpringMVC應用中有如下控制器: 代

專案開發(異常處理流程

採用的是SpringMVC中的統一異常處理機制 編寫異常類 異常分為Exception分為檢查型異常 和非檢查型異常,這裡通過繼承Exception的類屬於非檢查型異常 package com.fdd.exception; public class MyException extend

記一次伺服器CPU異常處理流程

上線新版本後cpu飆升,配置什麼都沒變! 1,著手調查馬上檢視慢查詢,沒有慢查詢 2,檢視慢php程序tail -f log.slow,定位到方法函式圖片轉指令方法耗時大,和cpu損耗掛鉤,基本猜測這個函式方法,但沒有優化空間 3,不死心,查一下程序耗損掛起點:ll /proc/PID號/f

Arm架構異常處理流程之中斷

arch/arm64/kernel/entry.s:    el0_sync()/el0_irq() -> ret_to_user() -> work_pending() -> do_notify_resume()               // (1) 在arm64架構中,kernel執

Java Exception——Java中的異常處理流程

在Java程式設計語言中,異常物件都是派生於Throwable類的一個例項。如果Java中內建的異常類不能夠滿足需求,使用者可以建立自己的異常類。 異常的捕獲與處理: try{ 可能出現異常的語句 }catch(異常型別 異常物件){ 處理異常 }catch(異常型別 異常

java application的異常處理流程

1. java application 異常發生後的程式碼流程: 程式碼流程是函式檔案 frameworks/base/core/java/com/android/internal/os/RuntimeInit.java的函式UncaughtHandler控制的:    

Arm架構異常處理流程之缺頁異常

【摘要】 本文將為您介紹linux核心是如何實現缺頁異常處理的。缺頁異常、中斷和系統呼叫同屬arm異常處理,筆者計劃分三篇文件分別介紹一下,其實在彙編階段三種處理流程有很多相通之處,不過為了閱讀方便,即使相同的部分也會重新在各自文件中介紹一遍。 【背景】 本部分簡單介紹下為何要寫此文? 1開發除錯工具:

Java 異常的捕獲及處理(異常處理流程)

import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner in

線上服務mcelog負載異常分析處理流程

線上服務mcelog負載異常分析處理流程一、問題概述:Nginx服務器,HP,有冗余,其中一臺服務器mcelog負載比較高,日誌秒級別,已經影響了此服務器業務。tail -f /var/log/mcelog#註意看此信息是不斷循環,註意看Transaction:Memory scrubbing error M

Mysql slave 主從同步異常處理 Error:1872

mysql主從異常嗎 主從同步 1872 逗哥自動化 1、報錯原因: 今日收到zabbix磁盤報警,通過du命令查找到mysql目錄過大,發現relay日誌沒有設置過期時間,所以手動刪除從庫中繼日誌,之後重啟mysql後主從復制狀態異常: du -h --max-depth=1 / |so

zuul網關Filter處理流程異常處理

println 沒有 actor stat blog 一個地方 cli ram color 本文轉載自:https://blog.csdn.net/tianyaleixiaowu/article/details/77893822 上一篇介紹了java網關Zuul的簡單使用

Mysql DataPacketTooBigException異常處理

安裝 mysqli 配置 art server internal rec my.ini exe 在本地上運行好好,然後發布到服務器上去, 總是報錯,後來查了一下日誌,得到了如下的錯誤日誌: [org.hibernate.engine.jdbc.spi.SqlExceptio

27、異常的基本概念和處理流程

學習目標: 1、瞭解Java異常的基本概念 2、瞭解異常的使用場景 3、掌握異常的基本語法結構 學習過程: 一、異常的基本概念 在java中把導致程式中斷執行的情況分為兩種,一種就是異常,而另外一種叫做錯誤。所有異常的基類是Exception,錯誤的基類是Error。Exce

Java多層巢狀異常處理的基本流程

       異常是程式中的一些錯誤,但並不是所有的錯誤都是異常,錯誤有時候是可以避免的。異常的物件有兩個來源,一是Java執行時環境自動丟擲系統生成的異常,而不管你是否願意捕獲和處理,它總要被丟擲!比如除數為0的異常。二是程式設計師自己丟擲的異常,這個異常可以是程式設

Java多層嵌套異常處理的基本流程

gets ace 導致 兩層 多個 嵌套 都是 輸出 程序 異常是程序中的一些錯誤,但並不是所有的錯誤都是異常,錯誤有時候是可以避免的。異常的對象有兩個來源,一是Java運行時環境自動拋出系統生成的異常,而不管你是否願意捕獲和處理,它總要被拋出!比如除數為0的

分頁查詢MySql語句異常處理

方法的部分原始碼是這樣的 public ArrayList getGoodsByPage(int pageSize,int pageNow){ ArrayList al=new ArrayList();try {ct=new ConnDB().getConn();ps=ct.prepareS

MySQL學習筆記(4)-- jdbc異常處理和工具類抽取

一:異常處理 在前面的學習中,所有的異常全部都是使用throws方法解決的,現在嘗試將異常在程式內部進行處理。 為什麼要在程式內部處理異常? 因為採用throws方法,一旦產生異常,程式會停止執行,並將異常丟擲,但是此時程式內的資源並沒有釋放出來,而Con

mysql+java】捕獲資料庫中未查到資料進行異常處理

文章目錄前言準備工作 思路分析流程圖分析程式碼分析說明 捕獲資料庫未查到資料異常處理 前言         當用戶查資料庫中的表單以此驗證表單中是否和即將要插入的資料重複,捕獲重複的資料以此來統計重複資

mysql 賬戶登入的處理流程

現場環境mysql賬戶登入錯誤,使用者名稱和密碼都確認過沒有問題的。報錯資訊如下: ERROR 1045 (28000): Access denied for user 'test'@'localhost' (using password: YES) 檢視1045對應的錯誤資訊: p