如何在 spring 中使用 SimpleJDBCCall 获取存储过程的结果以及两个结果表?

Posted

技术标签:

【中文标题】如何在 spring 中使用 SimpleJDBCCall 获取存储过程的结果以及两个结果表?【英文标题】:How to get results of an stored procedure using SimpleJDBCCall in spring with two result table? 【发布时间】:2013-04-08 11:52:40 【问题描述】:

我正在实现一个 Spring+ MSSQL Server 2008 应用程序。我使用 SimpleJDBCCall API 来执行存储过程并检索结果。

对于具有单表结果的存储过程,它可以正常工作,但我不知道如何将它用于具有多表结果的过程。 这是我的数据库查询的屏幕截图,它返回两个结果表。1

这是我使用的代码,此代码与单表结果一起正常工作`

public class LoadOnDemandSP extends StoredProcedure
    private static final String SPROC_NAME = "sps_IME_EF_GetAllMarketData";

    public LoadOnDemandSP(DataSource ds) 
        super(ds, SPROC_NAME);

        RowMapper mapper = new MyRowMapper();
        declareParameter(new SqlReturnResultSet("Return Value", mapper));
        declareParameter(new SqlParameter("FromDate", Types.VARCHAR));
        declareParameter(new SqlParameter("ToDate",Types.VARCHAR));
        compile();

    

    public List execute(String FromDate,String ToDate) 
        Map inputs = new HashMap();
        inputs.put("FromDate",FromDate);
        inputs.put("ToDate",ToDate);
        Map map = super.execute(inputs);
        if (map != null && map.size() > 0) 
            return (List) map.get("Return Value");
         else 
            return new ArrayList();
        


    


    private class MyRowMapper implements RowMapper<LoadOnDemand> 
        public LoadOnDemand mapRow(ResultSet rs, int rowNum) throws SQLException 
            LoadOnDemand l = new LoadOnDemand();
//              f.setDay(rs.getInt("ContractDay"));
            l.setInternalQuantity(rs.getInt("DVaznTon"));
            l.setExportalQuantitiy(rs.getInt("SVaznTon"));
            l.setInternalValue(rs.getDouble("DArzeshMillion"));
            l.setExternalValue(rs.getDouble("SArzeshMillion"));
            l.setInternalBuyersCount(rs.getInt("DBuyers"));
            l.setExternalBuyersCount(rs.getInt("SBuyers"));
            l.setInternalSellersCount(rs.getInt("DSellers"));
            l.setExternalSellersCount(rs.getInt("SSellers"));
            l.setInternalGoodsCount(rs.getInt("DSymbols"));
            l.setExternalGoodsCount(rs.getInt("SSymbols"));
            l.setTablo(rs.getString("GrouhAsli"));
            return l;
        
    




///已添加////

我的示例 SP:

CREATE PROCEDURE [dbo].[sps_Test1]

WITH RECOMPILE      
AS

SELECT *

FROM dbo.tbl1

SELECT *

FROM dbo.tbl2

【问题讨论】:

你能展示一下你的店铺流程吗? 我刚刚在这里添加了示例程序 【参考方案1】:

您无法处理多个表。您可以使用unionunionAll 将这两个表合并为一个

CREATE PROCEDURE [dbo].[sps_Test1]

WITH RECOMPILE      
AS

SELECT *

FROM dbo.tbl1
UNION
SELECT *

FROM dbo.tbl2

【讨论】:

我在这里遇到了一个难题,我不是数据库管理员,我根本无法更改存储过程,我只能更改我的 java 代码,您有什么建议吗?跨度> 然后试试这个static.springsource.org/spring/docs/2.0.7/reference/… 你也可以试试这个xyzws.com/Javafaq/…

以上是关于如何在 spring 中使用 SimpleJDBCCall 获取存储过程的结果以及两个结果表?的主要内容,如果未能解决你的问题,请参考以下文章

spring3: 对JDBC的支持 之 Spring提供的其它帮助 SimpleJdbcInsert/SimpleJdbcCall/SqlUpdate/JdbcTemplate 生成主键/批量处理(

Java JDBC 存储过程到 List<T>

如何在 Spring Batch 中使用 Spring 事务支持

Spring-batch:如何在 Spring Batch 中使用 skip 方法捕获异常消息?

如何在 Spring webflux 应用程序中使用 Spring WebSessionIdResolver 和 Spring Security 5?

如何在 Spring Boot 中使用 Spring Security 启用 CORS