如何从 DB2 获取描述性错误消息?

Posted

技术标签:

【中文标题】如何从 DB2 获取描述性错误消息?【英文标题】:How to get descriptive error messages from DB2? 【发布时间】:2011-02-12 18:56:19 【问题描述】:

当我通过 DB2 上的 JDBC 调用 SQL 语句并且该语句失败时,我捕捉到带有以下消息文本的 SQLException:

com.ibm.db2.jcc.a.nn: DB2 SQL Error: SQLCODE=-206, SQLSTATE=42703,
    SQLERRMC=O.METADATENSATZ, DRIVER=3.52.95

我尝试根据error list published by IBM 自动翻译消息,但消息中存在引用异常其他元素的占位符。

在异常中查找这些元素时,我找到了DB2ExceptionFormatter 并尝试使用它来访问缺失的元素。

但在这里我停了下来,因为DB2ExceptionFormatter 给了我一个线索:

尝试从服务器获取消息文本时出错。只有消息令牌可用。

所以我的问题是:我必须配置什么才能从 DB2 服务器获得正确的消息?

如果我可以从服务器获得人类可读的消息,我可以直接使用它,而不必自己翻译。

【问题讨论】:

为了回答这个问题,了解您使用的 DB2 版本和系统(LUW、z/OS、AS400 等)会很有帮助。 【参考方案1】:

我不确定您在上面查看的是什么消息参考(它似乎是 iSeries?),但您最好通过here 访问 DB2 消息参考。

查找 SQL0206 会得到this page,并带有以下信息:

name 在使用它的上下文中无效。

SQLERRMC 是“O.METADATENSATZ”,所以我认为这意味着您已经向 DB2 发送了一条 SQL 语句,并且它报告“O.METADATENSATZ”无效......要么该列不存在,要么表“O”不存在。

正如message reference 所述,如果您想自动翻译 DB2 错误消息:

要调用消息帮助,请打开命令行处理器并输入:

? XXXnnnnn

其中 XXX 表示有效的消息前缀,nnnnn 表示有效的消息编号。

可以通过发出以下命令检索与给定 SQLSTATE 值关联的消息文本:

?嗯嗯

? nn

其中 nnnnn 是五位数的 SQLSTATE(字母数字),nn 是两位数的 SQLSTATE 类代码(SQLSTATE 值的前两位数)。

在您的情况下,在 DB2 CLP 中键入“?SQL0206”会得到错误消息。

【讨论】:

【参考方案2】:

我发现了一个提示here:

retrieveMessagesFromServerOnGetMessage:

指定 JDBC SQLException.getMessage 调用是否会导致 IBM DB2 Driver for JDBC and SQLJ 调用用于检索错误消息文本的 DB2 for z/OS 存储过程。此属性的数据类型是布尔值。默认为 false,表示不将完整的消息文本返回给客户端。


我试过了,但是sqlException.getMessage()的输出只变成了

O.METADATENSATZ

周围没有任何消息文本。


现在我找到了this:

在您可以在 DB2® for z/OS® 子系统上使用 IBM® Data Server Driver for JDBC and SQLJ 的某些功能之前,您需要安装一组存储过程并创建一组表。

...

WLM 必须安装在 z/OS 系统上。

WLM 是 DB2 Workload Manager,不适用于我用于开发的 DB2 Express 版本:-(

【讨论】:

以上是关于如何从 DB2 获取描述性错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 db2 错误日志中 grep 下面的 sql 部分

如何从具有子句的 DB2 中获取 count(*) 总数?

如何使用错误消息中指定的 tbspaceid tableid 在 DB2 中查找表和列

获取 DB2 上的索引列

如何从 Db2 中的十进制字段中获取无效值列表?

使用 DB2 驱动程序从 Flyway 命令行获取连接错误