Ich brauche eine einfache Abfrage mit Oracle, Java und Mybatis schreiben:In-Memory-Datenbank unterstützt proprietäre INSERT alle Oracle-Syntax
select * from FOO foo where foo.id IN (ids)
Nun ist ids
eine große Sammlung von Zeichenketten, etwa 7000. Leider Orakel hat 1000 Elemente Grenze für IN-Klausel.
Um dies zu überwinden, kann ich entweder:
- verketten die Abfrage dynamisch, so wird es: Ich bin nicht sicher, ob es überhaupt funktioniert und ich bezweifle es wirklich gut
- Verwendung vorübergehend führt Tabelle und schreiben Sie die Abfrage um:
select * from FOO foo join SOME_TEMPORARY_ID tempids on foo.id = tempids.id
.
Ich habe mich entschieden, für 2 Option zu gehen. Bevor ich die Abfrage ausführe, muss ich irgendwie eine effiziente Batch-Einfügung zu Oracle durchführen. Leider hat Oracle proprietäre Syntax Batch-Einsätze zu tun:
INSERT ALL
INTO some_table VALUES ('foo')
INTO some_table VALUES ('foo1')
INTO some_table VALUES ('foo2')
....
INTO some_table VALUES ('foo12345')
SELECT * FROM DUAL
Nun, ich habe nicht erwähnt, aber ich möchte einen Integrationstest für das schreiben, idealerweise H2 verwenden oder andere inmemory Datenbank. Natürlich unterstützt H2 diese Syntax nicht. Weder macht HSQLDB.
Kennen Sie eine In-Memory-Datenbank, die proprietäre Oracle-Syntax vollständig unterstützt? Oder zumindest diese spezielle INSERT ALL-Klausel?
Was ist mit der Leistung? Was sollte leistungsfähiger sein - mit temporären Tabellen oder 7k Elemente IN-Klausel? – slnowak
@slnowak Sie bemerken, dass IDs Sammlung ist, warum einfach smt wie diese 'wählen * aus FOO foo where foo.id IN (* aus Tabelle (Sammlung IDs))'. Wo IDs ist geschachtelte Tabelle. Sie können IDs darin ziehen und dann Abfrage ausführen. Über Performance Ich denke, geschachtelte Tabelle ist die beste, temporary die zweite und in-Condition die dritte. –
Können Sie die Syntax und das Feature selbst ein wenig mehr erklären? Ich wusste nicht, dass es existiert. Entspricht es mehr oder weniger dem Erstellen einer temporären Tabelle? Und leidet es nicht unter diesem 1k IN-Klausellimit? – slnowak