Oracle触发器失败的原因是什么



首先,让我简单地解释一下我的应用程序是如何工作的:

该应用程序处理交易,这些交易以XML文档的形式存储在我们的数据库(Oracle11g)中。包含这些信息的表定义如下:

table T_MYDEALS (
    DEAL_ID number(9, 0) not null,
    DEAL_XML xmltype
)

当我们在这个表中更新或插入新项时,我们有一个触发器,它将读取(使用XPath)这个XML,并填充其他一些元数据表。

一切都很好,除了我的机器。

现在的问题

当我在我的机器上运行应用程序时(即Tomcat在我的Eclipse中运行,但连接到Homologation DB),触发器失败,并出现以下错误:

WARN  [org.hibernate.util.JDBCExceptionReporter] SQL Error: 1722, SQLState: 42000
ERROR [org.hibernate.util.JDBCExceptionReporter] ORA-01722: invalid number
ORA-06512: at "MY_SCHEMA.AFTER_R_INSERT_MYDEAL", line 628
ORA-04088: error during execution of trigger 'MY_SCHEMA.AFTER_R_INSERT_MYDEAL'

对不起,出于安全考虑,我不能在这里扣动扳机。请注意,行628位于触发代码的末尾。

我的测试

因此,我试图理解为什么这个错误会发生在我的机器上(因为它只发生在我自己的机器上,我的同事都没有遇到这个问题)。我不能说它什么时候开始停止工作,也许是我最近换电脑的时候?

首先,我检查了源代码,然后检查了数据库连接,但一切似乎都是正确的。我还切换到调试模式,查看发送到DB的XML,或者至少查看我们的HibernateXMLType(它是org.hibernate.usertype.UserType的扩展,用于将我们的XML转换为Oracle可读的数据)。但这里也没有发现任何错误。

我为您保存了许多在我这边完成的测试,但我最近的一个测试是获得一个新的Tomcat服务器,并部署一个部署在环境中的WAR(例如,Homologation)。然后,我执行了相同的测试,但触发器仍然失败。

到目前为止,我已经排除了以下嫌疑人:

  • 源代码,因为我还测试了部署在环境上并且正常工作的WAR中的应用程序
  • DB本身,因为我连接到与工作环境相同的数据库。我还尝试了另一个DB,结果是一样的
  • 数据用于我的测试,因为如果我试图保存相同的交易,但使用Homologation环境,它会起作用
  • JDK,因为我还将JDK更改为新的JDK
  • Eclipse,因为我最近的测试是在Eclipse之外完成的
  • Tomcat服务器,因为我还尝试了一个新的Tomcat

我想知道的是,我的WindowsXP环境是否有一些特定的编码配置,它可以"转换"XML中的一些数据并使它们成为

我的问题

  • 我可能在测试中忘记了哪些可能的因素
  • 有没有一种方法可以准确地知道Oracle触发器处理的XML(如果可能的话,无需在Oracle实例上安装任何东西,因为我无法控制它)

我知道我没有提供很多信息,但如果你能给我一些提示或想法,我将非常感激!

谨致问候。


技术信息:Java 1.6、Oracle 11g、Tomcat 5.5.23、JSF 1.2、Hibernate 3.3

这可能是本地化吗?例如,在您的系统中,您使用"1,5"而不是"1.5"填充xml。Hibernate报告的错误清楚地指向了这个方向。您可以禁用触发器并查看该表中的xmltype结果。如果你或你的同事可以通过类似SQL Developer的客户端访问数据库,你可以尝试"手动"在触发器中运行代码。

当您遇到ORA-01722时,请参阅此处了解信息和可能的操作。

相关内容

  • 没有找到相关文章

最新更新