Maison  >  Article  >  base de données  >  Exemple pour résoudre le problème selon lequel Oracle ne peut pas utiliser plus de 1 000 dans les instructions

Exemple pour résoudre le problème selon lequel Oracle ne peut pas utiliser plus de 1 000 dans les instructions

WBOY
WBOYavant
2022-06-13 18:11:142407parcourir

Cet article vous apporte des connaissances pertinentes sur Oracle, qui présente principalement comment utiliser la méthode in pour interroger des enregistrements. Si le nombre de paramètres après in dépasse 1000, une erreur se produira et JDBC lancera "java.sql.SQLException : ORA-01795 : Le nombre maximum d'expressions dans la liste est de 1 000", exception. Voyons comment le résoudre. J'espère que cela sera utile à tout le monde.

Exemple pour résoudre le problème selon lequel Oracle ne peut pas utiliser plus de 1 000 dans les instructions

Tutoriel recommandé : "Tutoriel vidéo Oracle"

在oracle中,使用in方法查询记录的时候,如果in后面的参数个数超过1000个,那么会发生错误,JDBC会抛出“java.sql.SQLException: ORA-01795: 列表中的最大表达式数为 1000”这个异常。

Ma solution est la suivante :

1 Créer une table temporaire

Il existe deux types de tables temporaires ORACLE : temporaires au niveau de la session. Tables et tables temporaires au niveau des transactions.

1. ON COMMIT DELETE ROWS

C'est le paramètre par défaut de la table temporaire, ce qui signifie que les données de la table temporaire ne sont valides que pendant le processus de transaction (Transaction) Le segment temporaire de la table temporaire sera automatiquement supprimé Truncate (TRUNCATE), mais la structure et les métadonnées de la table temporaire sont toujours stockées dans le dictionnaire de données de l'utilisateur. Si la table temporaire a rempli sa mission, il est préférable de supprimer la table temporaire, sinon la base de données conservera beaucoup de structure de table et de métadonnées de la table temporaire.

2. ON COMMIT PRESERVE ROWS

Cela signifie que le contenu de la table temporaire peut exister à travers les transactions. Cependant, à la fin de la session, le segment temporaire de la table temporaire sera supprimé à la fin de la session, et le segment temporaire de la table temporaire sera supprimé. données dans la table temporaire Naturellement, elles ont été supprimées. Mais la structure et les métadonnées de la table temporaire sont également stockées dans le dictionnaire de données de l'utilisateur. Si la table temporaire a rempli sa mission, il est préférable de supprimer la table temporaire, sinon la base de données conservera beaucoup de structure de table et de métadonnées de la table temporaire.

create global temporary table test_table 
(id varchar2(50), name varchar2(10)) 
on commit preserve rows; --创建临时表(当前会话生效)

--添加数据
insert into test_table VALUES('ID001', 'xgg');
insert into test_table VALUES('ID002', 'xgg2');

select * from test_table; --查询数据

TRUNCATE TABLE test_table; --清空临时表数据
DROP TABLE test_table; --删除临时表

Après avoir créé la table temporaire, vous pouvez utiliser des sous-requêtes dans l'instruction in, afin qu'il n'y ait pas plus de 1 000 rapports d'erreurs

select * from table_name where id in(select id from test_table);

Deuxièmement, utilisez in() ou in()

Officiellement dit : Une virgule - la liste délimitée d'expressions ne peut pas contenir plus de 1000 expressions. (liste délimitée d'ensembles d'expressions), c'est-à-dire des tuples, 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 identifiant utilisateur de la table utilisateur, nous pouvons écrire :

select * from user u where (1, u.id) in ((1, 'id001'),(1,'id002'),(1,'id003'))
L'instruction ci-dessus est en fait équivalente à :

select * from user u where (1=1 and u.id='id001') or (1=1 and u.id='id002') or (1=1 and u.id='id003')

La plupart de nos projets utiliseront des frameworks ORM tels que MyBatis. Nous pouvons utiliser le foreach de MyBatis. Il a été initialement écrit comme ceci :

where u.id in
<foreach collection="userIds" item="item" separator="," open="(" close=")" index="">
	#{item}
</foreach>
.

Maintenant, il est remplacé par :

where (1, u.id) in
<foreach collection="userIds" item="item" separator="," open="(" close=")" index="">
	(1, #{item})
</foreach>

Tutoriel recommandé : "

Tutoriel vidéo Oracle

"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer