Mybatis调用oracle存储过程错误问题

J2EE 码拜 10年前 (2015-04-15) 2080次浏览 0个评论

在调用存储过程的时候,不知道下面这段代码到底是哪里错了,总是报in或out参数索引丢失,但是我看着好像哪里都没错,想让各位大神帮忙看下,这段代码中是哪里除了问题,谢谢。

oracle存储过程:

create or replace procedure pro_dept(dname in varchar2,cur_sys out sys_refcursor)
is
begin
     open cur_sys for select * from dept where dname like ""%||dname||%"";
end;

xml配置:

        <resultMap type="Dept" id="getDept">
		<id column="deptno" property="deptno"/>
		<result column="dname" property="dname"/>
		<result column="loc" property="loc"/>
	</resultMap>

	<!-- 调用存储过程返回结果集 -->
	<select id="callProcedure1" parameterType="java.util.Map">

		<![CDATA[ 
          call getuserby(#{dname,mode=IN,jdbcType=VARCHAR}, 
                         #{depts,mode=OUT,jdbcType=CURSOR,javaType=java.sql.ResultSet,resultMap=getDept}) 
        ]]>

	</select>

调用:

                Map<String, Object> param = new HashMap<String, Object>();
		param.put("dname", "A");

		procedureDao.callProcedure1(param);

		List<Dept> depts = (ArrayList<Dept>)param.get("depts");

		System.err.println(depts.size());

异常:

### Error querying database.  Cause: java.sql.SQLException: 索引中丢失  IN 或 OUT 参数:: 2
Mybatis调用oracle存储过程错误问题
你的输出参数在程序中没有传入!

//从游标返回结果集
public ResultSet getCursor(String dname)
{
try
{
......
stmt =(CallableStatement )conn.prepareCall("call pro_dept(?,?)");
stmt.setString(1,dname);
//注册游标对象类型
stmt.registerOutParameter(2,OracleTypes.CURSOR);
stmt.execute();
//返回结果集
ResultSet  Rs=(ResultSet)stmt.getObject(2);
}
catch(Exception e)
{
}
return Rs;
}
Mybatis调用oracle存储过程错误问题
引用 楼主 ck199007081001 的回复:

在调用存储过程的时候,不知道下面这段代码到底是哪里错了,总是报in或out参数索引丢失,但是我看着好像哪里都没错,想让各位大神帮忙看下,这段代码中是哪里除了问题,谢谢。

oracle存储过程:
SQL code?12345create or replace procedure pro_dept(dname in varchar2,cur_sys out sys_r……

谢谢,刚刚我按照你说的将代码进行了下修改,但是还是报了in或out索引丢失:

Map<String, Object> param = new HashMap<String, Object>();
param.put("dname", "A");
//在这将一个游标类型传过去
param.put("depts", OracleTypes.CURSOR);
Mybatis调用oracle存储过程错误问题
procedureDao.callProcedure1
你这个方法里面是怎么弄的?
Mybatis调用oracle存储过程错误问题
引用 3 楼 hzw2312 的回复:

procedureDao.callProcedure1
你这个方法里面是怎么弄的?

下面是接口和实现类

public interface IProcedureDao {

	List<Dept> callProcedure1(Map<String,Object> param);

}

public class ProcedureDaoImpl implements IProcedureDao {

	@Override
	public List<Dept> callProcedure1(Map<String, Object> param) {
		// TODO Auto-generated method stub
		SqlSession session = MybatisUtil.currentSession();
		IProcedureDao procedureDao = session.getMapper(IProcedureDao.class);
		List<Dept> depts = procedureDao.callProcedure1(param);
		MybatisUtil.closeSession();
		return depts;
	}

}
Mybatis调用oracle存储过程错误问题
40分
引用 4 楼 ck199007081001 的回复:

引用 3 楼 hzw2312 的回复:procedureDao.callProcedure1
你这个方法里面是怎么弄的?

下面是接口和实现类
Java code?12345678910111213141516171819public interface IProcedureDao {         List<Dept> callProcedure1(Map<S……

我凌乱了………

    

Mybatis调用oracle存储过程错误问题
引用 5 楼 hzw2312 的回复:

引用 4 楼 ck199007081001 的回复:引用 3 楼 hzw2312 的回复:procedureDao.callProcedure1
你这个方法里面是怎么弄的?

下面是接口和实现类
Java code?12345678910111213141516171819public interface IProcedureDao {         List<……

额,这个接口就是和Mapper文件形成映射,然后通过实现类调用。。。难道不是这样的吗?

Mybatis调用oracle存储过程错误问题
引用 5 楼 hzw2312 的回复:

引用 4 楼 ck199007081001 的回复:引用 3 楼 hzw2312 的回复:procedureDao.callProcedure1
你这个方法里面是怎么弄的?

下面是接口和实现类
Java code?12345678910111213141516171819public interface IProcedureDao {         List<……

谢谢你了,问题现在已经解决了。是我忘记加一个属性了,还有就是如果我传游标类型参数过去也是可行的。还是非常感谢你的。结贴了

statementType="CALLABLE"
Mybatis调用oracle存储过程错误问题
楼主,求java部分,和xml部分,代码,,我按照你上面代码出不来。。。
Mybatis调用oracle存储过程错误问题
大神们,我已经提问问题了,,知道了来这里回答下。。。
http://bbs.csdn.net/topics/390866155?page=1#post-398024126
Mybatis调用oracle存储过程错误问题
楼主您的发件我这里没有收到额。。。能不能再发下,代码贴到我那个帖子里,或者文件的话发我qq邮箱吧,405099147@qq.com

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Mybatis调用oracle存储过程错误问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!