【问题标题】:SimpleJDBCCall handle out paramater with resultsetSimpleJDBCCall 处理带有结果集的参数
【发布时间】:2016-09-29 07:11:18
【问题描述】:

我正在使用弹簧 jdbc。我想要没有参数的结果集。分开我做了,但在一起我做不到。

    CREATE DEFINER=`xxx`@`%` PROCEDURE `client_xxxx`(
    IN p_xxxx TINYINT(1) UNSIGNED,
    IN p_result SMALLINT(2) UNSIGNED,
    OUT p_result BIT ) BEGIN 
       IF EXISTS(SELECT 1 FROM xxx WHERE xxx = 1 AND xxx = 1) THEN
           SELECT ...;
           SET p_result = 0;
       ELSE
         SELECT ...;
         SET p_result = 1;
       END IF;
    END

spring jdbc 代码

SimpleJdbcCall jdbcCall =  new SimpleJdbcCall(dataSource).withProcedureName(sp);
List<Map<String, Object>> list = (List<Map<String, Object>>) jdbcCall.execute(paramsArray).get("#result-set-1");

list 使用结果集获取结果集我如何获得p_result

【问题讨论】:

    标签: mysql spring spring-jdbc


    【解决方案1】:

    您可以尝试morejdbc(在maven central 中提供)来调用您的过程,它更简洁并且类型安全:

    import static org.morejdbc.SqlTypes.BIGINT;
    import static org.morejdbc.NamedJdbcCall.call;
    import org.morejdbc.*;
    ...
    private JdbcTemplate jdbcTemplate;
    ...
    Out<Integer> out = Out.of(INTEGER);
    jdbcTemplate.execute(call("client_xxxx")
        .in("p_xxxx", pValue)
        .out("p_result", out));
    
    System.out.println("Result is " + out.get());
    

    ref_cursor输出参数和Oracle数据库可以使用

    Out<List<Record>> out = Out.of(OracleSqlTypes.cursor((rs, idx) -> new Record(rs)));
    jdbcTemplate.execute(call("client_xxxx")
        .in("p_xxxx", pValue)
        .out("p_result", out)); // will auto-close ref-cursor
    
    System.out.println("Got result records: " + out.get());
    
    

    【讨论】:

      【解决方案2】:

      我以我想念的简单方式找到它。

      public Map<String, Object> xxx(String sp, Object... paramsArray) {
          SimpleJdbcCall jdbcCall =  new SimpleJdbcCall(dataSource).withProcedureName(sp);
          return jdbcCall.execute(paramsArray);
      }
      

      execute()默认给出两个参数 IE。 1) #result-set-1 2) #update-count-1

      #result-set-1 结果集即select record #update-count-1 返回更新计数。如果我们想使用带有out 参数的select 语句访问结果。我们只需要声明out 参数。 execute() 给出了 Map&lt;String, Object&gt; 类型中的所有内容。 所以从map中我们可以得到stored procedure返回的所有多个值。

      比如我的SP 喜欢

      PROCEDURE xxx(
          IN xxxxTINYINT(1) UNSIGNED,
          IN xxxSMALLINT(2) UNSIGNED,
          OUT p_isconfig BIT
      )
      BEGIN
        SELECT....
        SET p_isconfig = 1;
      END
      

      所以在#result-set-1 我得到选择结果。 p_isconfig 给了我结果。如果您有任何困惑,那么您可以迭代 map 并确定如何获取返回参数。

      Iterator i = map.keySet().iterator();
      while ( i.hasNext() ) {
         String key = (String) i.next();
         String value = params.get( key );
      
         System.out.println("key: " + key + " --- value: " + value) ;
      

      }

      通过这种方式,我在阅读了很多内容后找到了解决方案。如果有人对此解决方案有其他选择,请与我分享。

      【讨论】:

      • 但这不是 ResultSet 而是地图列表。
      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2011-01-31
      • 1970-01-01
      相关资源
      最近更新 更多