这是我工作之前遇到的一个需求,Java调用存储过程,入参是集合。踩了一些坑,决定写个干货,和大家分享下。

项目使用的oracle版本:

com.oracle

ojdbc6

11.2.0.1.0

system

${project.basedir}/lib/com/oracle/ojdbc6/11.2.0.1.0/ojdbc6-11.2.0.1.0.jar

具体的Java代码如下:

import oracle.jdbc.OracleTypes;

import oracle.sql.ARRAY;

import oracle.sql.ArrayDescriptor;

import oracle.sql.STRUCT;

import oracle.sql.StructDescriptor;

import org.springframework.dao.DataAccessException;

import org.springframework.jdbc.core.CallableStatementCallback;

import org.springframework.jdbc.core.CallableStatementCreator;

import org.springframework.jdbc.core.JdbcTemplate;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

注:T_ARRAY_VITAL_SIGNS 对应存储过程自定义的对象数组,必须要大写

private Object execute( final List list) {

return jdbcTemplate.execute(new CallableStatementCreator(){

@Override

public CallableStatement createCallableStatement(Connection con) throws SQLException {

String execuSql = "{call ExecuteInterface.saveBatchVitalSign(?,?,?)}";

con = con.getMetaData().getConnection();

ARRAY array = getOracleArray(con, "T_ARRAY_VITAL_SIGNS", list);

CallableStatement cs = con.prepareCall(execuSql);

cs.setArray(1,array);

cs.registerOutParameter(2, OracleTypes.INTEGER);

cs.registerOutParameter(3, OracleTypes.VARCHAR);

return cs;

}

},new CallableStatementCallback(){

@Override

public String doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {

cs.execute();

int errorcode = cs.getInt(2);

if (errorcode < 0) {

String errormsg = cs.getString(3);

throw new RuntimeException("添加数据失败:" + errormsg);

}

else if (errorcode == 0) {

return "SUCCESS";

}

return "SUCCESS";

}

});

}

定义传给存储过程方法的对象数组结构参数。(注:T_VITAL_SIGNS 对应存储过程自定义的对象,必须要大写)

private ARRAY getOracleArray(Connection con, String Oraclelist,List list) throws SQLException {

ARRAY result = null;

if(list!=null&& list.size() > 0){

StructDescriptor structdesc = new StructDescriptor("T_VITAL_SIGNS", con);

STRUCT[] structs = new STRUCT[list.size()];

Object[] objects = new Object[0];

for (int i = 0; i < list.size();i++) {

objects = new Object[11];

objects[0] = new String(((HisBatchThreeTest)(list.get(i))).getPatientId());

objects[1] = new String(((HisBatchThreeTest)(list.get(i))).getVisitId());

objects[2] = new String(((HisBatchThreeTest)(list.get(i))).getTimePoint());

objects[3] = new String(((HisBatchThreeTest)(list.get(i))).getClassCode());

objects[4] = new String(((HisBatchThreeTest)(list.get(i))).getVitalCode());

objects[5] = new String(((HisBatchThreeTest)(list.get(i))).getVitalSigns());

objects[6] = new String(((HisBatchThreeTest)(list.get(i))).getVitalSignsValue());

objects[7] = new String(((HisBatchThreeTest)(list.get(i))).getUnits());

objects[8] = new String(((HisBatchThreeTest)(list.get(i))).getNurse());

objects[9] = new String(((HisBatchThreeTest)(list.get(i))).getWardCode());

objects[10] = new String(((HisBatchThreeTest)(list.get(i))).getBedLabel());

structs[i] = new STRUCT(structdesc, con, objects);

}

ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist,con);

result = new ARRAY(desc, con, structs);

}

return result;

}

注:接收字段若为VARCHAR2,赋值不了给存储过程,需要定义为NVARCHAR2

oracle对象.png

oracle数组 .png

