当前位置:编程学习 > JAVA >>

ibatis调用存储过程分页问题

xml文件:

<typeAlias alias="vpmnBeanModel" type="com.znwbb.vpmn.bean.Vpmn"/>

<resultMap id="vpmnInfo" class="vpmnBeanModel">
    <result property = "callbegintime" column = "callbegintime"/>
    <result property = "calltype" column = "calltype"/>
    <result property = "callduration" column = "callduration"/>
    <result property = "callingpartynumber" column = "callingpartynumber"/>
    <result property = "calledpartynumber" column = "calledpartynumber"/>
</resultMap>

<parameterMap id="vpmnSelect" class="java.util.HashMap">
           <parameter property="cur_sql" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet"   resultMap="vpmnInfo" mode="OUT"/>
           <parameter property="v_rowcount" jdbcType="INT" javaType="java.lang.Integer" mode="OUT"/>
           <parameter property="in_str_begintime" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN"/>
           <parameter property="in_str_endtime" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN"/>
           <parameter property="in_call" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN"/>
           <parameter property="in_called" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN"/> 
           <parameter property="in_currentpage" jdbcType="INT" javaType="java.lang.Integer" mode="IN"/> 
           <parameter property="in_pagesize" jdbcType="INT" javaType="java.lang.Integer" mode="IN"/> 
           <parameter property="in_qrytype" jdbcType="INT" javaType="java.lang.Integer" mode="IN"/> 
</parameterMap>

<procedure id="vpmnprom" parameterMap="vpmnSelect">
    <![CDATA[{call ireport_vpmn(?,?,?,?,?,?,?,?,?)} ]]> 
</procedure>




Java:

   public List<Vpmn> vpmnBySelect(Vpmn vpmn, int currentPage, int pageSize, int querytype)
    {
        Map map = new HashMap();
        
        map.put("cur_sql", OracleTypes.CURSOR);
        
        map.put("v_rowcount", java.sql.Types.INTEGER);
        
        map.put("in_str_begintime", vpmn.getStarttime() );
      
        map.put("in_str_endtime", vpmn.getEndtime());
      
        map.put("in_call", vpmn.getCallingpartynumber() );

        map.put("in_called", vpmn.getCalledpartynumber());
        
        map.put("in_currentpage", currentPage );
        
        map.put("in_pagesize", pageSize);
      
        map.put("in_qrytype", querytype);
                
        getSqlMapClientTemplate().queryForList("vpmnprom", map);        
        
        @SuppressWarnings("unused")
        List list = (List) map.get("cur_sql");
        int result = (Integer) map.get("v_rowcount");

        
        if (list == null || list.size() == 0 || result == 0) 
        {
            list = new ArrayList();  
        }
        return list; 
    }


以上是代码,存储过程应该没什么问题,因为我在sql plus中执行是没问题,但是在调用的时候,他总是说我的输出参数有问题,执行到红色部分时就出错,报错信息如下:
org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [17004]; --- The error occurred in com/znwbb/vpmn/dao/xml/vpmn.xml. --- The error occurred while executing query procedure. --- Check the {call ireport_vpmn(?,?,?,?,?,?,?,?,?)}. --- Check the output parameters (register output parameters failed).

请问各位有什么办法解决???? --------------------编程问答-------------------- 参数应该是#参数#把
 调用 map.put("cur_sql", "参数");
--------------------编程问答--------------------
引用 1 楼 tanyue110 的回复:
参数应该是#参数#把
 调用 map.put("cur_sql", "参数");


cur_sql是一个游标,那样写可以的,是能得到游标返回的结果集,
v_rowcount是表示总记录数的,是int型的(我不加这个就不会报错,就可以有正确数据) --------------------编程问答-------------------- <parameter property="v_rowcount" jdbcType="number" javaType="java.lang.Integer" mode="OUT"/>


  你是什么数据库 --------------------编程问答-------------------- 终于知道错误了
   <procedure id="vpmnprom" parameterMap="Integer">
        <![CDATA[{call ireport_vpmn(?,?,?,?,?,?,?,?,?)} ]]> 
   </procedure>


--------------------编程问答-------------------- <select id="selectCount" resultClass="Integer">
select count(1) from elca_dubious_attach_info_tb where
#logtime2#>logtime and logtime> #logtime#
</select>


这是我写的返回的也是int --------------------编程问答-------------------- 检查输出参数类型,并设置。 --------------------编程问答--------------------
引用 4 楼 tanyue110 的回复:
终于知道错误了
  <procedure id="vpmnprom" parameterMap="Integer">
  <![CDATA[{call ireport_vpmn(?,?,?,?,?,?,?,?,?)} ]]> 
  </procedure>


数据库是Oracle,parameterMap="Integer"??返回的结果集是不是对应bean的么,对于这个v_rowcount我只要它的记录数就可以了吧,这样我就可以进行其他的运算,这边直接返回一个Integer不可能吧,难道要专门写一个<parameterMap>,就只为返回它?????

我还是没太明白,麻烦你能否在将明白点 --------------------编程问答--------------------
引用 5 楼 tanyue110 的回复:
<select id="selectCount" resultClass="Integer">
select count(1) from elca_dubious_attach_info_tb where
#logtime2#>logtime and logtime> #logtime#
</select>


这是我写的返回的也是int


这种直接用sql获取条数的有用过,但是这个问题是在存储过程中,过程中是可以获取到得,我现在是要调用这个过程,就需要输出它吧,但是没成功,出了这样的错 --------------------编程问答-------------------- 终于知道错误了
  <procedure id="vpmnprom" parameterMap="Integer">
  <![CDATA[{call ireport_vpmn(?,?,?,?,?,?,?,?,?)} ]]>  
  </procedure>

开始没认真看

Oracle的是把,那就明白了他的错误是无效的列类型。你检查为什么把。
返回一个Map对吧这个应该是可以的  --------------------编程问答--------------------
引用 6 楼 softroad 的回复:
检查输出参数类型,并设置。

输出参数就是一个游标(返回的是查询的结果集),和一个int型的参数  
<parameter property="cur_sql" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet"   resultMap="vpmnInfo" mode="OUT"/>
<parameter property="v_rowcount" jdbcType="INT" javaType="java.lang.Integer" mode="OUT"/>
这两句不是设置吗???要么还是还需要在其他地方设置下???? --------------------编程问答-------------------- 顶下 --------------------编程问答-------------------- 没明白为什么该成“parameterMap="Integer"”就可以了
传进去的不也是个map吗??

求解帮顶

good luck --------------------编程问答--------------------
引用 12 楼 villagehead 的回复:
没明白为什么该成“parameterMap="Integer"”就可以了
传进去的不也是个map吗??

求解帮顶

good luck

这个貌似不行,我记得当时我有按照他说的那种改过,但还是有错,最后没能解决掉,所以就没用这个了。不过一直到现在都还没人给出个解决方法,所以我也就还没结贴,还是寄希望于谁能帮忙解决下的
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,