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

Posted

技术标签:

【中文标题】DB2 LUW - 在存储过程中获取错误行【英文标题】:DB2 LUW - Get Error Line in Stored Procedure 【发布时间】:2021-02-12 14:20:46 【问题描述】:

我正在尝试确定存储过程中的行或导致错误的最后一条 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_error(IN divisor INT)
LANGUAGE SQL
BEGIN
-- Define variables
DECLARE codepart_var Char(1);

DECLARE test_INT INT;

-- Define sqlcode
DECLARE SQLCODE INTEGER;

--Define Error-Handler
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN 
    INSERT INTO SCHEMA.ErrorLog_lrc_test(ErrSQLCODE, Codepart, TYPE, MsgText) 
        VALUES(SQLCODE, codepart_var, 'E', SYSPROC.SQLERRM(SQLCODE));
    END;
   
--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 error occured
SET codepart_var = 'a';
   
-- Create Error
sELECT  1/divisor into test_INT
FROM SYSIBM.SYSDUMMY1;

SET codepart_var = 'b';

-- Create Error
sELECT 1/divisor into test_INT
FROM SYSIBM.SYSDUMMY1;

SET codepart_var = 'c';

-- 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_error(0);

SELECT *
FROM SCHEMA.ErrorLog_lrc_test;

我得到以下信息:

ERRSQLCODE CODEPART TYPE MSGTEXT
-801 a E SQL0801N Division by zero was attempted.
-801 b E SQL0801N Division by zero was attempted.
100 c W SQL0100W No row was found for FETCH, UPDATE or DELETE; or the result of a query is an empty table.

所以我能够获取发生错误或警告的代码部分,但最好获取行或 SQL 语句,因为我不想用临时指定代码的每个部分变量。

我已经找到了这个SQLCA --> sqlerrd(3):“...如果在编译 SQL 例程、触发器或动态复合 SQL(内联或编译)语句期间遇到错误,sqlerrd( 3) 包含遇到错误的行号”。目前我还没有设法使用 SQLCA 变量。我不知道如何在 DB2 LUW 中的存储过程中实现它们。

是否有另一种/更好的方法来记录导致错误的存储过程中的特定行或 SQL 语句?

我的 DB2 版本是 10.5.0。

谢谢!

【问题讨论】:

不幸的是,调用应用程序只能访问 SQLCA 结构。您无法在 SQL SP 中访问它。 【参考方案1】:

如果您的 Db2 服务器平台是 Linux/Unix/Windows,并且您使用的是最新版本,那么请考虑使用 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE,这可能会对您有所帮助。

文档here。该文档包含一个工作示例。

将其用于存储过程或例程时,明智的做法是始终使用create or replace 语句中的SPECIFIC 子句创建具有有意义的特定名称的例程。否则,例程将有一个系统生成的名称,当它出现在DBMS_UTILITY.FORMAT_ERROR_BACKTRACE 的输出中时,它对用户没有意义。您应该始终为例程使用特定名称还有其他原因。

SQLCA 用于调用程序(即调用存储过程的程序)。

【讨论】:

很遗憾我的 DB2 版本是 10.5.0,所以我没有那个实用程序。 @DB2User 它应该从 10.5.7 开始。你的 10.5 补丁包是什么? 它现在可以工作了:) 是否还有跟踪警告的功能?

以上是关于DB2 LUW - 在存储过程中获取错误行的主要内容,如果未能解决你的问题,请参考以下文章

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

db2如何创建存储过程

通过 JMeter 调用 DB2 存储过程时出现语法错误

运行存储过程时出现 db2 存储错误

DB2 存储过程中的错误

获取 DB2 的已删除存储过程和函数的详细信息