не может получить параметр из процедуры оракула, выполняемой mybatis

2

Я разрабатываю Java-приложение, используя Spring 3.0.5, и я работаю с базой данных Oracle, используя 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);

}

mybatis xml content для canCustomerSubscribe:

<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", я не получаю реальное значение из процедуры. Выполнение этой процедуры в базе данных возвращает reponseValue = 1001, но в Java-коде я получаю 0. Я включил ведение журнала отладки в stout для mybatis, и вывод:

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

Когда я изменяю метод "подписаться" 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
Теги:
stored-procedures
spring
mybatis

1 ответ

6
Лучший ответ

Я нашел решение. Карта должна быть пользователем вместо двух параметров в методе canCustomerSubscribe.

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

mybatis xml content:

<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"));
}
  • 0
    Я исправляю синтаксис файла XML, мне нужно добавить запятые между атрибутами аргументов!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню