Oracle sql en más de 1000 parámetros informe de error (ORA-01795: el número máximo de expresiones en la lista es 1000) una de las soluciones

        En la base de datos de Oracle, cuando SQL usa in, si el número de energía de in excede 1000, informará "ORA- 01795 : el número máximo de expresiones en una lista es 1000 / ORA - 01795 : el número máximo de expresiones en una lista es 1000" ¡Este es uno de los pozos que todo el mundo pisó a menudo durante la producción!

       En el entorno de prueba, debido a la pequeña cantidad de datos, los casos de prueba no están cubiertos. En algunos escenarios, todos sentirán que en circunstancias normales definitivamente no excederá 1000 (piense en la ley de Murphy) durante el tiempo de evaluación, ¡y el trueno oscuro a menudo se planta en este momento!

    Hay muchas soluciones para ORA-01795 en Internet, como usar in () o in (), crear una combinación de tabla temporal, usar union, etc. También proporciono una solución aquí. No hay un estándar para la solución. En cuanto a la elección, depende de la suya. Preferencias y escenarios de aplicación.

 

官方 说 : Una lista de expresiones delimitada por comas no puede contener más de 1000 expresiones. Una lista delimitada por comas de conjuntos de expresiones puede contener cualquier número de conjuntos, pero cada conjunto no puede contener más de 1000 expresiones.

        Aquí se usa la tupla de oráculo (una lista delimitada por comas de conjuntos de expresiones), que es una tupla, la sintaxis es la siguiente:

SELECT * FROM TABLE_NAME WHERE (1, COLUMN_NAME) IN 
((1, VALUE_1), 
(1, VALUE_2), 
...
...
...
...
(1, VALUE_1000),
(1, VALUE_1001));

Por ejemplo, si queremos consultar información de usuario por ID de usuario de la tabla de usuarios, podemos escribir:

seleccione * de t_user u donde (1, u.id) en ((1, 'id001'), (1, 'id002'), (1, 'XXX'))

La declaración anterior es en realidad equivalente a: select * from t_user u donde (1 = 1 y u.id = 'id001') o (1 = 1 y u.id = 'id002') o (1 = 1 y u.id = 'XXX')

La mayoría de sus proyectos usarán frameworks ORM como MyBatis. Podemos usar MyBatis foreach. Resulta que esto está escrito:

 WHERE u.id IN(
        <foreach collection="list" item="item" index="index" separator=",">
            #{item}
        </foreach>
        )

Ahora haz una pequeña modificación:

 WHERE (1, u.id) IN(
        <foreach collection="list" item="item" index="index" separator=",">
            (1, #{item})
        </foreach>
        )

Consejo personal: esta no es la mejor manera. Si la cantidad de datos es grande, se recomienda que realice la paginación. Si la cantidad de datos es grande, se recomienda la paginación de la base de datos. También tengo un artículo sobre la paginación de memoria. Si lo necesita, todos Puede consultar: Use java8 stream api para realizar la herramienta de adquisición de paginación de colección de listas

Además, aquí también se recuerda a nuestros probadores que en algunos procesos por lotes de pruebas funcionales, es mejor considerar el caso de grandes cantidades de procesamiento de datos al diseñar el caso de uso.

Documento de referencia: https://docs.oracle.com/database/121/SQLRF/expressions016.htm#SQLRF52099

                  http://dbaparadise.com/2016/07/limitations-of-the-in-clause-in-oracle-ora-01795/#3

Si ejecuta la consulta en la aplicación y necesita ejecutarla con frecuencia, definitivamente  la solución de Tom Kyte  es la mejor. Básicamente recomienda lo siguiente:

Sugiero que cree una tabla temporal global, inserte la matriz "en la lista" en esta tabla y use
seleccionar…. y (te in (seleccionar * de global_temp_table); "

Supongo que te gusta

Origin blog.csdn.net/kevin_mails/article/details/89508268
Recomendado
Clasificación