stored-procedures - DB2 LUW - 在存储过程中获取错误行
问题描述
我正在尝试确定存储过程中的行或导致错误的最后一条 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;
我得到以下信息:
错误代码 | 代码部分 | 类型 | MSGTEXT |
---|---|---|---|
-801 | 一个 | 乙 | SQL0801N 已尝试除以零。 |
-801 | b | 乙 | SQL0801N 已尝试除以零。 |
100 | C | W | SQL0100W 未找到 FETCH、UPDATE 或 DELETE 行;或者查询的结果是一个空表。 |
因此,我能够获取发生错误或警告的代码部分,但最好获取行或 SQL 语句,因为我不想使用临时变量指定代码的每个部分。
我已经找到了这个SQLCA --> sqlerrd(3):“...如果在编译 SQL 例程、触发器或动态复合 SQL(内联或编译)语句期间遇到错误,sqlerrd(3) 包含以下行遇到错误的编号”。目前我还没有设法使用 SQLCA 变量。我不知道如何在 DB2 LUW 中的存储过程中实现它们。
是否有另一种/更好的方法来记录导致错误的存储过程中的特定行或 SQL 语句?
我的 DB2 版本是 10.5.0。
谢谢!
解决方案
如果您的 Db2 服务器平台是 Linux/Unix/Windows,并且您使用的是最新版本,那么请考虑使用DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
可能对您有所帮助的版本。
文档在这里。该文档包括一个工作示例。
将其用于存储过程或例程时,明智的做法是始终使用有意义的特定名称和SPECIFIC
语句上的子句创建这些例程create or replace
。否则,例程将有一个系统生成的名称,当它出现在DBMS_UTILITY.FORMAT_ERROR_BACKTRACE
. 还有其他原因,您应该始终为您的例程使用特定名称。
SQLCA 用于调用程序(即调用存储过程的程序)。
推荐阅读
- vue.js - 如何使用 v-for 和 vee-validate 呈现错误
- javascript - nodeJS应用程序上的字符串到整数舍入数
- python - 如何创建多值字典?
- android - 从Android应用程序中的前台服务到IOT设备的不稳定的后台Websocket连接
- node.js - node js承诺调试
- javascript - 验证 ID 令牌的完整性会导致错误
- arrays - Kotlin Gson 解析 Json 对象和数组
- python - 在另一个评估为真的数据框中添加列(在数据框中搜索电话号码和电子邮件)
- python - 使用 statsmodels 在 Python 中分解时间序列
- angular - 打开日历后角度材料日期选择器错误