我正在尝试确定存储过程中的行或导致警告/未找到的最后一个 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;
我得到以下信息:
错误代码 | 代码部分 | 类型 | MSGTEXT |
---|---|---|---|
100 | 一个 | W | SQL0100W 未找到 FETCH、UPDATE 或 DELETE 行;或者查询的结果是一个空表。 |
我知道对于错误,有一个函数 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 可用于跟踪错误。不幸的是,该功能不会跟踪警告。还有一个函数 DBMS_UTILITY.FORMAT_CALL_STACK,但这也不起作用。
是否有另一种/更好的方法来记录导致警告/未找到的存储过程中的特定行或 SQL 语句?