Spring JdbcTemplate 调用oracle存储过程,实现批量数据插入

研究了一下,写出来,方便有同样需求的兄弟。如果哪位大神有更好的方法,欢迎赐教。

在数据库层面需要做一下步骤

1:创建数据库表、创建数据库类型

1--创建测试数据库 2create table USERS 3( 4 USERCODE VARCHAR2(20), 5 LOGINNAME VARCHAR2(20) 6) 7--定义oracle对象 8create or replace type user_obj as object 9( 10 idx varchar2(20), 11 name varchar2(30) 12); 13create or replace type user_tab as table of user_obj; 14 15--创建一个测试存储过程 16create or replace procedure test_batch 17( 18 p_items in user_tab, 19 p_out out string 20) is 21 mob user_obj; 22begin 23 for idx in p_items.first() .. p_items.last() 24 loop 25 mob := p_items(idx); 26 insert into users(usercode, loginname) 27 values(mob.idx, mob.name); 28 end loop; 29 commit; 30 p_out := '成功'; 31 return; 32end;

2: Java代码开发

1// 定义JAVA实体对象,该对象与数据库实体OBJ对应 2import java.sql.Connection; 3import java.sql.SQLException; 4 5import oracle.jdbc.OracleTypes; 6import oracle.jpub.runtime.MutableStruct; 7import oracle.sql.Datum; 8import oracle.sql.ORAData; 9import oracle.sql.ORADataFactory; 10 11public class User implements ORAData{ 12 private String idx; 13 private String name; 14 15 public static final String typeName = "USER_OBJ"; //这里需要大写 16 protected MutableStruct struct; 17 static int[] sqlType = { OracleTypes.VARCHAR, OracleTypes.VARCHAR}; 18 static ORADataFactory[] factory = new ORADataFactory[sqlType.length]; 19 20 public User() { 21 struct = new MutableStruct(new Object[sqlType.length], sqlType, factory); 22 } 23 public User(String idx,String name) { 24 this(); 25 this.idx=idx; 26 this.name=name; 27 } 28 @Override 29 public Datum toDatum(Connection conn) throws SQLException { 30 struct.setAttribute(0, this.idx); 31 struct.setAttribute(1, this.name); 32 return struct.toDatum(conn, typeName); 33 } 34 public String getIdx() { 35 return idx; 36 } 37 public void setIdx(String idx) { 38 this.idx = idx; 39 } 40 public String getName() { 41 return name; 42 } 43 public void setName(String name) { 44 this.name = name; 45 } 46} 47 48// 定义测试方法 49@Test 50public void testProcedure() { 51 List<User> userList = new ArrayList<User>(); 52 User s1 = new User(); 53 User s2 = new User(); 54 55 s1.setIdx("110"); 56 s1.setName("zz"); 57 58 s2.setIdx("111"); 59 s2.setName("xx"); 60 61 userList.add(s1); 62 userList.add(s2); 63 64 String sql = "{call test_batch(?,?)}"; 65 String resp = jdbcTemplate.execute(sql, new CallableStatementCallback<String>() { 66 public String doInCallableStatement(CallableStatement cstmt) throws SQLException, DataAccessException { 67 Connection con = cstmt.getConnection().getMetaData().getConnection(); 68 ArrayDescriptor tabDesc = ArrayDescriptor.createDescriptor("USER_TAB", con); 69 ARRAY vArray = new ARRAY(tabDesc, con, userList.toArray()); 70 cstmt.setArray(1, vArray); 71 cstmt.registerOutParameter(2, Types.VARCHAR); 72 cstmt.execute(); 73 74 return cstmt.getString(2); 75 } 76 }); 77 System.out.println(resp); 78}

3: 测试结果

测试成功,数据库查询结果,成功。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Spring JdbcTemplate 调用oracle存储过程,实现批量数据插入 - HelloWorld