0

エラーの原因となっているストアド プロシージャまたは最後の SQL ステートメントの行を特定しようとしています。回避策として、手動で設定した一時変数を使用して、ストアド プロシージャのどの部分でエラーが発生したかを判断しています。

以下を参照してください。

-- Create an ErrorLog table
Create Table SCHEMA.ErrorLog_lrc_test                                                        
  (                                 
   ErrSQLCODE     Integer ,                                   
   Codepart    Char(1),                             
   Type           Char(1) ,                                  
   MsgText        VarChar(1024));

CREATE OR REPLACE PROCEDURE SCHEMA.test_error(IN divisor INT)
LANGUAGE SQL
BEGIN
-- Define variables
DECLARE codepart_var Char(1);

DECLARE test_INT INT;

-- Define sqlcode
DECLARE SQLCODE INTEGER;

--Define Error-Handler
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN 
    INSERT INTO SCHEMA.ErrorLog_lrc_test(ErrSQLCODE, Codepart, TYPE, MsgText) 
        VALUES(SQLCODE, codepart_var, 'E', SYSPROC.SQLERRM(SQLCODE));
    END;
   
--Define Warning-Handler
DECLARE CONTINUE HANDLER FOR SQLWARNING, NOT FOUND 
    BEGIN 
    INSERT INTO SCHEMA.ErrorLog_lrc_test(ErrSQLCODE, Codepart, TYPE, MsgText) 
        VALUES(SQLCODE, codepart_var, 'W', SYSPROC.SQLERRM(SQLCODE));
    END;
 
-- Set temporary variable to 'a' to get part of code where error occured
SET codepart_var = 'a';
   
-- Create Error
sELECT  1/divisor into test_INT
FROM SYSIBM.SYSDUMMY1;

SET codepart_var = 'b';

-- Create Error
sELECT 1/divisor into test_INT
FROM SYSIBM.SYSDUMMY1;

SET codepart_var = 'c';

-- Create Not Found (Sqlcode 100)
INSERT INTO SCHEMA.ErrorLog_lrc_test
SELECT NULL, NULL, NULL, NULL FROM "SYSIBM".SYSDUMMY1
WHERE 1 = 0 ;

END 

call SCHEMA.test_error(0);

SELECT *
FROM SCHEMA.ErrorLog_lrc_test;

私は以下を取得します:

ERRSQLCODE コードパート タイプ MSGTEXT
-801 a SQL0801N ゼロによる除算が試行されました。
-801 b SQL0801N ゼロによる除算が試行されました。
100 c W SQL0100W FETCH、UPDATE、または DELETE の行が見つかりませんでした。またはクエリの結果が空のテーブルです。

したがって、エラーまたは警告が発生したコードの部分を取得できますが、コードのすべての部分を一時変数で指定したくないため、行または SQL ステートメントを取得する方がよいでしょう。

私はすでにこのSQLCA --> sqlerrd(3) を見つけました。エラーが発生した番号」。今のところ、SQLCA 変数をうまく利用できませんでした。ストアド プロシージャで DB2 LUW に実装する方法がわかりません。

エラーの原因となっているストアド プロシージャ内の特定の行または SQL ステートメントをログに記録する別の/より良い方法はありますか?

私の DB2 バージョンは 10.5.0 です。

ありがとうございました!

4

1 に答える 1