mybatis oracle过程SYS_REFCURSOR设置参数错误

时间:2013-06-03 16:50:44

标签: spring mybatis

我正在使用带有Mybatis最新版本的spring 3。

我正在尝试进行返回游标结果的过程调用,以下是我的代码

我的错误如下,任何帮助都表示赞赏..

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: java.lang.NullPointerException
### The error may involve com.comcast.triage.dao.AccountDetailDao.getAccountDetail-Inline
### The error occurred while setting parameters
### SQL: { ? =          call ABC.get_acc_info(?, ?, ?, ?) }
### Cause: java.lang.NullPointerException
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:364)
    at $Proxy21.update(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:250)

以下是dao界面

public interface AccountDetailDao {
    void getAccountDetail(Map<String, Object> parameter);
}

以下是我的mapper xml

<mapper namespace="com.dao.AccountDetailDao">

<resultMap id="accountDetailResult" type="accountDetail">
    <result property="usid" column="usid" />
    <result property="accountNumber" column="account_number" />
    <result property="headendInEEg" column="headend_in_eeg" />
    <result property="customerType" column="customer_type" />
    <result property="corp" column="corp" />

</resultMap>

<update id="getAccountDetail" parameterType="map" statementType="CALLABLE">
{ #{o_acc_cur,jdbcType=CURSOR,mode=OUT,resultMap=accountDetailResult,javaType=java.sql.ResultSet} = 
    call ABC_TRI.get_acc_info(#{accountNumber,jdbcType=VARCHAR,mode=IN}, #{authGuid,jdbcType=VARCHAR,mode=IN}, #{mac,jdbcType=VARCHAR,mode=IN}, #{usid,jdbcType=VARCHAR,mode=IN}) }
</update>

mybatis还包含别名

的配置
<typeAlias type="com.comcast.triage.domain.AccountDetail" alias="accountDetail"/>

以下是我的oracle包程序签名

PROCEDURE get_acc_info( 
   i_account_number      IN  VARCHAR2,  
   i_auth_guid           IN  VARCHAR2,
   i_mac                 IN  VARCHAR2, 
   i_usid                IN  VARCHAR2,
   o_acc_cur             OUT SYS_REFCURSOR);

来电者测试如下

@Autowired

私人账户详细信息账户详情;

@Test public void test(){

Map<String, Object> param = new HashMap<String, Object>();
param.put("i_account_number", null);
param.put("i_auth_guid", null);
param.put("i_mac", "0162014707802#0");
param.put("i_usid", null);

accountDetailDao.getAccountDetail(param);

Object obj =param.get("o_acc_cur");

Assert.assertTrue(true);

}

1 个答案:

答案 0 :(得分:0)

抱歉,我的坏。

此签名用于返回光标的函数。

{ #{o_acc_cur,jdbcType=CURSOR,mode=OUT,resultMap=accountDetailResult,javaType=java.sql.ResultSet} = 
    call ABC_TRI.get_acc_info(#{accountNumber,jdbcType=VARCHAR,mode=IN}, #{authGuid,jdbcType=VARCHAR,mode=IN}, #{mac,jdbcType=VARCHAR,mode=IN}, #{usid,jdbcType=VARCHAR,mode=IN}) }

但是我正在使用存储过程,所以使用return我尝试了以下,它对我有效。

call UES_TRIAGE.get_acc_info(
        #{account_number,jdbcType=VARCHAR,mode=IN},  
        #{auth_guid,jdbcType=VARCHAR,mode=IN}, 
        #{mac,jdbcType=VARCHAR,mode=IN}, 
        #{usid,jdbcType=VARCHAR,mode=IN},
        #{accountDetails,jdbcType=CURSOR,mode=OUT,resultMap=accountDetailResult,javaType=java.sql.ResultSet}
        )