2017-08-10 124 views
0

嗨,我正在用DB2創建一個數據庫。我使用IBM Data Client。我想使用try catch進入我的存儲過程,但它似乎不被DB2支持,任何人都可以幫助我嗎?我需要處理sql錯誤並返回它。我怎樣才能做到這一點?DB2存儲過程try catch

回答

1

DB2 LUW支持用於SQL PL過程的異常處理程序(繼續處理程序或退出處理程序)。查看DB2知識中心獲取所有詳細信息的版本。您可以在條件下使用它們。如果需要特定的處理,可以有多個處理程序。知識中心和DB2 LUW安裝的產品目錄中都有大量示例SQL PL過程。

+0

是啊,我已經看過了。它說,我必須使用sqlstatuscode這是一個特殊的變量來處理錯誤,必須分配給巡迴返回碼變量但它不起作用,這是我的答案的原因。我看過示例代碼,但不適合我。我將sqlstatuscode分配給我的retcode變量,即使我有一個errore,retcode始終是0.我故意嘗試將違反外鍵約束的值分配到我的過程中,但retcode值不會更改。 Db2不會插入值,但我不能處理錯誤 –

+0

發佈您的代碼並詳細說明您的工具鏈。 DB2在您的SQL PL procs和異常處理程序中運行dml/ddl時(用於繼續或錯誤)在您瞭解如何使用它們時正確工作時,會設置SQLCODE變量。 – mao

+0

DB2引發(調用)異常並調用您的處理程序,只有DB2本身發現該錯誤。如果您手動設置SQLCODE,那麼DB2不會作出反應(它會在下一次執行DML/DDL時覆蓋它的值)。對於異常也存在缺省的退出處理程序。 – mao

0
CREATE OR REPLACE PROCEDURE sp_Applicazione_Aggiorna 
(    
       IN @VAR1 INT, 
       IN @VAR2 INT, 
       IN @VAR3 VARCHAR(16), 
       OUT @ReturnCode INTEGER, 
) 

LANGUAGE SQL 
P1: BEGIN 
DECLARE SQLCODE INTEGER DEFAULT 0; 
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND 
SET @ReturnCode = SQLCODE; 



IF not exists (select VAR1 from DB.TABLEA where VAR1 = @VAR1) 
THEN 
    set @ReturnCode = 3011; 
ELSE 
    UPDATE   DB.TABLEA SET 
        [email protected], 
        [email protected] 
    WHERE [email protected]; 

END IF; 

END P1