0 0

IBATIS中调用存储过程时,如果过程有两个OUT时,如何取到过程中的OUT的值 10

<parameterMap id="CheckFactorCascadeMap" class="java.util.HashMap">
		<parameter property="from" jdbcType="NUMBER" javaType="java.lang.Integer" mode="IN"/>
		<parameter property="to" jdbcType="NUMBER" javaType="java.lang.Integer" mode="IN"/>
		<parameter property="xx" jdbcType="NUMBER" javaType="java.lang.Integer" mode="OUT"/>
		<parameter property="result" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
	</parameterMap>
	
	<procedure id="factor_CheckFactorCascade" parameterMap="CheckFactorCascadeMap">
		{ call TTT(?,?,?,?)}
	</procedure>



我不知道什么原因,当只有一个OUT的时候,能正常取到OUT的值,有两个OUT的时候,就会报错,错误是说“列类型无效”,我的过程很简单,主要是在测试这个调用的问题:
过程如下:
create or replace procedure TTT(v1 number,v2 number,v3 out number,v4 out varchar2) is
begin
  v3:=100;
  v4:='cccc';
end TTT;

希望有遇到这个问题的朋友帮帮忙,指导一下!~。。十分感谢
问题补充:
我用的是spring2.5 + ibatis +oracle进行开发
Controller代码:
--------------------------------------------------------------------
@RequestMapping("/verifymanager/verifyfactor_ajaxForDelete.do")
public void ajaxFordelete(HttpServletRequest request,
HttpServletResponse response){
String[] factorIds = request.getParameterValues("factorId");
System.out.println(factorIds.toString());
//我在这里封装一个Map,在这里将入参的数据传给ibatis
Map map = new HashMap();
map.put("from", new Integer(1));
map.put("to", new Integer(2));
//调用service层
this.verifyManager.CheckFactorCascade(map);
System.out.println("dd");

}
service层实现类的代码:
--------------------------------------------------------
public Map CheckFactorCascade(Map map) {
System.out.println(map);
this.getSqlMapClientTemplate().queryForObject("factor_CheckFactorCascade", map);
//以下是我要查看out里的值有没有正常取到
                System.out.println(map.get("xx"));
System.out.println(map.get("result"));
return map;
}

------------------------------------------------------
我现在捣鼓了一上午,发现只要把过程的OUT的类型改成VARCHAR2,ibatis里的改成String就不会报错,可以正常拿到OUT的值,真是奇怪了,我的ibtis的版本是2.4.667

问题补充:
控制台输出的错误(太长了,我选了主要的贴上)
--------------------------------------------------
2008-10-31 13:44:32.625::WARN:  /capaa/verifymanager/verifyfactor_ajaxForDelete.do
org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [17004];  
--- The error occurred in com/hzmc/capaa/domain/persistence/factor/verifymanager.xml. 
--- The error occurred while executing query procedure. 
--- Check the { ?=call TT(?)}. 
--- Check the output parameters (register output parameters failed). 
--- Cause: java.sql.SQLException: 无效的列类型; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:  
--- The error occurred in com/hzmc/capaa/domain/persistence/factor/verifymanager.xml. 
--- The error occurred while executing query procedure. 
--- Check the { ?=call TT(?)}. 
--- Check the output parameters (register output parameters failed). 
--- Cause: java.sql.SQLException: 无效的列类型
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.translate(SQLStateSQLExceptionTranslator.java:124)
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.translate(SQLErrorCodeSQLExceptionTranslator.java:322)
at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:212)
at org.springframework.orm.ibatis.SqlMapClientTemplate.queryForObject(SqlMapClientTemplate.java:271)
at com.hzmc.capaa.business.verifymanager.impl.VerifyManagerImpl.CheckFactorCascade(VerifyManagerImpl.java:96)
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:585)
问题补充:
还是不行的,我都有试过,只要是过程的OUT返回的是NUMBER类型,或都函数返回的是NUMBER类型,就会出错,改成VARCHAR2就可以。。我打算另外写个简单的工程测试一下,我开有点怀疑环境的问题。。谢谢大家的热心。。
2008年10月31日 09:59

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

0 0

<parameterMap id="CheckFactorCascadeMap" class="java.util.HashMap">
里面把 mode="OUT" 的<parameter >放在前面.

2008年10月31日 16:31
0 0

<procedure id="factor_CheckFactorCascade" parameterMap="CheckFactorCascadeMap">  
        { call TTT(?,?,?,?)}  
</procedure>
你加个 resultClass = "java.util.Map" 试试看行不行?```

2008年10月31日 16:28
0 0

你的取值的代码发下来看一下,估计是取值的顺序问题

2008年10月31日 13:05
0 0

报错?```什么地方报错,把JAVA代码也COPY上来看看``

2008年10月31日 12:04

