Jos*_*ull 5 java oracle spring stored-procedures jdbc
我在一个包中有一个存储过程,它在同一包中使用三个不同的方法签名定义。它们仅因几个参数而异(每个参数都使用几个默认值调用下一个参数)。为了简洁起见,我在这里过度简化了列列表。我正在调用的过程中有大约 55 个字段。
我使用名为“MapSqlParameterSource”的 Spring 类来定义我提供的字段值:
SqlParameterSource params = new MapSqlParameterSource()
.addValue("pi_session_id", piSessionId)
.addValue("pi_site_id", piSiteId)
.addValue("pi_address_id", piAddressId)
.addValue("po_status_cd", null)
.addValue("po_status_mg", null);
Run Code Online (Sandbox Code Playgroud)
我使用一个简单的 jdbc 调用来定义我想要调用的存储过程:
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withSchemaName("myschema")
.withCatalogName("address_package")
.withProcedureName("p_post_address");
Run Code Online (Sandbox Code Playgroud)
然后我通过以下调用执行该过程:
Map<String, Object> resultsMap = jdbcCall.execute(params);
Run Code Online (Sandbox Code Playgroud)
当我开发这些结果时,我通常会为了好玩而注销结果。
for (String key : resultsMap.keySet()) {
logger.info("p_post_address - Key: " + key + " object: " + resultsMap.get(key));
}
Run Code Online (Sandbox Code Playgroud)
然后我像这样访问输出字段:
String statusMessage = (String) resultsMap.get("po_status_mg");
BigDecimal statsCd = (BigDecimal) resultsMap.get("po_status_cd");
Run Code Online (Sandbox Code Playgroud)
这对于没有超载的程序来说非常有效!然而,当我调用这个特定的过程时,它给了我这个错误:
org.springframework.dao.InvalidDataAccessApiUsageException:无法确定正确的调用签名 - “P_POST_ADDRESS”的多个过程/函数/签名
然后我尝试变得棘手,并准确指定应该使用哪些参数来调用存储过程,以便它可以匹配我想要的重载方法。
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withSchemaName("myschema")
.withCatalogName("address_package")
.withProcedureName("p_post_address");
jdbcCall.addDeclaredParameter(new SqlParameter("pi_session_id", OracleTypes.NUMBER));
jdbcCall.addDeclaredParameter(new SqlParameter("pi_site_id", OracleTypes.VARCHAR));
jdbcCall.addDeclaredParameter(new SqlParameter("pi_address_id", OracleTypes.NUMBER));
jdbcCall.addDeclaredParameter(new SqlOutParameter("po_status_cd", OracleTypes.NUMBER));
jdbcCall.addDeclaredParameter(new SqlOutParameter("po_status_mg", OracleTypes.VARCHAR));
Run Code Online (Sandbox Code Playgroud)
这导致了同样的错误。
org.springframework.dao.InvalidDataAccessApiUsageException:无法确定正确的调用签名 - “P_POST_ADDRESS”的多个过程/函数/签名
我最终发现我需要添加这个选项:
jdbcCall.withoutProcedureColumnMetaDataAccess();
Run Code Online (Sandbox Code Playgroud)
那行得通! 但我不知道为什么。
有人可以解释为什么您需要添加声明的参数addDeclaredParameter并调用吗withoutProcedureColumnMetaDataAccess?