Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нет OUT параметра при вызове PLSQL через mybatis 
V
    Опции темы
Tasadar
Дата 19.10.2011, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 30.3.2010

Репутация: нет
Всего: нет



Пишу программу на Java, с использованием Spring 3.0.5 и MyBatis (mybatis-spring integration module для работы с БД Oracle).

Код интерфейса для 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" из xml файла MyBatis:

Код

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>


код который вызывает "canCustomerSubscribe":

Код

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


Если вызвать процедуру wallet.pkg_wallet_validation.can_customer_subscribe с инвалидным msisdn в БД через PL/SQL Developer, процедура возвращает 1001. Когда я вызываю метод "subscribe" с инвалидным msisdn, я не могу получить этот код, а вместо этого получаю начальное значение "Integer responseCode = 0;", т.е. получаю то, что отправил.
Включил debug для MyBatis и перенаправил его в stdout. Вот, что я получаю:
Код

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 написать "Integer 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


Замечу, что другие запросы работают. Получение OUT результата из PLSQL процедуры тоже работает, если в xml файле вместо parameterMap передать класс. Например этот код из тестового проекта работает:
Код

    <select id="insertSubsViaPackage2" parameterType="Subscriber" statementType="CALLABLE">
        CALL test_package.insertSubsciber(
        #{msisdn,javaType=String,jdbcType=VARCHAR},
        #{status,javaType=Integer,jdbcType=NUMERIC, mode=OUT})
    </select>


Код

public interface SubscriberMapperXML {

    void insertSubsViaPackage2(Subscriber subscriber);

}


У класса "Subscriber" есть поля "msisdn" и "status".

Но в моем случае, я не хочу передавать класс, т.к. responseCode это результат выполнения процедуры, а не свойство класса. Пожалуйста, помогите получить OUT параметр процедуры через MyBatis.
PM MAIL   Вверх
Ares4322
Дата 19.10.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: 2
Всего: 3



Вы должны в canCustomerSubscribe передавать не 2 параметра, а один типа Map<String,Object>. Ключи этой map будут как раз "msisdn" и "responseCode", если соответствовать вашему коду.
В mybais в методыах мапперов может быть один параметр. Если надо передавать несколько, то надо передавать map или Pojo
PM MAIL   Вверх
Tasadar
Дата 20.10.2011, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 30.3.2010

Репутация: нет
Всего: нет



Ares4322, спасибо. Вариант с Map<String,Object> прошел.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0523 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.