java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误

本文讨论了在数据导入脚本中,通过使用批量查询和恰当的数据库连接管理来避免大量重复查询导致的插入重复错误。作者分享了解决方案,包括在插入前检查并重用连接,以及关闭预处理语句和结果集的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今儿写和数据导入脚本,为了防止插入重复数据,便在插入前去数据库查一下,每批插入共用一个连接对象,结果大量重复查询,就造成了这个错误。

另外据网上博文,批量或大量更新、插入不去close也会报重复错误。。。

代码如下:

 private static void doInsertList(List<Company> companyList) throws Exception {
        //每批插入共用一个数据库连接
        Connection insertConn = getConnection();
        //每批查询共用一个数据库连接
        Connection searchConn = getConnection();
        PreparedStatement pstmt = insertConn.prepareStatement("insert into T_COMPANY (TITLE, UNIFORMCODE, REGISTEREDCAPITAL, PROVINCE, CITY, PID, UPDATERATE, ISENABLE,REGISTEREDDATE) values (?, ?, ?, ?, ?, ?, ?, ?, ?)");
        pstmt.clearBatch();
        for (int i = 0; i < companyList.size(); i ++) {
            if (exitName(companyList.get(i).TITLE,companyList.get(i).UNIFORMCODE,searchConn)){
                continue;
            }
        }
}

 查询方法

 public static boolean exitName(String name,String UNIFORMCODE,Connection conn) throws Exception{
        String sql = "SELECT * FROM t_company where TITLE = '"+ name +"' or UNIFORMCODE = '"+ UNIFORMCODE +"'";
        PreparedStatement pstmt = null;
        try {
            pstmt = conn.prepareStatement(sql);
            ResultSet resultSet = pstmt.executeQuery();//将查询的结果放入ResultSet结果集中
            if (resultSet.next()) {
                //resultSet.close();
                //pstmt.close();
                return true;
            }
            //resultSet.close();
            //pstmt.close();
        } catch (SQLException e) {
            System.out.println("操作失败o(╥﹏╥");
            e.printStackTrace();
        }
        return false;
    }

 由于查询后没有关闭resultSet,PreparedStatement,就报了以下错误。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值