2013-06-03 1 views
0

J'utilise spring 3 avec la dernière version de Mybatis.Procédure mybatis oracle SYS_REFCURSOR erreur de paramètre de réglage

Je suis en train de faire appel de procédure qui renvoie le résultat du curseur, voici mon code

Mon erreur est le suivant, toute aide est appréciée ..

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) 

Ce qui suit est dao Interface

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

Après est mon mappeur 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 contient également config pour alias

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

suivant est ma signature de procédure de package 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); 

test de l'appelant est comme suivant

@Autowired 

privé AccountDetailDao accountDetailDao;

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

}

+0

Avez-vous vérifié la procédure stockée dans la base de données pour vous assurer que 'o_acc_cur' n'est pas null? – Jarandinor

Répondre

0

désolé mon mauvais.

cette signature est pour la fonction qui renvoie le curseur. Mais j'utilise la procédure stockée donc à la place en utilisant retour j'ai essayé suivant et cela a fonctionné pour moi.

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