[英]Calling Oracle procedure that returns rows using SimpleJdbcCall in Spring
[英]Spring SimpleJdbcCall returns wrong value
我使用 SimpleJdbcCall 調用存儲過程。
public Map<String, Object> callStoredProcedure(SimpleJdbcCall jdbcCall, String procedureName, Map<String, Object> inParamMap) {
log.info("Calling stored procedure with name : " + procedureName);
SqlParameterSource in = new MapSqlParameterSource(inParamMap);
Map<String, Object> out = jdbcCall.withProcedureName(procedureName).execute(in);
return out;
}
其結果輸出為
鍵 = #result-set-1,值 = [{=17.00}]
當我像這樣獲得 Value 的類類型時,我感到困惑。
類 class1 = entry.getValue().getClass();
當我在數據庫上執行時,我的 sp 返回 17.00,但在 jdbcCall 代碼中得到=17.00 。
任何評論都會有所幫助。
這是我如何從以前的項目構建我的 SimpleJdbcCall....
createUpdateUsersSP = new SimpleJdbcCall(contactManagerJdbcT)
.withProcedureName(pb.getCreateUpdateUsersSp())
.declareParameters(
new SqlOutParameter("p_user_id", Types.NUMERIC),
new SqlOutParameter("p_update_stamp", Types.VARCHAR),
new SqlOutParameter("p_status", Types.VARCHAR),
new SqlOutParameter("p_failure_reason", Types.VARCHAR),
new SqlParameter("p_vonage_id", Types.VARCHAR),
new SqlParameter("p_mobile_did", Types.VARCHAR),
new SqlParameter("p_email_address", Types.VARCHAR),
new SqlParameter("p_name", Types.VARCHAR),
new SqlParameter("p_netname_id", Types.NUMERIC),
new SqlParameter("p_user_status", Types.VARCHAR),
new SqlParameter("p_image_update_stamp", Types.TIMESTAMP),
new SqlParameter("p_has_profile_image", Types.VARCHAR),
new SqlParameter("p_nick_name", Types.VARCHAR));
createUpdateUsersSP.setAccessCallParameterMetaData(false);
你有類似的東西可以給我們看嗎?
顯然,您的存儲過程只返回一個結果,但JdbcCall
的execute
方法試圖返回輸出參數的映射,如參數聲明中那樣按名稱鍵控。 由於您沒有參數聲明,您將獲得一個只有行、沒有列名和單個值17.00
的ResultSet
。
我認為您應該改用executeObject
將單出參數作為指定返回類型的對象返回。
String str = jdbcCall.withProcedureName(procedureName).executeObject(String.class, in);
或者
double val = jdbcCall.withProcedureName(procedureName).executeObject(Double.class, in);
這是我提取值的工作,因為我看不到該問題的任何可行答案。
((Map)((List)out.get("#result-set-1")).get(0)).get("");
這給出了 out 參數內的值。
這是我的工作。
Map<String,Object> simpleJdbcCallResult = simpleJdbcCall.execute(sqlParameterSource);
LinkedCaseInsensitiveMap<?> obj =
(LinkedCaseInsensitiveMap<?>)((List<?>)simpleJdbcCallResult.get("#result-set-1")).get(0);
Array[] values = (Array[]) obj.values().toArray()[0];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.