java 调用存储过程structdescriptor,Java调用oracle存储过程,集合入参的正确姿势相关推荐

  1. java oracle sql 参数_oracle pl/sql之在java中调用带有输入输出参数的oracle存储过程...

    只需注意一点输出参数是用CallableStatement里面的registerOutParameter方法注册进去 存储过程: import java.sql.CallableStatement; ...

  2. oracle存储过程实验报告总结,Oracle存储过程总结(一、基本应用)

    Oracle 存储过程总结 基本应用技巧,大家可以学习下oracle存储过程最基本的东西. 1.创建存储过程 create or replace procedure test(var_name_1 i ...

  3. oracle存储过程在哪里找,oracle存储过程常用的技巧(详)

    我们在进行pl/sql编程时打交道最多的就是存储过程了.存储过程的结构是非常的简单的,我们在这里除了学习存储过程的基本结构外,还会学习编写存储过程时相关的一些实用的知识.如:游标的处理,异常的处理,集 ...

  4. oracle存储过程深入,深入了解oracle存储过程的优缺点

    定义: 存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是 ...

  5. oracle存储过程语法和用法,oracle存储过程 语法 函数 总结

    对于oracle 存储过程是很优秀的一种脚本语言.下面是一些整理: 一,Plsql 调试存储过程: 1. 在oracle的 配置和移植工具 àNET MANAGER中配置连接 2. 在plsql中新建 ...

  6. oracle存储过程文件在哪,Oracle存储过程读文件-Oracle

    Oracle存储过程读文件 create or replace PROCEDURE PR_FINANCE_PRODUCT_PARSE ( v_filename  IN  VARCHAR2,   –解析 ...

  7. oracle存储过程怎么做加密,Oracle存储过程加密实现方法

    Oracle存储过程加密实现方法: 1. c:/>set NLS_LANG=AMERICAN_AMERICA.USACII7  或c:/>set NLS_LANG=AMERICAN_AME ...

  8. oracle存储过程调试无法进入,oracle存储过程无法调试

    问题: 使用pl/sql developer 调试oracle 存储过程. 在存储过程上点右键,选调试(test),然后按f9(debug).这是正常的话,那些run.step into等按钮就可以点 ...

  9. oracle 存储过程 存储 blob,穿越oracle存储过程的Blob参数上传文件

    前两天朋友找我做一个上传过程,极其容易的一个东西!我未曾用过java,现学现卖,反正也是很容易. 不过,其中除非碰到一个东西,在网上查了半晌,也未曾找遍地理的措施!尔后才好不轻率获胜了.我把这个登记下 ...

最新文章

  1. 深入浅出理解Paxos算法
  2. 收藏 | PyTorch模型训练特征图可视化(TensorboardX)
  3. java中Collections的接口及类层次图
  4. Eclipse如何提高开发效率(转)
  5. 杨攀:融云专注极致技术 不忘初心打造极简体验
  6. 前端学习(2475):表单数据绑定处理
  7. 180405之循环嵌套
  8. nginx第三方模块---nginx-sticky-module的使用(基于cookie的会话保持)
  9. php h5读写数据库,H5学习_番外篇_PHP数据库操作
  10. IDL实现矢量(shp)裁剪栅格TASK(一)
  11. 【NLP 自然语言处理】自然语言处理技术难点和挑战
  12. H5+CSS前端特效源代码:可旋转动态日文片假名
  13. C语言实现【小游戏——飞机大战】
  14. 嵌入式技术及应用基础实验
  15. OBS录屏闪动问题解决方案
  16. CNPC海外操作人员英语日常用语900句
  17. DSCP(Differentiated Service Codepoint,差分服务代码点)
  18. 小红书竞品分析_App竞品分析报告:小红书VS洋码头
  19. CUP 三级缓存L1 L2 L3 cahe详解
  20. 2018河南省第十一届ACM省赛之旅。。。

热门文章

  1. html 图片自动切换插件,jquery图片切换插件
  2. 一个用Spring Boot做的垃圾分类小程序,你不拿来学习一下?
  3. 皮一皮:大义灭亲啊这是...
  4. 程序员必知的操作系统知识点
  5. 为什么 GROUP BY 之后不能直接引用原表中的列?
  6. 每日一皮:前程序员离职后没人想接的代码...
  7. Spring Boot Profile使用详解及配置源码解析
  8. 硝烟四起的云服务双十一促销大战,谁更便宜?
  9. 一文了解web无状态会话token技术JWT
  10. linux修改arena大小,教大家Resolume Arena怎么设置大屏幕的方法