一直使用的是oracle,最近的工作是进行系统部署发布。将原使用oracle的数据库迁移到DB2数据库上,过程中遇到了一些问题,觉得有必要记述一下供大家分享。让后来者以解惑,让过来者而温故。由于以前未接触过DB2,有什么不正确的地方还请见谅,谢谢!这次工作也萌发了我要系统认真的学习一下DB2的欲望,O(∩_∩)O哈哈~
以下是记述的DB2抛出的问题:
1.COM.ibm.db2.jdbc.DB2Exception:[IBM][CLI Driver][DB2/SUN64]SQL0401N 运算"="的操作数的数据类型不兼容。 SQLSTATE=42818
记述:在SQL文中有的条件直接用 字段 = #参数# 的形式,当传入的参数为null的时候,就显出了上面这个问题。在DB2中,当确定一个字段值是null且要作为条件的时候,请使用 “is” 而不是“=”。那么当某个字段必须要用“=”,而是否要作为条件则根据参数的值进行判断的话,则可以在程序中用if或者用ibatis的时候在SQL的配置文件中用<isNotEmpty/>进行判断。
而这种情况,也可能会报:程序类型超出范围。这样的错误!
2.com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred while applying a parameter map.
--- Check the ManageLog.queryWarnModuleOlapFile-InlineParameterMap.
--- Check the statement (query failed).
--- Cause: COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver] CLI0109E 字符串数据右截断。 SQLSTATE=22001
Caused by: COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver] CLI0109E 字符串数据右截断。 SQLSTATE=22001
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:193)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:125)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:610)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:584)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:101)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:78)
at com.linkage.bi.logmonitor.module.LogHoldGraphModule.queryEtlLog(LogHoldGraphModule.java:66)
at com.linkage.bi.logmonitor.action.HoloGraphAction.view(HoloGraphAction.java:76)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:216)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at com.linkage.bace.core.act.MCRequestProcessor.process(MCRequestProcessor.java:94)
at com.linkage.bace.core.act.MCActionServlet.process(MCActionServlet.java:41)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.linkage.bi.util.SystemInfoFilter.doFilter(SystemInfoFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.linkage.bi.util.SystemInfoFilter.doFilter(SystemInfoFilter.java:94)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
记述:DB2中字符串右截断,即传入SQL文中的参数的长度大于数据表字段的设计长度。所谓的设计长度,即字段创建时定义的长度。出现上面这个错误,要么检查传入的参数是否正确,要么就是修改表字段的长度。
3. [级别: ERROR] [类名]: com.linkage.bi.util.PageList [方法名]: com.linkage.bi.util.PageList.<init>(PageList.java:277)
[输出信息]: com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred while applying a parameter map.
--- Check the LogGTAL.queryLoadFileCount-InlineParameterMap.
--- Check the statement (query failed).
--- Cause: COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/SUN64] SQL0203N 对列 "ONLY_UNIT_CODE" 的引用是模糊的。 SQLSTATE=42702
Caused by: COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/SUN64] SQL0203N 对列 "ONLY_UNIT_CODE" 的引用是模糊的。 SQLSTATE=42702
记述:这个问题是在SQL中使用的字段不明确。即SQL文中时候多表的时候,每个表都有别名,而在使用字段的时候没有明确的标注是哪个别名(表对象)中的字段。这个问题就要细心的检查了。O(∩_∩)O哈哈~
4.com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred while applying a parameter map.
--- Check the RunState.queryRunStateStatInfo-InlineParameterMap.
--- Check the statement (query failed).
--- Cause: COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/SUN64] SQL0206N "T1.SYSTEM_CODE" 在使用它的上下文中无效。 SQLSTATE=42703
Caused by: COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/SUN64] SQL0206N "T1.SYSTEM_CODE" 在使用它的上下文中无效。 SQLSTATE=42703
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:193)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:125)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:610)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:584)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:101)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:78)
at com.linkage.bi.dq.module.RunStateModule.queryRunStateStatInfo(RunStateModule.java:51)
at com.linkage.bi.logmonitor.action.IndexPageShowAction.execute(IndexPageShowAction.java:65)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at com.linkage.bace.core.act.MCRequestProcessor.process(MCRequestProcessor.java:94)
at com.linkage.bace.core.act.MCActionServlet.process(MCActionServlet.java:41)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.linkage.bi.util.SystemInfoFilter.doFilter(SystemInfoFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.linkage.bi.util.SystemInfoFilter.doFilter(SystemInfoFilter.java:94)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
记述:这个问题即使用的字段在所在的SQL文中使用的数据表没有被定义。这时候要么增加相应的字段,要么删除该字段在SQL文中的使用,当然要就系统逻辑的整体考虑。
5.警告:java.io.CharConversionException:EOF
记述:这个是说在打开某个页面的URL中存在“%”。最后在URL外加了一个处理的方法 encodeURIComponent()这个是在脚本中,在java中另行处理了,嘿嘿!
6.[级别: ERROR] [类名]: com.linkage.bi.dq.module.InterfaceRptModule [方法名]: com.linkage.bi.dq.module.InterfaceRptModule.queryReport(InterfaceRptModule.java:365)
[输出信息]: com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in config/ibatis/dq/interfacereport.xml.
--- The error occurred while applying a result map.
--- Check the InterfaceReport.queryReportCodeDB2-AutoResultMap.
--- The error happened while setting a property on the result object.
--- Cause: net.sf.cglib.beans.BulkBeanException
Caused by: net.sf.cglib.beans.BulkBeanException
com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in config/ibatis/dq/interfacereport.xml.
--- The error occurred while applying a result map.
--- Check the InterfaceReport.queryReportCodeDB2-AutoResultMap.
--- The error happened while setting a property on the result object.
--- Cause: net.sf.cglib.beans.BulkBeanException
Caused by: net.sf.cglib.beans.BulkBeanException
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:196)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:105)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:561)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:536)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:93)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:70)
at com.linkage.bi.dq.module.InterfaceRptModule.queryReport(InterfaceRptModule.java:358)
at com.linkage.bi.dq.action.InterfaceRptDealAction.execute(InterfaceRptDealAction.java:151)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at com.linkage.bace.core.act.MCRequestProcessor.process(MCRequestProcessor.java:94)
at com.linkage.bace.core.act.MCActionServlet.process(MCActionServlet.java:41)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.linkage.bi.util.SystemInfoFilter.doFilter(SystemInfoFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.linkage.bi.util.SystemInfoFilter.doFilter(SystemInfoFilter.java:94)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
Caused by: net.sf.cglib.beans.BulkBeanException
at com.linkage.bi.dq.bean.InterfaceRptBean$$BulkBeanByCGLIB$$4c5560ff.setPropertyValues(<generated>)
at com.ibatis.sqlmap.engine.accessplan.EnhancedPropertyAccessPlan.setProperties(EnhancedPropertyAccessPlan.java:33)
at com.ibatis.sqlmap.engine.exchange.JavaBeanDataExchange.setData(JavaBeanDataExchange.java:112)
at com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectValues(BasicResultMap.java:346)
at com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResultObject(RowHandlerCallback.java:63)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(SqlExecutor.java:395)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:185)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteQuery(GeneralStatement.java:213)
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:181)
... 31 more
Caused by: java.lang.NullPointerException
... 40 more
记述:记述:DB2中字段类型与javabean中属性定义类型不符或者从数据库中取得的字段的值的类型,在映射到javabean属性的时候与属性的类型不符。我这边产生这个问题是由于之前在表中增加了几个Integer型的字段,因此当时没有值,即字段值都是null的,而在javabean中定义的属性类型是Integer的,这样取得的数据值为null,那么在将取得的对象对应的映射到创建的javabean对象的时候不成功,即产生上述的问题。为了解决当前问题,我给新增的字段使用了VALUE()函数。O(∩_∩)O哈哈~