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

时间:2011-06-28 13:16:09

标签: java oracle triggers ora-04088

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

应用程序处理交易,这些交易作为XML文档存储在我们的数据库(Oracle 11g)中。包含这些信息的表定义如下:

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行位于触发代码的末尾。

我的测试

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

首先,我检查源代码,然后检查我的数据库连接,但一切看起来都是正确的。 我还调试了调试模式以查看发送给数据库的XML,或至少在HibernateXMLTypeorg.hibernate.usertype.UserType的扩展名中查看,用于将我们的XML转换为Oracle可读的数据)。但这里也没有发现任何错误。

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

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

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

我想知道的是,如果我的Windows XP环境有一些特定的编码配置,它会“转换”XML中的某些数据并制作它们

我的问题

  • 在测试中我可能忘记了哪些可能的元素?
  • 有没有办法确切知道Oracle触发器处理的XML(如果可能的话,不在Oracle实例上安装任何东西,因为我对它没有任何控制权)?

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

问候。


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

1 个答案:

答案 0 :(得分:5)

可能是本地化吗?在您的系统上,您将使用“1,5”而不是“1.5”填充xml。 Hibernate报告的错误明确指向了这个方向。您可以禁用触发器并查看该表中生成的xmltype的内容。如果您或您的某个同事可以通过SQL Developer(如客户端)访问数据库,您可以尝试在“触发器”中“手动”运行代码。

有关您遇到ORA-01722时的信息和可能的操作,请参阅here