java 调用存储过程structdescriptor,Java调用oracle存储过程,集合入参的正确姿势
这是我工作之前遇到的一个需求,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存储过程,集合入参的正确姿势相关推荐
- java oracle sql 参数_oracle pl/sql之在java中调用带有输入输出参数的oracle存储过程...
只需注意一点输出参数是用CallableStatement里面的registerOutParameter方法注册进去 存储过程: import java.sql.CallableStatement; ...
- oracle存储过程实验报告总结,Oracle存储过程总结(一、基本应用)
Oracle 存储过程总结 基本应用技巧,大家可以学习下oracle存储过程最基本的东西. 1.创建存储过程 create or replace procedure test(var_name_1 i ...
- oracle存储过程在哪里找,oracle存储过程常用的技巧(详)
我们在进行pl/sql编程时打交道最多的就是存储过程了.存储过程的结构是非常的简单的,我们在这里除了学习存储过程的基本结构外,还会学习编写存储过程时相关的一些实用的知识.如:游标的处理,异常的处理,集 ...
- oracle存储过程深入,深入了解oracle存储过程的优缺点
定义: 存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是 ...
- oracle存储过程语法和用法,oracle存储过程 语法 函数 总结
对于oracle 存储过程是很优秀的一种脚本语言.下面是一些整理: 一,Plsql 调试存储过程: 1. 在oracle的 配置和移植工具 àNET MANAGER中配置连接 2. 在plsql中新建 ...
- oracle存储过程文件在哪,Oracle存储过程读文件-Oracle
Oracle存储过程读文件 create or replace PROCEDURE PR_FINANCE_PRODUCT_PARSE ( v_filename IN VARCHAR2, –解析 ...
- oracle存储过程怎么做加密,Oracle存储过程加密实现方法
Oracle存储过程加密实现方法: 1. c:/>set NLS_LANG=AMERICAN_AMERICA.USACII7 或c:/>set NLS_LANG=AMERICAN_AME ...
- oracle存储过程调试无法进入,oracle存储过程无法调试
问题: 使用pl/sql developer 调试oracle 存储过程. 在存储过程上点右键,选调试(test),然后按f9(debug).这是正常的话,那些run.step into等按钮就可以点 ...
- oracle 存储过程 存储 blob,穿越oracle存储过程的Blob参数上传文件
前两天朋友找我做一个上传过程,极其容易的一个东西!我未曾用过java,现学现卖,反正也是很容易. 不过,其中除非碰到一个东西,在网上查了半晌,也未曾找遍地理的措施!尔后才好不轻率获胜了.我把这个登记下 ...
最新文章
- 深入浅出理解Paxos算法
- 收藏 | PyTorch模型训练特征图可视化(TensorboardX)
- java中Collections的接口及类层次图
- Eclipse如何提高开发效率(转)
- 杨攀:融云专注极致技术 不忘初心打造极简体验
- 前端学习(2475):表单数据绑定处理
- 180405之循环嵌套
- nginx第三方模块---nginx-sticky-module的使用(基于cookie的会话保持)
- php h5读写数据库,H5学习_番外篇_PHP数据库操作
- IDL实现矢量(shp)裁剪栅格TASK(一)
- 【NLP 自然语言处理】自然语言处理技术难点和挑战
- H5+CSS前端特效源代码:可旋转动态日文片假名
- C语言实现【小游戏——飞机大战】
- 嵌入式技术及应用基础实验
- OBS录屏闪动问题解决方案
- CNPC海外操作人员英语日常用语900句
- DSCP(Differentiated Service Codepoint,差分服务代码点)
- 小红书竞品分析_App竞品分析报告:小红书VS洋码头
- CUP 三级缓存L1 L2 L3 cahe详解
- 2018河南省第十一届ACM省赛之旅。。。
热门文章
- html 图片自动切换插件,jquery图片切换插件
- 一个用Spring Boot做的垃圾分类小程序,你不拿来学习一下?
- 皮一皮:大义灭亲啊这是...
- 程序员必知的操作系统知识点
- 为什么 GROUP BY 之后不能直接引用原表中的列?
- 每日一皮:前程序员离职后没人想接的代码...
- Spring Boot Profile使用详解及配置源码解析
- 硝烟四起的云服务双十一促销大战,谁更便宜?
- 一文了解web无状态会话token技术JWT
- linux修改arena大小,教大家Resolume Arena怎么设置大屏幕的方法