下面將如何在存儲過程當中判斷SQL語句的錯誤,向你們做一個詳細地介紹, 但願你們讓程序開發人員聽從這樣的方式編寫SQL存儲過程,以免形成在程序聯調過程當中應用程序狀態不明確的問題。數據庫
如如下代碼表示,在SQL存儲過程當中能夠定義執行狀態的出口參數,並且儘可能返回系統報告的SQLCODE, 而並不是我的定義的,這樣能夠更好地判斷是什麼樣的錯誤, 也能夠返回錯誤說明,有的開發人員不知何故,將返回碼定義成79700,若是是參照DB2說明開發的,多是誤會了說明的含義,這個問題已經形成了聯調過程當中的誤導判斷和沒法肯定問題的緣由,但願你們注意; spa
若是須要忽略NOT FOUND, 能夠DECLARE CONTINUE HANDLER FOR NOT FOUND, 若是須要而且能夠將returnCode設置爲零,以便於在程序體內判斷returnCode的時候能夠忽略這個NOT FOUND; pwa
能夠定義DECLARE EXIT HANDLER FOR SQLEXCEPTION, 當出現SQL錯誤的時候,中斷程序執行過程,跳出存儲過程,也能夠定義DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, 同時判斷SQLCODE的值,用以忽略你但願忽略的error code, 在程式的最後列出了這種使用方式: 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 ´´;
...... htm
-- 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; blog
...... 開發
對於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;
...... get
IF (returnCode = 0) THEN
......
END IF; 博客
IF (returnCode = 0) THEN
...
END IF;
END
--存儲過程結束
dwd_china 回覆於:2005-08-23 09:20:16
在存儲過程的後面加上這樣的異常處理就能夠了
EXCEPTION
----錯誤處理
WHEN DUP_VAL_ON_INDEX THEN
----主鍵衝突
ROLLBACK;
WHEN VALUE_ERROR THEN
----長度截斷錯誤
ROLLBACK;
WHEN PROGRAM_ERROR THEN
----PL/SQL內部錯誤
ROLLBACK;
WHEN TIMEOUT_ON_RESOURCE THEN
----系統等待超時
ROLLBACK;
WHEN OTHERS THEN
----其餘異常錯誤
ROLLBACK;
TRACKBACK:http://www.kpwang.com/ibm_db2/110642311549.htm