注:本文来源《   jdbcTemplate 调用存储过程。 入参 array 返回 cursor   》

需求:

java传入一个list object。从数据库找到相关的数据并返回。

如果循环取数据,那么会产生N条SQL。(N为 list 的size)

开始计划使用临时表,先把list数据插入到数据库。可以使用批量插入,虽然也需要产生N条SQL,但是性能应该会比N个查询快很多。(不过没有实践)。

同事提醒说可以用存储过程,批量查询。之前并没有这么使用过。开始以为要使用in(id1, id2)那么查询。之前存储过程也没怎么使用过。大部分都是直接操作SQL。

实现过程

1)创建TYPE

  1 CREATE OR REPLACE TYPE TEST_OBJECT AS OBJECT
2 (
3 COLUMN1 VARCHAR2(50),
4 COLUMN2 NUMBER(10,2)
5 )

2 ) 创建TYPE OF TABLE

  1 CREATE OR REPLACE TYPE "TEST_OBJECT_ARRAY" AS TABLE OF TEST_OBJECT

3) 创建存储过程

  1 CREATE OR REPLACE PROCEDURE PROC_DD_GETPERSONINFO(V_TEST_LIST IN TEST_OBJECT ,
2 P_CUR OUT SYS_REFCURSOR
3 )
4
5 入参是一个就可以变成一个数组,在使用的时候类似于临时表使用。
6
7 SELECT * FROM TABLE(V_TEST_LIST)
8

4) 编写java代码

  1 @Repository
2 public class DataCacheDaoImpl implements DataCacheDao {
3
4 @Autowired
5 JdbcTemplate jdbcTemplate;
6
7 private ARRAY getArray(List<TestObject> list, Connection con) throws SQLException {
8 STRUCT[] struts = new STRUCT[list.size()];
9 int i = 0;
10 for (TestObject cr : list) {
11
12 Object[] obs = { cr.getContractNumber(), cr.getReceiveAmount() };
13 //mapping to object
14 StructDescriptor st = new StructDescriptor("TEST_OBJECT", con);
15 struts[i] = new STRUCT(st, con, obs);
16 }
17
18 //mapping to array
19 ArrayDescriptor arrayDept = ArrayDescriptor.createDescriptor("TEST_OBJECT_ARRAY", con);
20 ARRAY deptArrayObject = new ARRAY(arrayDept, con, struts);
21 return deptArrayObject;
22 }
23
24 @Override
25 public List<TestObjectResponse> getContractRepaymentList(List<TestObject> list) {
26
27 return jdbcTemplate.execute(new CallableStatementCreator() {
28
29 @Override
30 public CallableStatement createCallableStatement(Connection con) throws SQLException {
31
32 if (con.isWrapperFor(OracleConnection.class)) {
33 con = con.unwrap(OracleConnection.class);
34 }
35
36 String callProcedure = "{call PROC_DD_GETPERSONINFO(?,?)}";
37 CallableStatement cs = con.prepareCall(callProcedure);
38 ARRAY array = getArray(list, con);
39
40 cs.setArray(1, array);
41 cs.registerOutParameter(2, OracleTypes.CURSOR);
42
43 return cs;
44 }
45
46 }, new CallableStatementCallback<List<TestObjectResponse>>() {
47
48 @Override
49 public List<TestObjectResponse> doInCallableStatement(CallableStatement cs)
50 throws SQLException, DataAccessException {
51
52 List<TestObjectResponse> list = new ArrayList<>();
53
54 cs.execute();
55
56 ResultSet rs = (ResultSet) cs.getObject(2);
57 while (rs.next()) {
58 TestObjectResponse response = new TestObjectResponse();
59 // 组装你的bean
60 list.add(response);
61 }
62 return list;
63 }
64 });
65 }
66 }
67

