我正在尝试确定导致错误的存储过程或最后一个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 | codeparture | TYPE | MSGTEXT | |
---|---|---|---|---|
-801 | a | E | SQL0801N企图除零。 | |
-801 | b | E | SQL0801N企图除零。 | |
100 | c | W | SQL0100W FETCH, UPDATE或DELETE没有找到行;或者查询的结果是一个空表 |
如果您的Db2-server平台是Linux/Unix/Windows,并且您使用的是最新版本,那么考虑使用DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
,它可能会对您有所帮助。
文档。该文档包括一个工作示例。
对于存储过程或例程,明智的做法是始终使用create or replace
语句上的SPECIFIC
子句创建具有有意义的特定名称的例程。否则,例程将有一个系统生成的名称,当它出现在DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
的输出中时,对用户没有意义。你应该为你的例程使用一个特定的名字还有其他的原因。
SQLCA用于调用程序(即调用存储过程的程序)。