java jdbc oracle ORA-01795: 列表中的最大表达式数为 1000

本文介绍了当使用SQL IN子句时遇到ORA-01795错误的情况及两种解决方案。一种是在事务处理中通过合理构建SQL语句来避免超过1000个元素的限制;另一种是在查询中将超过1000个元素的数据拆分成多个IN子句。

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

在操作SQL中存在In的数量如果超过1000条会提示   ORA-01795: 列表中的最大表达式数为 1000

归纳有几种方式出现的:

第一种是:我在上一个 [jdbc 同时执行 查询和删除操]作中提到 在一个事务中在了in操作超出了 1000条,修改代码如下:

 

 Connection conn = null;
        try {
            // 创建连接实例
            conn = JdbcUtility.GetFactory().CreateConn();
            conn.setAutoCommit(false);
            conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

            StringBuilder _strbd = new StringBuilder();
            _strbd.append(" delete from  table1  where id in ( ");
            _strbd.append(" select sp_1.table1 from  table2 ");
            _strbd.append("  sp_1,sp_tcontentinfo sp_2  ");
            _strbd.append(" where sp_1.id=sp_2.id");
            _strbd.append("  ) ");
            Statement stmt = conn.createStatement();
           
            // 执行语句
            int r = stmt.executeUpdate(_strbd.toString());
            conn.commit();
            stmt.close();
            log.info("清理数据成功!");
        } catch (Exception ex) {
            if (null != conn) {
                try {
                    conn.rollback();
                } catch (SQLException se) {
                    log.error("清理数据回滚失败!");
                }
            }
            log.error("清理数据失败,错误信息为:"+ex.getMessage());
        } finally {
            if (null != conn) {
                try {
                    conn.close();
                } catch (SQLException se) {
                    log.error("清理数据,关闭数据库失败!");
                }
            }
        }

第二种: 在单独的查询中

SQL里面的IN中的数据量不能超过1000条
解决办法:
例如
Select * from table_name where col in (‘col1’,’col2’ ……..)
如果in 后面的Item过多的话,超过1000就会出现这种错误。
解决方法是:
Select * from tablename where col in (‘col1’,’col2’ …….., ‘col1000’) or col in (‘col1001’, …………)

在构建SQL语句时稍微注意一下就好了。

转载于:https://www.cnblogs.com/northeastTycoon/p/5737878.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值