读书人

错误原因:org.springframework.jdbc.

发布时间: 2011-11-25 21:31:10 作者: rapoo

求MyBatis调用存储过程的问题
我现在的项目是Strust2+Spring+ MyBatis3.0,因为项目中有个需求需要调用存储过程,我在MyBatis的配置文件里这样写了

XML code
<!-- 调用存储过程计算请假时长 -->          <parameterMap type="map" id="LeaveApplyDetailMap">       <parameter property="strEmployeeNo" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>       <parameter property="beginDate" jdbcType="DATE" javaType="java.util.Date" mode="IN"/>       <parameter property="endDate" jdbcType="DATE" javaType="java.util.Date" mode="IN"/>       <parameter property="typeNo" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>       <parameter property="resultCode" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>       <parameter property="resultData" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>    </parameterMap>        <!-- 检查请假日期是否有效 -->    <select id="LeaveCheck"  parameterMap="LeaveApplyDetailMap">        CALL PKG_ATT.SP_Get_LeaveCheck(#{strEmployeeNo},#{beginDate},#{endDate},#{typeNo},#{resultCode},#{resultData})    </select>


这时在程序里调用时是这样写的:
Java code
Map map = new HashMap<String, Object>();        map.put("strEmployeeNo",detail.getStrEmployeeNo());        map.put("beginDate", detail.getBeginDate());        map.put("endDate", detail.getEndDate());        map.put("typeNo", detail.getStrTypeNo());        map.put("resultCode", "0");        map.put("resultData", "0");        dao.get("LeaveCheck", map);

程序调用时就报错的,
DEBUG - ==> Executing: CALL PKG_ATT.SP_Get_LeaveCheck(?,?,?,?,?,?)
DEBUG - ==> Parameters: 11050020(String), 2011-06-15 09:21:00.0(Timestamp), 2011-06-15 20:21:00.0(Timestamp), 1005(String), 0(String), 0(String)
INFO - Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml]
INFO - SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
DEBUG - xxx Connection Closed
INFO - [c3p0] Exceptions occurred while trying to close a PooledConnection's resources normally.
ERROR - mapperKeyId:【LeaveCheck】执行失败 ;错误原因:org.springframework.jdbc.UncategorizedSQLException:
### Error querying database. Cause: java.sql.SQLException: 无法从套接字读取更多的数据
### The error may involve cn.machi.oa.atte.dao.impl.LeaveApplyDAOImpl.LeaveApplyDetailMap
### The error occurred while setting parameters
### Cause: java.sql.SQLException: 无法从套接字读取更多的数据
; uncategorized SQLException for SQL []; SQL state [null]; error code [17410]; 无法从套接字读取更多的数据; nested exception is java.sql.SQLException: 无法从套接字读取更多的数据
org.springframework.jdbc.UncategorizedSQLException:
### Error querying database. Cause: java.sql.SQLException: 无法从套接字读取更多的数据
### The error may involve cn.machi.oa.atte.dao.impl.LeaveApplyDAOImpl.LeaveApplyDetailMap
### The error occurred while setting parameters
### Cause: java.sql.SQLException: 无法从套接字读取更多的数据
; uncategorized SQLException for SQL []; SQL state [null]; error code [17410]; 无法从套接字读取更多的数据; nested exception is java.sql.SQLException: 无法从套接字读取更多的数据
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)


at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:65)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:345)
at $Proxy0.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:158)
at cn.machi.framework.dao.impl.BaseDAOImpl.get(BaseDAOImpl.java:66)
at cn.machi.framework.dao.impl.BaseDAOImpl$$FastClassByCGLIB$$fd01e960.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:688)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:42)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:55)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621)
at cn.machi.oa.atte.dao.impl.LeaveApplyDAOImpl$$EnhancerByCGLIB$$5c7d549c.get(<generated>)
at cn.machi.oa.atte.service.impl.LeaveApplyServiceImpl.computeTotalHour(LeaveApplyServiceImpl.java:313)


在网上找了很多类似的问题,都没能解决,不知何故,
这里说明一下,数据库是Oracle,连接池是c3p0
当调用没有返回值的存储过程时是正常的,有返回参数的都报这样的错。不知是我的写法不对还是jar包的问题。
求解!

[解决办法]
不懂
友情帮顶
...
[解决办法]
楼主用的是什么数据库的驱动包
据说是需要更换oracle的驱动包
[解决办法]
这个是你的SQL有问题
存储过程写的不正确
你把这些参数
Parameters: 11050020(String), 2011-06-15 09:21:00.0(Timestamp), 2011-06-15 20:21:00.0(Timestamp), 1005(String), 0(String), 0(String)

替换到存储过程中 用SQL直接调用看是否报错
[解决办法]

XML code
<select id="LeaveCheck"  parameterMap="LeaveApplyDetailMap">        CALL PKG_ATT.SP_Get_LeaveCheck(#{strEmployeeNo},#{beginDate},#{endDate},#{typeNo},#{resultCode},#{resultData})    </select>换成<procedure id="LeaveCheck"  parameterMap="LeaveApplyDetailMap">        {CALL PKG_ATT.SP_Get_LeaveCheck(?,?,?,?,?,?)}</procedure>试试
[解决办法]
ibatis调用存储过程
一般数据量大的话 是先执行存储过程

将数据插入到临时表里

然后通过查询临时表 将数据显示

并不是你想的 直接些个调用存储过程的配置 正好将数据返回出来
存储过程的配置只能返回游标
[解决办法]
好像报的还是环境问题,更换跟换包吧。

再试试。
[解决办法]
问题解决了,楼楼主可以结贴了,你是否也有自定义的分页工具插件?有的就修改下
StatementHandler handler = (StatementHandler) ReflectUtil
.getFieldValue(statement, "delegate");

// 增加CallableStatementHandler判断,如果是存储过程,则不执行下面的过程
if (handler instanceof PreparedStatementHandler)
{
.......
}

增加一个判断,就不会强行转化成preparedstatement了,呵呵

读书人网 >J2EE开发

热点推荐