2017-08-10 31 views
0

こんにちは私はDB2でデータベースを作成しています。 IBM Data Clientを使用します。私は私のストアドプロシージャにキャッチしようとしますが、それはDB2によってサポートされていないようですが、誰かが私を助けることができますか?私はSQLエラーを処理し、そのエラーを返す必要があります。どうやってやるの?DB2ストアード・プロシージャtry catch

答えて

1

DB2 LUWは、SQL PLプロシージャーの例外ハンドラー(継続ハンドラーまたは出口ハンドラー)をサポートします。すべての詳細については、ご使用のバージョンのDB2ナレッジ・センターを参照してください。条件と一緒に使用することができます。特定の処理が必要な場合は、複数のハンドラを持つことができます。ナレッジセンターとDB2 LUWインストールされた製品ディレクトリには、多くのサンプルSQL PLプロシージャーがあります。

+0

うん、私はすでにそれを見てきました。私は、returncode variabileをツアーに割り当てなければならないエラー処理のための特別なバリバリであるsqlstatuscodeを使用しなければならないと言いますが、これは私の答えの理由です。私はサンプルコードを見ましたが、私のためには動作しません。私はsqlstatuscodeを私のretcode変数に代入しますが、もし私がerroreを持っていてもretcodeは常に0です。私は意図的に私の手続きに外部キー制約に違反する値を代入しようとしますが、retcode値は変わりません。 Db2は値を挿入しませんが、エラーを処理することはできません –

+0

コードを投稿し、ツールチェーン全体を詳細に記述します。 dml/ddlがSQL PL procsで実行され、例外ハンドラ(continueまたはエラーの場合)が使用方法を理解したときにDB2が正しく動作するように、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