DB2 LUW 版本 10.5.0.10 - 在存储过程中获取警告(未找到)行
Posted
技术标签:
【中文标题】DB2 LUW 版本 10.5.0.10 - 在存储过程中获取警告(未找到)行【英文标题】:DB2 LUW version 10.5.0.10 - Get Warning (Not found) Line in Stored Procedure 【发布时间】:2021-02-15 10:10:07 【问题描述】:我正在尝试确定存储过程中的行或导致警告/未找到的最后一条 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 | CODEPART | TYPE | MSGTEXT |
---|---|---|---|
100 | a | W | SQL0100W No row was found for FETCH, UPDATE or DELETE; or the result of a query is an empty table. |
我知道对于错误,有一个函数 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 可用于跟踪错误。不幸的是,该功能不会跟踪警告。还有一个函数DBMS_UTILITY.FORMAT_CALL_STACK,但这也不起作用。
是否有另一种/更好的方法来记录导致警告/未找到的存储过程中的特定行或 SQL 语句?
【问题讨论】:
【参考方案1】:不,据我所知,目前没有内置的警告功能。在这里仔细考虑你的动机。
程序员可以通过在例程内部使用异常处理程序(或多个异常处理程序)来捕获警告,并可以决定记录此类事件(或者在极端情况下,通过以下方式将它们转换为错误引发新的异常,然后通过DBMS_UTILITY.FORMAT*
方法可见)。但这可能是不明智的,除非在开发环境中。
您的例程可能有一个continue handler
用于警告,您可以在其中检查 SQLSTATE,并有条件地决定记录特定的 SQLSTATES。记录 SQLSTATE '02000' (sqlcode 100 - no rows found) 可能是愚蠢的,因为这与大多数警告一样是良性的。但是一些警告可能会暗示其他问题,例如记录可能有趣的数据质量/转换/截断或优化问题。
我不知道有任何工具可以帮助解决此问题,或提供警告行号,或集成此类工作以进行客户端查询。
DBA 可以(对于 Db2-LUW)使用 Db2 服务器上的其他工具来更密切地观察正在执行的语句和包。例如监控、db2pd
、db2cos
、审计等。但这条路线似乎是用大锤来破解一个可能不存在的坚果,因此需要仔细检查你的动机。
【讨论】:
以上是关于DB2 LUW 版本 10.5.0.10 - 在存储过程中获取警告(未找到)行的主要内容,如果未能解决你的问题,请参考以下文章
DB2 LUW:在Dynamic SQL中创建用户定义的函数