Хранимые процедуры Oracle с использованием Spring JDBC

Привет я пытаюсь выполнить хранимые процедуры, используя Spring JDBC. Вот класс SP

 class IncrementExtraBalanceStoredProcedure extends StoredProcedure {

    /**
     * @param jdbcTemplate
     * @param procedureName
     */
    public IncrementExtraBalanceStoredProcedure(JdbcTemplate jdbcTemplate, String procedureName) {
        super(jdbcTemplate, procedureName);
        declareParameter(new SqlOutParameter(O_RETURN_CODE, Types.INTEGER));
        declareParameter(new SqlParameter(P_NUMEC, Types.INTEGER));
        declareParameter(new SqlParameter(P_GBYTES, Types.INTEGER));
        compile();
    }

    /**
     * @param inputBean
     * @return resultObjects
     */
    public Map<String, Object> execute(RateLimitLogBean inputBean) {
        Map<String,Object> sqlMap = new HashMap<String,Object>();
        sqlMap.put(P_NUMEC, inputBean.getNumec());
        sqlMap.put(P_GBYTES,  inputBean.getGb());
        return super.execute(sqlMap);
    }

}

Я вызываю этот класс из этого метода.

 public int incrementExtraBalance(RateLimitLogBean inputBean) {
    IncrementExtraBalanceStoredProcedure procedure = new IncrementExtraBalanceStoredProcedure(this.jdbcTemplate, "RATELIMIT_OWN.increment_extra_balance");
    Map<String, Object> resultMap = procedure.execute(inputBean);
    if (!StringUtils.isEmpty(resultMap)) {
        return ((Integer) resultMap.get(O_RETURN_CODE)).intValue();
    }
    return -1;
}

Но я получаю нулевое значение как O_RETURN_CODE. Предполагается вернуть 0 Выполнение этой функции от Toad - Oracle Db

номер вар z

exec RATELIMIT_OWN.unlimit_contract (0123,:z)

печать z

Я получил 0 в качестве выхода в жабе.

Почему я получаю нулевое значение как возвращение из кода Java (без исключений sql). Что-то не так с кодом?

нативные вызовы, возвращающие правильный вывод

public void unlimitContract(RateLimitLogBean inputBean, boolean load) throws SQLException {
    String sql = "{call RATELIMIT_OWN.unlimit_contract (?,?)}";
    CallableStatement callableStatement = this.dataSource.getConnection().prepareCall(sql);
    callableStatement.setInt(1, 0123);
    callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);

    callableStatement.executeUpdate();

    int resultCode = callableStatement.getInt(2);
}

SQL SP

CREATE OR REPLACE PROCEDURE RATELIMIT_OWN.increment_extra_balance (p_numec IN  NUMBER,
  p_gbytes            IN    NUMBER,
  o_return_code    OUT NUMBER)
AS

   message            logs.errormsg%TYPE;

BEGIN

  update balance set extrabalance=extrabalance+(p_gbytes*1073741824),limited=0 WHERE numec = p_numec;

  IF SQL%ROWCOUNT = 0
  THEN
    o_return_code:=1;
  ELSE
    o_return_code:=0;
    message := 'Cops added ' || p_gbytes || ' gb extra volume';
    INSERT INTO logs (logid, eventid, origin, numec, VALUE, errormsg) VALUES (seq_log.NEXTVAL, 'NEXTRAROV', 'increment_extra_balance', p_numec, p_gbytes, message);
  END IF;

   commit;

  EXCEPTION
    WHEN OTHERS
    THEN
      o_return_code := SQLCODE;
      ROLLBACK;  

END;
/

1 ответ

Решение

Порядок ваших параметров выглядит неправильно. Пытаться:

   declareParameter(new SqlParameter(P_NUMEC, Types.INTEGER));
   declareParameter(new SqlParameter(P_GBYTES, Types.INTEGER));
   declareParameter(new SqlOutParameter(O_RETURN_CODE, Types.INTEGER));
Другие вопросы по тегам