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;