0 0

nested exception is java.sql.BatchUpdateException: 批处理中出现错误: ORA-00972: 标识符过长5

最近开发项目,跑批处理遇到一个问题:
2013-07-28 09:53:35,715[P17Quartz_CAScheduler_Worker-7]ERROR [JobRunShell]run(line:211)Job DEFAULT.propertySmsJobDetail threw an unhandled Exception:
org.springframework.jdbc.UncategorizedSQLException: StatementCallback; uncategorized SQLException for SQL [update T_CC_L2_SMS_Send set LastUpt_Dttm=to_date('2013-07-28 09:53:35','yyyy-mm-dd hh24:mi:ss'), ENABLE_FLG = '2' where ACT_ID =350791104]; SQL state [null]; error code [17081]; 批处理中出现错误: ORA-00972: 标识符过长
; nested exception is java.sql.BatchUpdateException: 批处理中出现错误: ORA-00972: 标识符过长

at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.translate(SQLStateSQLExceptionTranslator.java:124)
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.translate(SQLErrorCodeSQLExceptionTranslator.java:322)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:407)
at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:559)
at com.cpic.p17.common.dao.impl.SmsSendDAOImpl.bachUpdate(SmsSendDAOImpl.java:228)
at com.cpic.p17.common.service.impl.SmsSendServiceImpl.bachUpdate(SmsSendServiceImpl.java:346)
at sun.reflect.GeneratedMethodAccessor845.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy408.bachUpdate(Unknown Source)
at com.cpic.p17.property.service.impl.SurveyMessageImpl.messageHandle(SurveyMessageImpl.java:535)
at com.cpic.p17.property.service.impl.SurveyMessageImpl.surveyMessageHandle(SurveyMessageImpl.java:125)
at com.cpic.p17.property.quartz.SurveyMessageSchedulJob.executeInternal(SurveyMessageSchedulJob.java:47)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525)
Caused by: java.sql.BatchUpdateException: 批处理中出现错误: ORA-00972: 标识符过长

at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:415)
at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:455)
at oracle.jdbc.driver.OracleStatement.executeBatch(OracleStatement.java:3961)
at weblogic.jdbc.wrapper.Statement_oracle_jdbc_driver_T4CStatement.executeBatch(Unknown Source)
at org.springframework.jdbc.core.JdbcTemplate$1BatchUpdateStatementCallback.doInStatement(JdbcTemplate.java:540)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:396)
... 21 more

==============================================
报错是因为SQL语句:
update T_CC_L2_SMS_Send set LastUpt_Dttm=to_date('2013-07-28 09:53:35','yyyy-mm-dd hh24:mi:ss'), ENABLE_FLG = '2' where ACT_ID =350791104

但是该语句在PL-SQL 单独运行时正常的。 而且该quartz的从去年9月份到现在都没有改动过。 昨天忽然出错。
我初步分析可能原因如下:

1  因为报错的方法如下, 怀疑入参的数据组的长度,超出的batchUpdate的,比如达到 1000条。
/**
* SQL批处理
*/
public void bachUpdate(String[] sql){
     this.getJdbcTemplate().batchUpdate(sql);
}

2 怀疑SQL:update T_CC_L2_SMS_Send set LastUpt_Dttm=to_date('2013-07-28 09:53:35','yyyy-mm-dd hh24:mi:ss'), ENABLE_FLG = '2' where ACT_ID =350791104
其中【ACT_ID =350791104】 应该写成【ACT_ID ='350791104'】,但是该字段act_id 的类型为number(10) ,按理应该可以执行的。

3 怀疑因为是批量处理,前面一批SQL 是insert语句,刚巧这个update语句是紧排在insert后面。 意思是出错的是上一个SQL,日志截获的是下一个SQL。
形如:
insert …………;
insert …………;
insert …………;(此句报错)
update T_CC_L2_SMS_Send set LastUpt_Dttm=to_date('2013-07-28 09:53:35','yyyy-mm-dd hh24:mi:ss'), ENABLE_FLG = '2' where ACT_ID =350791104 (拦截此句)


网上关于标识符过长的解释 都无法说明原因;

往各位帮忙解答!

 
2013年7月29日 08:57

1个答案 按时间排序 按投票排序

0 0

把sql都保存下来,启用回滚单独用junit测试下,1.一条一条测试,2.insert和update分开测试,3.使用spring提供的批处理insert,update分开测试,http://hi.baidu.com/xulong7814/item/65ac6a7dddb1a6336f29f67e

2013年7月29日 09:48

相关推荐

Global site tag (gtag.js) - Google Analytics