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 服务器上的其他工具来更密切地观察正在执行的语句和包。例如监控、db2pddb2cos、审计等。但这条路线似乎是用大锤来破解一个可能不存在的坚果,因此需要仔细检查你的动机。

【讨论】:

以上是关于DB2 LUW 版本 10.5.0.10 - 在存储过程中获取警告(未找到)行的主要内容,如果未能解决你的问题,请参考以下文章

sql 咨询DB2 LUW

更改db2 luw中表的列顺序

DB2 LUW - 在存储过程中获取错误行

DB2 LUW:在Dynamic SQL中创建用户定义的函数

如何在 DB2 LUW 中的存储过程或 UDF 中“选择”?

我们如何在大型机上开发应用程序以在没有 DB2/z 的情况下访问 DB2/LUW?