oracle批量保存,使用存储过程报错批量数据

oracle保存批量数据(使用的是存储过程调用方式),以下为后端的部分代码片段

@Override  //使用存储过程保存批量对象
public int saveman(List<ManDTO> manlist) throws NamingException, SQLException {
	Connection conn getConn();
	OracleCallableStatement stmt = null;
	try {
		if(null != conn) {
			ARRAY array = getArrayMan(conn,"TYPE_MAN","ARRAY_TYPE_MAN",manlist);
			String sql = "{call dosomething_man.save_mans(?,?)}";
			stmt = (OracleCallableStatement)conn.prepareCall(sql);
			stmt.setARRAY(1,array);
			stmt.registerOutParamenter(2,java.sql.Types.INTEGER);
			stmt.execute();
			return stmt.getInt(2);
		}
	}catch(Exception e) {
		throw new ResponseException(e);
	}finally {
		stmt.close();
		if(null != conn) {
			conn.close();
		}
	}
	
}

private ARRAY getArrayMan(Connection conn,String oracleType,String oracleArray,List<ManDTO> manlist)throws SQLException{
	ARRAY list = null;
	if(null != manlist && !manlist.isEmpty()) {
		StructDescriptor structdesc = new StructDescriptor(oracleType,conn);
		STRUCT[] structs = new STRUCT[manlist.size()];
		for(int i=0;i<manlist.size();i++) {
			ManDTO manDTO = manlist.get(i);
			Object[] paramObj = paramColumn(manDTO);
			structs[i] = new STRUCT(structdesc,conn,paramObj);
		}
		ArrayDescriptor desc = ArrayDescriptor.createDescriptor(oracleArray,conn);
		list = new ARRAY(desc,conn,structs);
	}
	return list;
}
private Object[] paramColumn(ManDTO manDTO) {
	Object[] paramCol = new Object[5];
	paramCol[0] = manDTO.getId();
	paramCol[1] = manDTO.getRoles();
	paramCol[2] = manDTO.getIsleader();
	paramCol[3] = manDTO.getIsman();
	paramCol[4] = manDTO.getIsmarry();
	return paramCol;
}
//以下为获取数据库连接
protected Connection getConn()throws NamingException, SQLException {
	DataSource ds = getDataSource();
	if(null != ds) {
		Connection conn = ds.getConnection();
		return conn;
	}
	return null;
} 
private DataSource getDataSource()throws NamingException {
	Context initCtx = new InitialContext();
	DataSource ds = initCtx.lookup("java:comp/env/jdbc/oraclename");//使用jndi连接方式连接数据库
	return ds;
}
其中ManDTO的属性字段如下:
public class ManDTO {
	private String id;
	private String roles;
	private String isleader;
	private String isman;
	private String ismarry;
    ...set和get方法
}
以及调用存储过程时使用到的两个type,创建type语句如下:
CREATE OR REPLACE TYPE "TYPE_MAN" AS OBJECT(
	id       varchar2(32);
	roles    varchar2(10);
	isleader varchar2(1);
	isman    varchar2(1);
	ismarry  varchar2(1);
);

CREATE OR REPLACE TYPE ARRAY_TYPE_MAN AS TABLE OF TYPE_MAN;

调用的存储过程dosomething_man.save_mans该如何写呢,存储过程如下:

create or replace package dosomething_man is 
	PROCEDURE save_mans(
		paxinfo        in    ARRAY_TYPE_MAN ,
		 out_reuslt   out  number
	);
end dosomething_man ;
/
create or replace package body dosomething_man is 
    PROCEDURE save_mans(
		paxinfo        in    ARRAY_TYPE_MAN ,
		 out_reuslt   out  number
	)IS
	v_num			number :=0;
	BEGIN  
		for i in paxinfo.first .. paxinfo.last loop
			select count(1) into v_number from table_man where id = paxinfo(i).id;
			if v_num > 0 then 
				update table_man set
					roles = COALESCE(paxinfo(i).roles,roles),//COALESCE函数的使用可以自行百度一下,很常用的一个函数
					isleader = COALESCE(paxinfo(i).isleader,isleader),
					isman  = COALESCE(paxinfo(i).isman  ,isman),
					ismarry= COALESCE(paxinfo(i).ismarry,ismarry)
					where id = paxinfo(id).id;
				else 
					insert into table_man 
					(id,isleader ,isman  ,ismarry)
					values
					(sys_guid(),paxinfo(i).isleader,paxinfo(i).isman,paxinfo(i).ismarry);
			end if;
		end loop;
		commit;
		out_result :=1;
		EXCEPTION WHEN OTHER THEN
			rollback;
			out_result :=-1;
	END save_mans;
end dosomething_man;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值