#java #spring #sap-ase #atomikos #jconnect
#java #spring #sap-ase #atomikos #jconnect
Вопрос:
Я пытаюсь вызвать некоторые устаревшие хранимые процедуры в базе данных Sybase (ASE 15), используя Spring JDBC.
У меня это работает довольно хорошо, но я не могу понять, как получить возвращаемое значение из процедуры.
Это код, который я получил:
@Repository
public class SybaseDao extends StoredProcedure {
private static final String SQL = "db..proc_name";
private static final String RETURN_VALUE = "rc";
private static final String IN_DATA = "in_data";
@Autowired
public UpdateSybaseDao(DataSource dataSource) {
super(dataSource, SQL);
setFunction(true);
declareParameter(new SqlOutParameter(RETURN_VALUE, NUMERIC));
declareParameter(new SqlParameter(IN_DATA, NUMERIC));
compile();
}
public void update(Integer inData) {
Map<String, Object> inputs = new HashMap<String, Object>();
inputs.put(IN_DATA, inData);
Map<String, Object> results = execute(inputs);
Integer returnValue = (Integer) results.get(RETURN_VALUE);
if (returnValue > 0) {
// handle this error
}
}
}
Хранимая процедура не очень важна, но она выполняет обновление и всегда возвращает 0. Если я запускаю тот же запрос с помощью какого-либо инструмента db, я правильно получаю 0.
Обновление работает, и таблица изменяется, возвращаемое значение равно 3. Для меня это выглядит совершенно случайным.
Правильно ли я это делаю? Я чего-то не понимаю?
Я использую проприетарный драйвер Sybase jConnect 7, если это имеет значение.
Спасибо.
Ответ №1:
Я недостаточно знаком с Spring, чтобы знать, прав я или нет, но что произойдет, если вы измените setFunction
на false
? Функции и хранимые процедуры — это два разных животных, но я не знаю, проводит ли Spring между ними различие.
Комментарии:
1. Я больше разбираюсь в MySQL, и там функции и процедуры очень разные, но в sybase, я думаю, все процедуры могут возвращать значения, и я даже не уверен, что там есть функции. Я думаю, что в Sybase то же самое. В любом случае, при setFuncation(false) возвращаемое значение вообще отсутствует.
Ответ №2:
Отвечая на мой собственный вопрос.
На самом деле я все делал правильно. Меня обмануло то, что возвращаемое значение из другого инструмента было неправильным. Я никогда об этом не думал, и это действительно не имело смысла.
В любом случае … кажется, мой подход работает.