oracle sql dans plus de 1000 paramètres signale une erreur (ORA-01795: le nombre maximum d'expressions dans la liste est de 1000) l'une des solutions

        Dans la base de données oracle, lorsque SQL utilise in, si le nombre d'énergie de in dépasse 1000, il indiquera "ORA- 01795 : le nombre maximum d'expressions dans une liste est de 1000 / ORA - 01795 : le nombre maximum d'expressions dans une liste est de 1000" C'est l'un des stands sur lesquels tout le monde est souvent entré en production!

       Dans l'environnement de test, en raison de la faible quantité de données, les cas de test ne sont pas couverts. Dans certaines scènes, tout le monde aura l'impression que dans des circonstances normales, il ne dépassera certainement pas 1000 (pensez à la loi de Murphy) pendant le temps d'évaluation, et le tonnerre noir a souvent été planté à ce moment!

    Il existe de nombreuses solutions à ORA-01795 sur Internet, comme utiliser in () ou in (), créer une jointure de table temporaire, utiliser union, etc. Je propose également une solution ici. Il n'y a pas de standard pour la solution. Quant au choix, cela dépend de la vôtre. Préférences et scénarios d'application.

 

Une liste d'expressions séparées par des virgules ne peut pas contenir plus de 1 000 expressions. Une liste d'ensembles d'expressions séparés par des virgules peut contenir n'importe quel nombre d'ensembles, mais chaque ensemble ne peut pas contenir plus de 1 000 expressions.

        Le tuple oracle (une liste d'ensembles d'expressions délimités par des virgules) est utilisé ici, qui est un tuple, la syntaxe est la suivante:

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

Par exemple, si nous voulons interroger les informations utilisateur par ID utilisateur à partir de la table utilisateur, nous pouvons écrire:

sélectionnez * depuis t_user u où (1, u.id) dans ((1, 'id001'), (1, 'id002'), (1, 'XXX'))

L'instruction ci-dessus est en fait équivalente à: select * from t_user u where (1 = 1 and u.id = 'id001') or (1 = 1 and u.id = 'id002') or (1 = 1 and u.id = «XXX»)

La plupart de vos projets utiliseront des frameworks ORM tels que MyBatis. Nous pouvons utiliser MyBatis foreach. Il s'avère que ceci s'écrit:

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

Maintenant, faites une légère modification:

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

Conseil personnalisé: ce n'est pas la meilleure solution. Si la quantité de données est importante, il est recommandé d'effectuer la pagination. Si la quantité de données est importante, la pagination de la base de données est recommandée. J'ai également un article sur la pagination de la mémoire. Si vous en avez besoin, tout le monde Vous pouvez vous référer à: Utilisez l'API de flux java8 pour réaliser l'outil d'acquisition de pagination de collection de listes

De plus, voici également pour rappeler à nos testeurs que dans certains traitements par lots de tests fonctionnels, il est préférable de considérer le cas de gros volumes de traitement de données lors de la conception du cas d'utilisation!

Document de référence: 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 vous exécutez la requête dans l'application et que vous devez l'exécuter souvent, la solution de Tom Kyte est certainement   la meilleure. Fondamentalement, il recommande ce qui suit:

Suggérez-vous de créer une table temporaire globale, tableau insérez votre «dans la liste» dans cette table et utilisez
select…. and (te in (select * from global_temp_table); "

Je suppose que tu aimes

Origine blog.csdn.net/kevin_mails/article/details/89508268
conseillé
Classement