如何在SQL存儲過程中處理錯誤
下面將如何在存儲過程中判斷SQL語句的錯誤,向大家作一個詳細地介紹, 希望大家讓程序開發人員遵從這樣的方式編寫SQL存儲過程,以避免造成在程序聯調過程中應用程序狀態不明確的問題。
如以下代碼表示,在SQL存儲過程中可以定義執行狀態的出口參數,而且盡量返回系統報告的SQLCODE, 而並非個人定義的,這樣可以更好地判斷是什麼樣的錯誤, 也可以返回錯誤說明,有的開發人員不知何故,將返回碼定義成79700,如果是參照DB2說明開發的,可能是誤會了說明的含義,這個問題已經造成了聯調過程中的誤導判斷和無法確定問題的原因,希望大家注意;
如果需要忽略NOT FOUND, 可以DECLARE CONTINUE HANDLER FOR NOT FOUND, 如果需要並且可以將returnCode設置為零,以便於在程序體內判斷returnCode的時候可以忽略這個NOT FOUND;
可以定義DECLARE EXIT HANDLER FOR SQLEXCEPTION, 當出現SQL錯誤的時候,中斷程序執行過程,跳出存儲過程,也可以定義DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, 同時判斷SQLCODE的值,用以忽略你希望忽略的error code, 在程式的最後列出了這種使用方式:
CREATE PROCEDURE OUT_LANGUAGE (...,OUT returnCode INTEGER, OUT returnMsg CHAR(32))
-- returnCode 返回執行中的的錯誤代碼
-- returnMsg 返回執行中的的錯誤描述
SPECIFIC SQL_OUT_LANGUAGE
LANGUAGE SQL
BEGIN
DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE errorLabel CHAR(32) DEFAULT '';
......
-- in case of no data found
DECLARE CONTINUE HANDLER FOR NOT FOUND
BEGIN
SET returnCode = SQLCODE;
-- 也可以設置為 SET returnCode = 0; 因為這個DECLARE是為了忽略NOT FOUND的執行結果
END;
-- in case of SQL error
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET returnCode = SQLCODE;
SET returnMsg = errorLabel;
END;
......
對於SQLEXCEPTION也可以這樣定義,用來忽略一些特定的error code, 但是要在程序體內判斷returnCode的數值:
-- in case of SQL error
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
IF (SQLCODE = -454) THEN
SET returnCode = 0;
-- 創建的數據庫對象已經存在或者插入的記錄在唯一鍵值上重復
ELSE
SET returnCode = SQLCODE;
SET returnMsg = errorLabel;
END IF;
END;
......
IF (returnCode = 0) THEN
......
END IF;
IF (returnCode = 0) THEN
...
END IF;
END
--存儲過程結束