相关推荐

    ibatIS调用存储过程

    ibatIS调用存储过程是数据库操作中常见的一种技术,特别是在复杂的业务逻辑处理或数据批量操作时,存储过程能够提供更高的效率和更好的性能。本文将深入探讨如何在ibatIS框架中调用存储过程,以及涉及到的相关知识点...

    ibatis调用存储过程

    - 如果存储过程有输出参数,你需要在参数Map中声明`mode="OUT"`,例如`#{outputParam, mode=OUT, jdbcType=INTEGER}`。 - 为确保正确映射结果集,你需要清楚地了解存储过程的输出结构。 通过以上步骤,你可以在...

    Ibatis调用存储过程调用存储过程

    ### Ibatis调用存储过程详解 #### 一、引言 在实际的软件开发过程中,存储过程因其执行效率高及...这些步骤结合起来,使得开发者能够在Ibatis框架下灵活高效地使用存储过程功能,从而更好地满足复杂业务需求的处理。

    ibatis调用存储过程.txt

    1. **参数传递**:如果存储过程有输入参数,则需要在映射文件中使用`&lt;parameter&gt;`标签进行配置,并在Java代码中提供相应的参数值。 2. **输出参数**:对于有输出参数的存储过程,需要使用`&lt;resultMap&gt;`来定义输出...

    ibatis调用oracle存储过程分页

    ibatis调用oracle存储过程分页

    ibatis调用oracle存储过程

    在本例中,我们创建了两个存储过程:`GetSingleEmpRS` 和 `GetDoubleEmpRS`,分别用于获取单个部门的所有员工信息和获取指定部门及其以上部门的所有员工信息。 ### ibatis调用Oracle存储过程的步骤 #### 步骤一:...

    ibatis调存储过程返回游标

    当需要频繁执行复杂的数据库操作时,使用存储过程可以显著提高性能和安全性。 #### iBatis中的参数映射 在iBatis中,通过`parameterMap`元素来定义存储过程的参数。例如,在给定的代码片段中,可以看到以下参数...

    ibatis调用存储过程介绍

    在Java开发中,使用iBATIS(现在称为MyBatis)作为持久层框架时,调用数据库的存储过程是一种常见的需求。本文将详细介绍如何使用iBATIS调用存储过程,并提供一个简单的示例来说明其过程。 首先,我们需要在数据库...

    ibatis与存储过程(带输出参数的应用)

    本主题将深入探讨如何在Ibatis中使用存储过程,特别是涉及带有输出参数的存储过程。 Ibatis,由MyBatis的前身发展而来,它是一个轻量级的ORM(对象关系映射)框架,允许开发者编写SQL语句并与Java对象进行绑定,而...

    ibatis官方中文文档

    在iBATIS中调用存储过程通常涉及以下几个步骤: 1. **配置存储过程**:在SQL映射文件中定义存储过程的标签,指定存储过程名以及输入和输出参数。 2. **设置参数**:在Java代码中创建参数对象,根据存储过程的需求...

    ibatis调用oracle的函数,存储过程的方法 IN 和OUT /游标

    在iBatis中,当存储过程返回一个游标时,你可以将其映射为一个Java List。为此,你需要在Java方法中声明一个List类型的参数,而在SQL映射文件中,使用`&lt;resultMap&gt;`定义一个结果集映射,然后在`&lt;selectResult&gt;`标签...

    iBatis调用存储过程

    iBatis调用存储过程

    IBatis中的存储过程应用实例

    在本例中,我们有一个名为`P_UpdateUserName`的存储过程,它接受两个输入参数`@UserName`和`@NewPassWord`,以及一个输出参数`@UpResult`。存储过程的目的是更新用户密码,如果更新成功,`@UpResult`将被设置为1,...

    IBatis查删改查与调用存储过程 mysql数据库

    "IBatis查删改查与调用存储过程 mysql数据库" 这个标题揭示了本文将深入探讨如何使用IBatis框架在MySQL数据库中执行基本的CRUD(创建、读取、更新、删除)操作,以及如何调用存储过程。IBatis是一个轻量级的Java持久...

    ibatis调用oracle的函数,存储过程的方法

    在Oracle数据库中,函数和存储过程是两种常用的PL/SQL编程元素,它们允许开发者封装复杂的逻辑,以便在数据库层面上执行。Ibatis,一个轻量级的Java持久层框架,提供了与数据库交互的能力,包括调用这些Oracle的函数...

    Ibatis调用Oracle存储过程返回自定义类型

    本文将深入探讨如何使用Ibatis框架来调用Oracle数据库中的存储过程,并实现返回自定义类型的处理方法。 #### Oracle自定义类型简介 Oracle支持用户自定义数据类型,这为复杂数据结构的应用提供了极大的便利。...

    J2EE+Spring+Ibatis2+blazeds存储过程调用返回结果集

    在这个项目中,我们结合了Spring框架、Ibatis持久层框架以及Blazeds技术,来演示如何调用存储过程并处理返回的结果集。下面将详细讲解这些技术的运用。 首先,J2EE是一种广泛用于开发分布式企业应用的平台,它提供...

    ibatis开发过程取值问题

    例如,如果你在SQL语句中使用“#{table_name}”,Ibatis会尝试将这个占位符替换为实际的参数值,而使用“##{table_name}”则会将其作为一个完整的字符串保留下来,不会进行替换。 在实际的开发中,我们常常遇到如下...

Global site tag (gtag.js) - Google Analytics