1

こんにちは、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 として null 値を取得しています。0 を返すはず Toad からのこの関数の実行 - Oracle Db

var z 番号

exec RATELIMIT_OWN.unlimit_contract (0123,:z)

zを印刷する

Toad の出力として 0 を取得しました。

Java コードからの戻り値として null 値を取得する理由 (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;
/
4

1 に答える 1

1

パラメータの順序が間違っているようです。試す:

   declareParameter(new SqlParameter(P_NUMEC, Types.INTEGER));
   declareParameter(new SqlParameter(P_GBYTES, Types.INTEGER));
   declareParameter(new SqlOutParameter(O_RETURN_CODE, Types.INTEGER));
于 2012-09-12T10:02:01.087 に答える