Как вызвать хранимую процедуру Apache Derby с использованием Spring SimpleJdbccallJAVA

Программисты JAVA общаются здесь
Anonymous
Как вызвать хранимую процедуру Apache Derby с использованием Spring SimpleJdbccall

Сообщение Anonymous »

Я написал хранимую процедуру Apache Derby с одним целочисленным параметром с именем «ID». Я пытаюсь вызвать это, используя Simplejdbccall's Spring JDBC. После того, как хранящаяся процедура будет рассмотрено, и параметр связан с моим входным параметром, SimpleJdbccall создает следующую строку, которая представляет Call [{call employeee_time_by_id (id =>?)}] .
Чтобы выполнить оператор, эта строка парируется. В этот момент я получаю ошибку анализа, когда она встречается с> . Похоже, что анализатор не имеет ни малейшего представления, как разобраться в => в строке вызова. Так почему же это помещает это в строку вызова только для того, чтобы позже отклонить его? Плохая грамматика SQL [{Call employee_time_by_id (id =>?)}] .
Ошибка возникает в методе org.apache.derby.impl.sql.compile.parserimpl.parsestatement () . Первым параметром этого метода является строка вызовов {call employee_time_by_id (id =>?)} . Это вызывает личный метод, который в конечном итоге бросает исключение с сообщением org.apache.derby.impl.sql.compile.parseexception: встречается ">" в строке 1, столбец 31 . Код ошибки составляет 42x01 .
Я не понимаю, как строка вызова может отформатироваться таким образом, чтобы впоследствии не было проанализирована. Хранящаяся процедура вызывается следующим образом: < /p>

Код: Выделить всё

   public JSONArray getClosedPeriodDataMap(String spName, Map inParams) {
SimpleJdbcCall simpleJdbcCall =
jdbcCallFactory.create()
.withProcedureName(spName)
.withNamedBinding()
.returningResultSet("JSONObjectList", new JSONObjectRowMapper());
MapSqlParameterSource source = new MapSqlParameterSource(inParams);
var resultsMap = simpleJdbcCall.execute(source);
JSONArray resultArray = new JSONArray();
resultArray.putAll(resultsMap.get("JSONObjectList"));
return resultArray;
}
Где inparams - карта с одним параметром, определяемый как sqlparametervalue Как это:

Код: Выделить всё

  Map params = new HashMap();
SqlParameterValue idValue = SqlParameterHelper.makeIntValue("ID", 1);
params.put("ID", idValue);
request.setParams(params);
и sqlparameterHelper.makeIntvalue () определяется как:

Код: Выделить всё

  static SqlParameterValue makeIntValue(String name, int value) {
SqlParameter param = new SqlParameter(name, Types.INTEGER);
return new SqlParameterValue(param, value);
}
< /code>
В IN, кажется, правильно связан. Выходной параметр должным образом распознается как параметр возврата. Именно тогда, когда процесс вызова пытается проанализировать созданную вызывающую строку, она путается.CREATE PROCEDURE EMPLOYEE_TIME_BY_ID(IN ID INTEGER)
PARAMETER STYLE JAVA
LANGUAGE JAVA
MODIFIES SQL DATA
DYNAMIC RESULT SETS 1
EXTERNAL NAME 'com.something.StoredProcedures.getEmployeeTimeById';
< /code>
Метод (который никогда даже не приближается к тому, что его называют из -за исключения анализа) определяется следующим образом: < /p>
public static class StoredProcedures {

public void getEmployeeTimeById(final int id, ResultSet[] timesheets) throws SQLException {
try (Connection conn = DriverManager.getConnection("jdbc:default:connection");
PreparedStatement ps = conn.prepareStatement("SELECT * FROM DBA.EMPLOYEE_TIME WHERE id = ?")) {
ps.setInt(1, id);
ResultSet results = ps.executeQuery();
timesheets[0] = results;
}
}
< /code>
Кстати, типичная строка вызова Apache Derby будет чем -то вроде < /p>
CallableStatement cs = conn.prepareCall("{ call MY_PROC(?, ?)}");
.
Обратите внимание, что нет => . Неясно, почему эта странная «стрелка» вставлена ​​в строку вызова. Может быть, лучшее решение - вообще заглушить Spring SimpleJdbccall и просто вызвать вызов через обычный JDBC CallableStatement .

Подробнее здесь: https://stackoverflow.com/questions/795 ... lejdbccall

Вернуться в «JAVA»