今天被一个oracle问题坑了,
1.使用框架封装的接口,JAVA调用存储过程出现了重复插入情况。
List<?> list = (List<?>) datasourceagentContext.queryByHql("from PortfolioAcctgJrnlESHistRole where charindex_ex(secuCode, '000750')>0) ", null, null, null);
System.err.println(list.size());
datasourceagentContext.updateByHql("Delete from PortfolioAcctgJrnlESHistRole where charindex_ex(secuCode, '000750')>0) ", null);
List<?> list2 = (List<?>) datasourceagentContext.queryByHql("from PortfolioAcctgJrnlESHistRole where charindex_ex(secuCode, '000750')>0) ", null, null, null);
System.err.println(list2.size());
//调用存储过程,70960526,70960559
Object obj = callProc("opCalcProdCellAcctgJrnlES", "", "", "", "70960518,70960526,70960559", "", "000750","2017-05-01");
List<?> list0 = (List<?>) datasourceagentContext.queryByHql("from PortfolioAcctgJrnlESHistRole where charindex_ex(secuCode, '000750')>0) ", null, null, null);
System.err.println(list0.size());
2.自己直接调用,每次都是好的。
DataSource dataSource = (DataSource) datasourceagentContext.queryByNSql("", null);
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
Connection con;
try {
con = jdbcTemplate.getDataSource().getConnection();
String callSql = "{call opCalcProdCellAcctgJrnlES(?,?,?,?,?,?,?)}";
CallableStatement stmt = con.prepareCall(callSql);
stmt.setObject(1, "");
stmt.setObject(2, "");
stmt.setObject(3, "");
stmt.setObject(4, "70960518,70960526,70960559");
stmt.setObject(5, "");
stmt.setObject(6, "000750");
stmt.setObject(7, "2017-05-01");
stmt.execute();
3.存储过程调试每次都是好的
4.把调试代码放在新建回话中执行出现了重复插入的情况
总结:
1.由于存储过程中临时表造成的,java封装的接口连接使用的是线程池并不释放会话,所以原来临时表中的数据没有删除,
2.调试完存储过程会释放会话
3.存储过程的结尾,使用 EXECUTE IMMEDIATE 'truncate table 临时表';使用commit无效