エラーの原因となっているストアド プロシージャまたは最後の 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 です。
ありがとうございました!