程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> 如何在SQL存儲過程中處理錯誤

如何在SQL存儲過程中處理錯誤

編輯:DB2教程

如何在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
--存儲過程結束
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved