2013-06-03 3 views
0

Я использую весну 3 с последней версией Mybatis.Процедура оракула mybatis 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"/> 

следующий мой оракул пакет процедура подписи

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

тест Caller выглядит следующим образом

@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} 
     ) 
Смежные вопросы