Oracle数据库查询用 where in 查询的项超过1000条的解决方案

众所周知,如果我们的用SQL查询语句时,如果用where in带的参数超过1000条的话,oracle是会报错的。

因为项目中遇到这样的问题,所以找到了接下来我要说的这个办法。 因为用的地方很多,所以我把这个封装成了一个方法。

        /// <summary>
        /// 获取查询条件超过1000个列表数据的SQL
        /// columnName In :list
        /// </summary>
        /// <param name="list">参数列表</param>
        /// <param name="columnName">字段名称</param>
        /// <param name="arguments">带出的参数</param>
        /// <returns>sql</returns>
        private string GetWhereIn(List<string> list, string columnName, out Dictionary<string, object> arguments)
        {
            arguments = new Dictionary<string, object>();
            if (list == null || list.Count == 0) return string.Empty;

            var pageSizes = 1000;

            // 计算参数分页页数
            var totalPages = list.Count % pageSizes == 0 ?
                list.Count % pageSizes :
                list.Count % pageSizes + 1;

            var sqlResultContainer = new List<string>();

            for (var pageIndex = 0; pageIndex < totalPages; pageIndex++)
            {
                var skipCount = pageIndex * pageSizes;
                var listGroup = list.Skip(skipCount).Take(totalPages).ToList();
                if (listGroup.Count == 0) continue;

                sqlResultContainer.Add($"{columnName} IN :p{pageIndex}");
                arguments.Add($"p{pageIndex}", listGroup);
            }

            var sqlResult = "(" + string.Join(" OR ", sqlResultContainer) + ")";

            return sqlResult;
        }

  只想SQL,我用的是Dapper. 所以调用这个方法后,返回的是个sql语句。用于拼接在where后面或者and后面等。 arguments是传值出来的,需要带如到dapper的传参中。

注意的是 argumens的类型是Dictionary<string,object> 第二个一定是要object,不然的话,dapper是会报错的。

原文地址:https://www.cnblogs.com/saving/p/9967955.html

时间: 2024-11-08 09:29:26

Oracle数据库查询用 where in 查询的项超过1000条的解决方案的相关文章

使用ADO连接oracle数据库“未找到提供程序。该程序可能未正确安装”解决方案

问题描述:VS2010开发的C++程序,在一台Win7旗舰版的已安装Oracle客户端的PC上连接不上Oracle,提示"未找到提供程序.该程序可能未正确安装",其他语言编写的程序比如C#是可以成功连接Oracle的: 解决办法:首先是找谷歌度娘帮忙,找了几篇文章,都说是没有Oracle的Oledb驱动,去安装目录XXXX\bin下还真没找到OraOLEDB*.dll,然后按照文章帮助将OraOLEDB10.dll文件拷贝至有问题的Win7上,在DOS下开始注册,这时却提示"

查询出所有首笔订单金额超过1000的会员卡号及其首笔订单金额

题目源自:http://www.cnblogs.com/xpivot/p/4143069.html#!comments 有一张ER图描述数据结构,简单文字描述如下,劳烦看官各种脑补主外键关系: 一张会员表(account),字段有会员id(account_id), 会员卡号(account_num)... 一张交易订单表(trans),字段有会员id(account_id),交易时间(trans_time),交易金额(sales)... 要求查询出所有首笔订单金额超过1000的会员卡号及其首笔订

oracle select in超过1000条报错解决方法

本博客介绍oracle select in超过1000条数据的解决方法,java框架是采用mybatis的,这可以说是一种比较常见的错误:select * from A where id in(...),oracle官方函数做了限定,in里的参数只能1000个,所以超过1000个参数就会报错,解决方法是将集合分为每个集合1000的小集合,然后用or拼起来select * from A where id in(1,2,...,1000) or id in (1001,1002,2000)...,好

Oracle数据库多个实例的查询与指定

近期在对单位某系统进行巡检时,发现该数据库有多个实例,直接对其中一个实例进行查询时,显示失 败.后发现需要对其进行指定,修改环境变量.具体思路如下: 1.首先登陆服务器,ps -ef |grep smon查看已经启动的实例        2.选定其中一个,export ORACLE_SID=实例名称 3.sqlplus / as sysdba 连接数据库进行查询

java连接oracle数据库调用存储过程实现分页查询(emp为例)

第一步:建一个含游标类型的包 sql>create or replace package testPackage as type test_cursor is ref cursor;    --定义名为test_cursor 的游标 end testPackage; 第二步:编写分页的存储过程 sql>create or replace procedure fenYe( tableName in varchar2,--表名 pageSize in number,--每页显示的记录数 pageN

oracle 数据库中 date类型数据查询操作,格式转换,字符转date

//查询日期(类型为date)的数据 select * from auth_organization_t t where to_char(create_date,'yyyy-mm-dd hh:mi:ss') = '2013-08-12 05:31:09' select to_char(create_date,'yyyy-mm-dd hh:mi:ss') from auth_organization_t t

Oracle 数据库常用SQL语句(2)查询语句

一.SQL基础查询 1.select语句 格式:select 字段 from 表名; 2.where 用于限制查询的结果. 3.查询条件 > < >= <= = != 4.与 或(AND,OR) 5.在 不在(IN,NOT IN) 练习:查询工号为1,9,11,16且工资低于1000的员工. 6.在 [a,b] (between val1 and val2) 查询工资大于1000,小于1500的员工. select * from s_emp where salary between

.net在Oracle数据库中为In条件查询防止sql注入参数化处理

//返回in条件处理方法 public static string InsertParameters(ref List<OracleParameter> orclParameters, int[] lsIds, string uniqueParName) { string strParametros = string.Empty; for (int i = 0; i <= lsIds.Length - 1; i++) { strParametros += i == 0 ? ":

Oracle 数据库基础学习 (六) 子查询

1.内连接(等值连接) 示例:将连个表内容连接显示 select * from dept d, emp e where d.deptno = e.deptno; 注意:只有当d.deptno = e.deptno条件满足,内容才会显示,否则不显示 2 .外连接:让等值判断左右两边有一边的数据可以全部显示出来,使用外连接方式时使用”(+)” 格式:   左外连接:字段=字段(+) 右外连接:字段(+)=字段 示例:显示雇员的姓名,职位和领导姓名 分析: 确认要使用的数据: 1.  emp表的雇员姓