Oracle会话与临时表

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值