복붙노트

[SPRING] mybatis가 실행 한 oracle 프로 시저에서 매개 변수를받을 수 없습니다.

SPRING

mybatis가 실행 한 oracle 프로 시저에서 매개 변수를받을 수 없습니다.

스프링 3.0.5를 사용하여 자바 애플리케이션을 개발하고 mybatis-spring을 사용하여 데이터베이스 오라클과 작업합니다.

mybatis에 대한 인터페이스가 있습니다.

public interface SubscriberMapper {
    Subscriber getSubscriberByMsisdn(String msisdn);

    void insertSubscriber(Subscriber subscriber);

    void updateSubscriber(Subscriber subscriber);

    void canCustomerSubscribe(@Param("msisdn") String msisdn, 
                         @Param("responseCode") Integer responseCode);

}

canCustomerSubscribe에 대한 mybatis xml 콘텐츠 :

<parameterMap id="canCustomerSubscribeParams" type="map">
    <parameter property="msisdn" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
    <parameter property="responseCode" jdbcType="NUMERIC" javaType="java.lang.Integer" mode="OUT"/>
</parameterMap>
<select id="canCustomerSubscribe" parameterMap="canCustomerSubscribeParams" statementType="CALLABLE">
    CALL wallet.pkg_wallet_validation.can_customer_subscribe(#{msisdn}, #{responseCode})
</select>

그리고 실행할 코드 :

public void subscribe(String msisdn) throws InvalidArgumentException {
    Integer responseCode = 0;
    subscriberMapper.canCustomerSubscribe(msisdn, responseCode);
    System.out.println("msisdn: " + msisdn + ", responseCode: " + responseCode);
}

유효하지 않은 "msisdn"방식으로 "subscribe"메소드를 실행할 때 프로 시저에서 실제 값을받지 못합니다. 데이터베이스에서이 프로 시저를 실행하면 reponseValue = 1001이 리턴되지만 Java 코드에서 0을 수신합니다. mybatis에 대해 stout으로 디버그 로깅을 설정하고 출력은 다음과 같습니다.

2011-10-19 10:32:46,732 DEBUG [main] (Slf4jImpl.java:28) ooo Connection Opened
2011-10-19 10:32:46,909 DEBUG [main] (Slf4jImpl.java:28) ==>  Executing: CALL wallet.pkg_wallet_validation.can_customer_subscribe(?, ?) 
2011-10-19 10:32:46,911 DEBUG [main] (Slf4jImpl.java:28) ==> Parameters: 509999999(String), 0(Integer)
msisdn: 509999999, responseCode: 0

"subscribe"메소드 responseCode = null로 변경하면 수신 및 오류가 발생합니다.

org.springframework.jdbc.UncategorizedSQLException: Error setting null parameter.  Most JDBC drivers require that the JdbcType must be specified for all nullable parameters. Cause: java.sql.SQLException: Invalid column type
; uncategorized SQLException for SQL []; SQL state [null]; error code [17004]; Invalid column type; nested exception is java.sql.SQLException: Invalid column type

해결법

  1. ==============================

    1.솔루션을 찾았습니다. 지도는 canCustomerSubscribe 메소드에서 두 개의 매개 변수 대신 사용자 여야합니다.

    솔루션을 찾았습니다. 지도는 canCustomerSubscribe 메소드에서 두 개의 매개 변수 대신 사용자 여야합니다.

     void canCustomerSubscribe(Map<String,Object> params);
    

    mybatis XML 내용 :

    <select id="canCustomerSubscribe" parameterType="java.util.HashMap" statementType="CALLABLE">
        CALL wallet.pkg_wallet_validation.can_customer_subscribe(
        #{msisdn, jdbcType=VARCHAR, javaType=java.lang.String, mode=IN},
        #{responseCode,jdbcType=NUMERIC, javaType=java.lang.Integer, mode=OUT})
    </select>
    

    (인수 속성 사이에 쉼표를 추가해야합니다)

    구독 서비스 메서드에서 호출 :

    public void subscribe(String msisdn) throws InvalidArgumentException {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("msisdn", msisdn);
        params.put("responseCode", null);
        subscriberMapper.canCustomerSubscribe(params);
        System.out.println(params.get("responseCode"));
    }
    
  2. from https://stackoverflow.com/questions/7817185/cannot-receive-out-parameter-from-oracle-procedure-executed-by-mybatis by cc-by-sa and MIT license