Heim > Datenbank > Oracle > Beispiel zur Lösung des Problems, dass Oracle in Anweisungen nicht mehr als 1000 verwenden kann

Beispiel zur Lösung des Problems, dass Oracle in Anweisungen nicht mehr als 1000 verwenden kann

WBOY
Freigeben: 2022-06-13 18:11:14
nach vorne
2440 Leute haben es durchsucht

Dieser Artikel vermittelt Ihnen relevantes Wissen über Oracle und stellt vor allem die Verwendung der in-Methode zum Abfragen von Datensätzen vor. Wenn die Anzahl der Parameter nach in 1000 überschreitet, tritt ein Fehler auf und JDBC löst „java.sql.SQLException“ aus. ORA-01795: Ausnahme: Die maximale Anzahl von Ausdrücken in der Liste beträgt 1000. Werfen wir einen Blick darauf, wie wir das Problem lösen können. Ich hoffe, es wird für alle hilfreich sein.

Beispiel zur Lösung des Problems, dass Oracle in Anweisungen nicht mehr als 1000 verwenden kann

Empfohlenes Tutorial: „Oracle Video Tutorial

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

Meine Lösung ist:

1. Erstellen Sie eine temporäre Tabelle

Es gibt zwei Arten von temporären ORACLE-Tabellen: temporäre Tabellen auf Sitzungsebene Tabellen und temporäre Tabellen auf Transaktionsebene.

1. ON COMMIT DELETE ROWS

Es ist der Standardparameter der temporären Tabelle, was bedeutet, dass die Daten in der temporären Tabelle nur während des Transaktionsprozesses (COMMIT) gültig sind Das temporäre Segment der temporären Tabelle wird automatisch gelöscht (TRUNCATE), die Struktur und Metadaten der temporären Tabelle werden jedoch weiterhin im Datenwörterbuch des Benutzers gespeichert. Wenn die temporäre Tabelle ihre Aufgabe erfüllt hat, ist es am besten, die temporäre Tabelle zu löschen, da die Datenbank sonst viele Tabellenstrukturen und Metadaten der temporären Tabelle behält.

2. ON COMMIT PRESERVE ROWS

Das bedeutet, dass der Inhalt der temporären Tabelle transaktionsübergreifend vorhanden sein kann. Wenn die Sitzung jedoch endet, wird das temporäre Segment der temporären Tabelle mit dem Ende der Sitzung verworfen Daten in der temporären Tabelle wurden natürlich verworfen. Aber auch die Struktur und Metadaten der temporären Tabelle werden im Datenwörterbuch des Benutzers gespeichert. Wenn die temporäre Tabelle ihre Aufgabe erfüllt hat, ist es am besten, die temporäre Tabelle zu löschen, da die Datenbank sonst viele Tabellenstrukturen und Metadaten der temporären Tabelle behält.

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; --删除临时表
Nach dem Login kopieren

Nach dem Erstellen der temporären Tabelle können Sie Unterabfragen in der in-Anweisung verwenden, sodass es nicht mehr als 1.000 Fehlerberichte gibt

select * from table_name where id in(select id from test_table);
Nach dem Login kopieren

Zweitens verwenden Sie in() oder in()

Offiziell gesagt: Ein Komma - Eine durch Trennzeichen getrennte Liste von Ausdrücken kann nicht mehr als 1000 Ausdrücke enthalten, also Tupel. Die Syntax lautet wie folgt:

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

Zum Beispiel, wenn wir Benutzerinformationen nach Benutzer-ID abfragen möchten In der Benutzertabelle können wir schreiben:

select * from user u where (1, u.id) in ((1, 'id001'),(1,'id002'),(1,'id003'))
Nach dem Login kopieren
Die obige Aussage entspricht tatsächlich:

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')
Nach dem Login kopieren

Die meisten unserer Projekte verwenden ORM-Frameworks wie MyBatis. Wir können MyBatis' foreach verwenden. Es wurde ursprünglich so geschrieben:

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

Jetzt wird es geändert in:

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

Empfohlenes Tutorial: „

Oracle Video Tutorial

Das obige ist der detaillierte Inhalt vonBeispiel zur Lösung des Problems, dass Oracle in Anweisungen nicht mehr als 1000 verwenden kann. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage