DB2 LUW - 获取存储过程中的错误行
DB2 LUW - Get Error Line in Stored Procedure
我正在尝试确定存储过程中的行或导致错误的最后一个 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 中实现它们。
是否有 another/better 方法记录导致错误的存储过程中的特定行或 SQL 语句?
我的 DB2 版本是 10.5.0。
谢谢!
如果您的 Db2 服务器平台是 Linux/Unix/Windows,并且您使用的是最新版本,请考虑使用 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
,这可能对您有所帮助。
文档here。该文档包括一个有效的示例。
将其用于存储过程或例程时,明智的做法是始终使用 create or replace
语句中的 SPECIFIC
子句创建具有有意义的特定名称的例程。否则例程将有一个系统生成的名称,当它出现在 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
的输出中时,它对用户没有意义。还有其他原因,您应该始终为例程使用特定名称。
SQLCA用于调用程序(即调用存储过程的程序)
我正在尝试确定存储过程中的行或导致错误的最后一个 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 中实现它们。
是否有 another/better 方法记录导致错误的存储过程中的特定行或 SQL 语句?
我的 DB2 版本是 10.5.0。
谢谢!
如果您的 Db2 服务器平台是 Linux/Unix/Windows,并且您使用的是最新版本,请考虑使用 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
,这可能对您有所帮助。
文档here。该文档包括一个有效的示例。
将其用于存储过程或例程时,明智的做法是始终使用 create or replace
语句中的 SPECIFIC
子句创建具有有意义的特定名称的例程。否则例程将有一个系统生成的名称,当它出现在 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
的输出中时,它对用户没有意义。还有其他原因,您应该始终为例程使用特定名称。
SQLCA用于调用程序(即调用存储过程的程序)