您的当前位置:首页正文

Oracle会话与临时表

2024-11-13 来源:个人技术集锦

今天被一个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无效




Top