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_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 ステートメントをログに記録する別の/より良い方法はありますか?

4

1 に答える 1