DB2 LUW - Get存储过程中的错误行



我正在尝试确定导致错误的存储过程或最后一个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;

得到如下结果:

ERRSQLCODEcodepartureTYPEMSGTEXT
-801aESQL0801N企图除零。
-801bESQL0801N企图除零。
100cWSQL0100W FETCH, UPDATE或DELETE没有找到行;或者查询的结果是一个空表

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

文档。该文档包括一个工作示例。

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

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

相关内容

  • 没有找到相关文章

最新更新