【问题标题】:Talend BatchUpdateException not caught while using tOracleOutput使用 tOracleOutput 时未捕获 Talend BatchUpdateException
【发布时间】:2014-07-07 08:43:08
【问题描述】:

我正在开发一项工作,我将数据从一些表传输到其他一些表。有时输入中的字段为空,然后 Talend 调用方法 oracle.jdbc.driver.setNull。有一次,我遇到了 Talend 未捕获的 Oracle 错误。错误是:ORA-01401 value inserted too big for the column。但此时 Talend 正尝试在接受它的字段中插入 Null 值。

我不明白为什么我有这个错误以及为什么 Talend 没有发现它。

这是一个例外:

Exception in component tOracleOutput_1
java.sql.BatchUpdateException: ORA-01401: valeur insérée trop grande pour colonne

at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:459)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:4373)
at oracle.jdbc.driver.OraclePreparedStatement.checkBindTypes(OraclePreparedStatement.java:3650)
at oracle.jdbc.driver.OraclePreparedStatement.setNull(OraclePreparedStatement.java:1435)
at maxmigtransformation.t_dm_all_0_1.T_DM_ALL.tOracleInput_1Process(T_DM_ALL.java:11910)
at maxmigtransformation.t_dm_all_0_1.T_DM_ALL.runJobInTOS(T_DM_ALL.java:30394)
at maxmigtransformation.t_dm_all_0_1.T_DM_ALL.main(T_DM_ALL.java:29916)

这是作业的截图:

【问题讨论】:

  • 我不太确定我明白你在这里问什么。您是说当尝试将空值插入可空列时,Oracle 会抛出 ORA-01401 错误?我假设您已经通过服务器端跟踪/登录运行了这项工作,以查看导致问题的确切原因?您是否希望 Talend 对这个错误进行处理然后继续?这样做的默认行为是退出提交,这就是 Talend 似乎正在做的事情。
  • 我有 2 个问题:我不明白为什么会出现 Oracle 错误,也不明白为什么 talend 没有发现错误。我无法访问数据库的日志。
  • 我猜这个错误实际上是由它认为的原因引起的:你试图插入/更新一个对于该字段来说太大的值。检查您要插入/更新的数据以及您要插入/更新的表中的字段长度。如果您禁用组件的“出错时死”复选框,那么 Talend 应该会捕获错误并继续执行,但实际上您最好修复目标表或源数据。如果您无权更改目标表,则可以对数据进行子串化以安全地截断它。
  • 我可以在堆栈跟踪中看到错误是由 setNull 方法的调用引起的,所以我不明白怎么可能出现错误。有错误的字段是日期,输入和输出表的字段格式相同

标签: java oracle talend


【解决方案1】:

我终于解决了我的问题。堆栈跟踪未指示正确的行号。 使用拒绝链接,我看到问题不在堆栈跟踪显示的行上。

实际上有一个字段对于我想要插入的数据量来说太短了,但不是堆栈跟踪显示的那个。我不知道为什么错误说第 11910 行。

为了弄清楚我使用了拒绝链接,然后我手动检查了每个字段以找出错误所在。

【讨论】:

  • 那么错误是因为数据对于列来说太大了吗?如果您编辑帖子以显示您为修复它所做的工作,而不是仅仅显示您如何诊断真正的问题(尽管这也很有用),那么对于遇到此错误的其他人会更有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多