Spring SimpleJdbcCall Oracle sql/pl - 无法确定正确的调用签名 - 多个过程/函数/签名

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