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

c008b8db3c1b

oracle对象.png

c008b8db3c1b

oracle数组 .png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值