Oracle的Mybatis Ref Cursor问题

时间:2010-11-03 21:17:26

标签: java oracle oracle10g ibatis

我正在使用Java和Ibatis在oracle数据库上调用存储过程。我似乎在设置参数问题。

商店程序如下所示:

PROCEDURE Get_Semployees_By_Clt_ID
    (
        client_id IN HRIS.SEMPLOYEES.SEE_CLT_ID%TYPE,    
        ref_cursor OUT SYS_REFCURSOR
    );

我的Ibatis SqlMap:

<sqlMap namespace="Foo">


<resultMap id="employee-map" class="MyFoo">  
   <result property="foo1" column="foo1"/>  
   <result property="foo2" column="foo2"/>  
</resultMap>   

<parameterMap id="clientEmployeesParms" class="java.util.Map" >
    <parameter property="in1" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>
    <parameter property="output1" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet"    mode="OUT" />
</parameterMap>

    <procedure id="clientEmployees" parameterMap="clientEmployeesParms" resultMap="employee-map">
    { call Package.Get_Clt_ID(?,?) }
    </procedure>

</sqlMap>

我的Java:

resource = "SqlMapConfig.xml";
reader = Resources.getResourceAsReader (resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
Map map = new HashMap();
map.put("in1", new Integer(23));
list = sqlMap.queryForList("Foo.clientEmployees", map);

错误:

--- The error occurred while applying a parameter map.  
--- Check the Employee.clientEmployeesParms.  
--- Check the output parameters (retrieval of output parameters failed).  
--- Cause: java.lang.NullPointerException
Caused by: java.lang.NullPointerException
 at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:188)
 at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:123)
 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.apache.struts.employee.model.IbatisStoredProcedure.main(IbatisStoredProcedure.java:30)

3 个答案:

答案 0 :(得分:3)

我遇到了完全相同的问题。它是在2.1.5之前的iBatis和类路径中的log4j时生成的。

您可以在此处找到更多信息:

https://issues.apache.org/jira/browse/IBATIS-152

更新到iBatis 2.1.5或从类路径中删除log4j。

答案 1 :(得分:0)

我使用iBatis.NET和Oracle,并且我能够从存储过程中获取refcursor的方式如下(请注意,输出参数在列表中为First,属性/列与sproc匹配:

<parameterMap id="GetServiceTypes-param">
            <parameter property="P_CURSOR" direction="Output" column="P_CURSOR" dbType="RefCursor"/>
            <parameter property="P_TYPSERVICETYPE" direction="Input" />
</parameterMap>

...

  PROCEDURE GETSERVICETYPES(P_CURSOR OUT CURDATA, 
                            P_TYPSERVICETYPE CLM_SERVICE_TYPES_TBL.SERVICETYPE%TYPE := NULL);

答案 2 :(得分:-2)

彼得。你经历训练营吗? (我在你工作的地方工作,可能在同一栋楼里。明天我会给你发一封电子邮件。)

我认为问题是因为resultMap需要具有与过程返回的属性名称相同的属性名称。在这种情况下,无论在光标中选择什么。