【发布时间】: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 方法的调用引起的,所以我不明白怎么可能出现错误。有错误的字段是日期,输入和输出表的字段格式相同