jdbcTemplate 调用存储过程。 入参 array 返回 cursor的更多相关文章

  1. spring jdbctemplate调用存储过程,返回list对象

    注:本文来源于<  spring jdbctemplate调用存储过程,返回list对象 > spring jdbctemplate调用存储过程,返回list对象 方法: /** * 调用 ...

  2. ADO.NET访问SQL Server调用存储过程带回参

    1,ADO.NET访问SQL Server调用存储过程带回参 2,DatabaseDesign  use northwind go --存储过程1 --插入一条商品 productname=芹菜 un ...

  3. Spring如何使用JdbcTemplate调用存储过程的三种情况

    注:原文 <Spring如何使用JdbcTemplate调用存储过程的三种情况 > Spring的SimpleJdbcTemplate将存储过程的调用进行了良好的封装,下面列出使用Jdbc ...

  4. c++调用python系列(1): 结构体作为入参及返回结构体

    最近在打算用python作测试用例以便对游戏服务器进行功能测试以及压力测试; 因为服务器是用c++写的,采用的TCP协议,当前的架构是打算用python构造结构体,传送给c++层进行socket发送给 ...

  5. Spring JdbcTemplate 调用存储过程

    遇到调用存储过程的业务,以前有用过,但不是用Spring的 JdbcTemplate去做的,这次是在一个已经有的SpringMVC框架的项目下写处理存储过程的. 参考网络中的方法,在实际操作中遇到两个 ...

  6. Oracle存储过程入参传入List集合的小例子

    第一步:创建一个对象类型 create or replace type STUDENT as object( id ), name ), age ) ); / 第二步:创建一个数组类型 (任意选择下面 ...

  7. mybatis调用存储过程 无参、带有输入输出参数,输出游标类型的 存储

    存储过程在小公司用的不多,但是如果业务比较复杂或者性能要求比较苛刻的时候存储过程就派上用场了,ibatis的前期的一些版本貌似不支持存储过程因此我选择了mybatis来做实验. 1.无输入和输出参数的 ...

  8. 从输出日志中提取接口的入参和返回做为用例导入到excel中

    1  背景 接口用例已经在项目中的yml文件中编写,但是yml文件不能做为交付文档用,本文对工作中从接口输出日志中提取用例信息,并导入到excel文件中做了总些 2  工具 idea,notepad+ ...

  9. C#调用存储过程详解(带返回值、参数输入输出等)

    CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @studentname nvarchar(50) OUTPUT AS BEGI ...

随机推荐

  1. (6)设计一个TimeMap

    一.描述 设计一个TimeMap,基于key value的 支持两类操作set(string key, string value, int timestamp),get(string key, int ...

  2. luogu P4770 [NOI2018]你的名字

    传送门 upd 19.4.24: WC这个做法真的有问题,不往回跳会WA是因为一开始跳到了S[1...l-1]所对应的点,然后往后接字符的时候可能会因为不在正确的endpos中,然后往回跳过头,其实一 ...

  3. jQuery动态改变input框的属性

  4. BigDecimal实现末尾去掉无用0

    BigDecimal 原生提供了 stripTrailingZeros 方法可以实现去掉末尾的 0,然后使用 toPlainString 可以输出数值,注意这里如果使用 toString()  会变成 ...

  5. IMAGENT CLASSIFICATION WITH DEEP CONVOLUTIONAL NEURAL NETWORKS(翻译)

    0 - 摘要  我们训练了一个大型的.深度卷积神经网络用来将ImageNet LSVRC-2010竞赛中的120万高分辨率的图像分为1000个不同的类别.在测试集上,我们在top-1和top-5上的错 ...

  6. Exception:两个类具有相同的 XML 类型名称,请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称

    具体报错:  找到报错的类: 对XmlType重新命名(最简单粗暴的方法):

  7. Latex 编辑数学公式——快速上手

    参考链接: https://blog.csdn.net/fansongy/article/details/45368915 特殊符号: https://blog.csdn.net/caiandyong ...

  8. CF1139A Even Substrings

    题目地址:CF1139A Even Substrings 一个数是偶数等价于其最后一位为偶数(2/4/6/8/0) 从左往右扫一遍,如果一个数是奇数则直接跳过,偶数则加上它对答案的贡献 这里的贡献应该 ...

  9. 关于iframe的相关操作

    1.判断当前页面是否在iframe当中 if (top.location != self.location) { alert("in iframe") }

  10. Scala 入门介绍

    1 基础 1.1 Scala 解释器 REPL - 交互式解释器环境 R(read).E(evaluate).P(print).L(loop) 输入值,交互式解释器会读取输入内容并对它求值,再返回结果 ...