`

使用JdbcTemplate调用输出参数为结果集(REF游标)的集合

阅读更多
//例子一:只有输出参数
	<!-- DB2 dataSource-->
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="${jdbc.driver}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>

	
	
	<!-- jdbcTemplate -->
	 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"/>
	</bean>




 @Test
    public void testRegisterCustomer() {
        List<Map<String, Object>> locationInfo = (List<Map<String, Object>>) jdbcTemplate.execute(
                "{call sp_rpt_satisfybyskill_new(?)}", new CallableStatementCallback() {
                    @Override
                    public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
                        // 设置第一个输出参数的参数类型为游标类型
                        cs.registerOutParameter(1, OracleTypes.CURSOR);
                        // 执行存储过程
                        cs.execute();

                        // 获取第一个输出参数,从1开始
                        ResultSet rs = (ResultSet) cs.getObject(1);

                        List<Map<String, Object>> csList = new ArrayList<Map<String, Object>>();
                        // 转换每行的返回值到Map中
                        while (rs.next()) {
                            Map<String, Object> rowMap = new HashMap<String, Object>();
                            rowMap.put("zsnattachmentid", rs.getString("zsnattachmentid"));
                            rowMap.put("attachmentname", rs.getString("attachmentname"));
                            csList.add(rowMap);
                        }

                        rs.close();
                        return csList;
                    }

                });
        System.out.println(locationInfo);
    }





--下面是REF游标和存储过程
CREATE OR REPLACE PACKAGE Pack_Service AS
  TYPE t_RetDataSet IS REF CURSOR;
END Pack_Service;

CREATE OR REPLACE PROCEDURE Sp_Rpt_SatisfyBySkill_new
(
  rCursor               OUT Pack_Service.t_Retdataset  -- 返回结果集
)
AS
  exc_Param             EXCEPTION;
BEGIN

    OPEN rCurSor FOR
               select t.zsnattachmentid as "zsnattachmentid",t.attachmentname "attachmentname" from zsnattachment t where t.zsnattachmentid in(2000000236,2000000239);
  RETURN;
END;




 //例子二:输入输出参数都有
 @Test
    public void testRegisterCustomer() {
        List<Map<String, Object>> locationInfo = (List<Map<String, Object>>) jdbcTemplate.execute(
                "{call sp_rpt_satisfybyskill_new(?,?,?)}", new CallableStatementCallback() {
                    @Override
                    public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
                        //设置第一个输入参数的值
                        cs.setLong(1, 2000000236);
                        //设置第二个输入参数的值
                        cs.setLong(2, 2000000256);
                        
                        // 设置第三个参数的参数类型为游标类型(registerOutParameter用来注册输出参数)
                        cs.registerOutParameter(3, OracleTypes.CURSOR);
                        // 执行存储过程
                        cs.execute();

                        // 获取第一个输出参数,3代表的是输出参数所在的位置
                        ResultSet rs = (ResultSet) cs.getObject(3);

                        List<Map<String, Object>> csList = new ArrayList<Map<String, Object>>();
                        // 转换每行的返回值到Map中
                        while (rs.next()) {
                            Map<String, Object> rowMap = new HashMap<String, Object>();
                            rowMap.put("zsnattachmentid", rs.getString("zsnattachmentid"));
                            rowMap.put("attachmentname", rs.getString("attachmentname"));
                            csList.add(rowMap);
                        }

                        rs.close();
                        return csList;
                    }

                });
        System.out.println(locationInfo);
    }


CREATE OR REPLACE PROCEDURE Sp_Rpt_SatisfyBySkill_new(id_start number,
                                                      id_end   number,
                                                      rCursor  OUT Pack_Service.t_Retdataset -- 返回结果集
                                                      ) AS
  exc_Param EXCEPTION;
BEGIN

  OPEN rCurSor FOR
    select t.zsnattachmentid as "zsnattachmentid",
           t.attachmentname  "attachmentname"
      from zsnattachment t
     where t.zsnattachmentid between id_start and id_end;
  RETURN;
END;



分享到:
评论

相关推荐

    jdbcTemplate分页彻底解决,使用游标滚动

    3. **调用`JdbcTemplate`**:使用`JdbcTemplate`的`callProcedure()`或`execute()`方法执行存储过程,传入`SplitPageResultSetExtractor`实例作为参数。 4. **处理结果**:`ResultSetExtractor`会在内部维护当前页...

    使用Spring的JdbcTemplate调用Oracle的存储过程

    使用Spring的JdbcTemplate调用Oracle的存储过程

    Spring JdbcTemplate调用Oracle存储过程实现CRUD

    存储过程使用 `SYS_REFCURSOR` 输出参数将结果集返回给调用方。 `P_EMP_ADD` 存储过程用于添加新员工信息,并返回添加结果。该过程接收两个输入参数:`V_ID` 和 `V_NAME`,分别用于添加员工 ID 和姓名。存储过程...

    超出打开游标的最大数的原因和解决方案

    超出打开游标的最大数的原因和解决方案 在 Oracle 数据库中,游标(cursor)是一种临时工作区,用于存储查询结果。...通过调整 OPEN_CURSORS 参数值和优化应用程序的游标使用,可以避免超出打开游标的最大数问题。

    spring自带的jdbcTemplate查询、插入预编译使用

    例如,我们可以使用`SimpleJdbcCall`来执行存储过程,并提供一个`SqlParameterSource`来传递参数,再通过`ResultSetExtractor`或`RowCallbackHandler`来处理结果集: ```java SimpleJdbcCall storedProc = new ...

    使用jdbcTemplate查询返回自定义对象集合代码示例

    首先,我们可以使用JdbcTemplate的queryForList()方法来查询数据库,并将查询结果转换为自定义对象集合。下面是一个示例代码: ```java public List&lt;UserInfo&gt; findAll() { String sql = "SELECT * FROM user_info...

    JdbcTemplate

    JdbcTemplate 调用存储过程

    Oracle + jdbcTemplate + Spring + Java + Flex 实现分页.docx

    在Spring框架中,jdbcTemplate提供了简便的方法来执行存储过程,如`callProcedure()`,它可以处理输入和输出参数,以及处理游标结果集。在实际应用中,需要配置数据源、事务管理器和jdbcTemplate bean,然后在业务...

    使用Spring的JdbcTemplate实现分页功能

    使用Spring的JdbcTemplate实现分页功能

    JdbcTemplate使用.doc

    在Java应用中,特别是在基于Spring的系统中,`JdbcTemplate`是一个非常常用的数据访问工具,它提供了事务管理、参数绑定、异常翻译等功能,使得数据库操作更加简单、安全。 首先,要使用`JdbcTemplate`,我们需要...

    JdbcTemplate操作总结

    在`main`方法中,通过`jdbcTemplate`执行SQL查询,获取`SqlRowSet`对象,然后遍历结果集打印用户真实姓名(`USER_REAL_NAME`)。这展示了JdbcTemplate的基本用法,即通过调用其提供的方法执行SQL并处理结果。 ...

    jdbcTemplate需要用到的jar包.zip

    5. **处理结果**:对于查询操作,`JdbcTemplate`会返回一个结果集,你可以通过`RowMapper`或`ResultSetExtractor`将结果转换为Java对象。 6. **事务管理**:如果需要,可以通过`PlatformTransactionManager`和`@...

    打印JdbcTemplate执行sql

    2. **JdbcTemplate的使用**:在使用`JdbcTemplate`执行SQL时,其内部会自动创建SQL执行的Logger对象,如果日志级别设置为`DEBUG`,则会打印出SQL语句及其参数。例如,对于一个简单的查询操作: ```java ...

    Spring框架JdbcTemplate类中查询方法介绍

    在使用 JdbcTemplate 时,需要将 SQL 语句和参数传递给相应的方法,然后 JdbcTemplate 会将参数绑定到 SQL 语句中,并执行查询或更新操作。 在查询结果为空或查询结果大于 1 行时,JdbcTemplate 会抛出异常。这些...

    简单介绍如何使用Spring Boot使用JdbcTemplate与MySQL进行数据库操作

    在本文中,我们将深入探讨如何使用Spring Boot集成JdbcTemplate与MySQL数据库进行数据操作。Spring Boot以其简化配置和快速启动的特点,已经成为Java开发者的首选框架。而JdbcTemplate是Spring框架的一部分,它提供...

    jdbcTemplate的jar包.rar

    5. **结果集处理**:对于查询操作,JdbcTemplate支持多种方式将结果集转换为Java对象,如RowMapper、ResultSetExtractor、List等,方便数据的处理和映射。 6. **异常处理**:JdbcTemplate对JDBC的异常进行了封装,...

    Spring--JdbcTemplate.pdf

    3. 执行分页查询:通过分页信息调用JdbcTemplate方法来返回结果集合。 JdbcTemplate的使用涉及到许多细节,如事务管理、异常处理和SQL注入防护等。在具体应用时,开发者需要结合实际业务需求和Spring框架的其他特性...

Global site tag (gtag.js) - Google Analytics