こんにちは、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;
/