2013-06-03 31 views
0

我正在使用Spring 3和Mybatis最新版本。mybatis oracle程序SYS_REFCURSOR設置參數錯誤

我試圖讓程序調用,它返回遊標結果,以下是我的代碼

我的錯誤是如下,任何幫助表示讚賞..

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); 
} 

以下是我的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 

私人AccountDetailDao accountDetailDao;

@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); 

}

+0

您是否檢查過數據庫中的存儲過程以確保'o_acc_cur'不爲空? – Jarandinor

回答

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}) } 

但我使用存儲過程,而不是使用回我試過以下,它爲我工作。

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} 
     )