ストアド プロシージャまたは最後の 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_warning(IN divisor INT)
LANGUAGE SQL
BEGIN
-- Define variables
DECLARE codepart_var Char(1);
DECLARE test_INT INT;
-- Define sqlcode
DECLARE SQLCODE INTEGER;
--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 warning occured
SET codepart_var = 'a';
-- 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_warning(0);
SELECT *
FROM SCHEMA.ErrorLog_lrc_test;
私は以下を取得します:
ERRSQLCODE | コードパート | タイプ | MSGTEXT |
---|---|---|---|
100 | a | W | SQL0100W FETCH、UPDATE、または DELETE の行が見つかりませんでした。またはクエリの結果が空のテーブルです。 |
エラーには、エラーのトレースに使用できる関数 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE があることを知っています。残念ながら、その関数は警告を追跡しません。関数 DBMS_UTILITY.FORMAT_CALL_STACK もありますが、これも機能しません。
警告/見つからないストアド プロシージャの特定の行または SQL ステートメントをログに記録する別の/より良い方法はありますか?