Не может получить параметр из процедуры оракула, выполняемой mybatis
Я разрабатываю 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 контент для 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 Соединение открыто 2011-10-19 10:32:46,909 DEBUG [main] (Slf4jImpl.java:28) ==> Выполнение: CALL wallet.pkg_wallet_validation.can_customer_subscribe(?,?) 2011-10-19 10:32:46,911 DEBUG [main] (Slf4jImpl.java:28) ==> Параметры: 509999999(строка), 0(целое число) msisdn: 509999999, responseCode: 0
Когда я меняю метод подписки responseCode = null, я получаю сообщение об ошибке:
org.springframework.jdbc.UncategorizedSQLException: Ошибка установки нулевого параметра. Большинство драйверов JDBC требуют, чтобы JdbcType был указан для всех обнуляемых параметров. Причина: java.sql.SQLException: Неверный тип столбца; неклассифицированное SQLException для SQL []; Состояние SQL [null]; код ошибки [17004]; Неверный тип столбца; вложенным исключением является java.sql.SQLException: неверный тип столбца
1 ответ
Я нашел решение. Карта должна быть пользователем, а не двумя параметрами в методе 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"));
}