JDBC + Oracle und beschränkte Ergebnissmenge

Hallo,
ich möchte über JDBC/Java an eine Oracle 9.x DB eine Abfrage
formulieren, die mir z.B. nur die 100.ste - 200.ste Ergebnismenge
zurückliefert.
Wie machen ich das am besten?
Danke

Hi -

ich möchte über JDBC/Java an eine Oracle 9.x DB eine Abfrage
formulieren, die mir z.B. nur die 100.ste - 200.ste
Ergebnismenge zurückliefert.
Wie machen ich das am besten?

Du brauchst dazu 2 Limiter: Den Anfangsdatensatz und die Anzahl der Datensätze, die du haben möchtest.


Anfangsdatensatz

Du hast z.B. 10000 Datensätze - mit z.B. einer PK ID. Dann bekommst du mal alle Datensätze ab dem gewünschten Anfangsdatensatz (zB. ID=123) so:

select a,b,c from table_name where id>=123 order by id

So bekommst du aber in unserem Beispiel 10000-123 Datensätze (Wenn die ID durchgehend vergeben ist). Dh. du mußt noch nach oben hin limitieren:


Anzahl der zurückgelieferten Datensätze limitieren:

JDBC bietet dir dazu eine Möglichkeit, da das ja in fast jeder Datenbank anders gelößt ist. MySQL bietet dir da zB. das SQL Statement LIMIT an. In Oracle, MsSQL, etc. geht es wieder anders. Der Datenbankhersteller liefert ja den JDBC-Treiber und implementiert die JDBC-Limit Methode und lößt das dann im Idealfall so wie er es für optimal hält - Dh. es ist meistens schlau und portabel, dass auch über JDBC zu machen:

Statement statement = …
ResultSet resultSet = null;
statement.setMaxRows(100); // Ich möchte max. 100 Zeilen bekommen
resultSet = statement.executeQuery(„select a,b,c from table_name where id>=123 order by id“);
// Irgendwas mit den 100 Ergebnissen machen
resultSet.close();
statement.close();

So sollte das hinhauen.

lg,

J.P.Jarolim

Auch hallo.

An sich ist das mehr ein Oracle-SQL Problem und von daher im Brett „SQL /Datenbankprogrammierung“ besser aufgehoben. Aber trotzdem: http://www.ianywhere.com/developer/product_manuals/s…
http://www.tutorials.de/showthread.php?t=2708
http://www.google.de/search?hl=de&q=sql+Zeilen+besch…
Idee: man gibt die Schnittmenge zwischen der Top 99 und der Down (?) 201 aus

HTH
mfg M.L.

ps: bin etwas langsamer gewesen als Jarolim, aber es gilt zu beachten, dass man eine Ordnung nach der ID nicht voraussetzen kann…

***Werbung***
http://www.derentwickler.de & http://www.entwickler-forum.de
http://www.datenbank-spektrum.de
http://home.t-online.de/home/t.brand/helpline/ebooks…
http://www.vde-verlag.de/data/buecher.php?action=boo…

Hi -

ps: bin etwas langsamer gewesen als Jarolim, aber es gilt zu
beachten, dass man eine Ordnung nach der ID nicht voraussetzen
kann…

War auch nur ein Beispiel - Einen sortierbaren PK hat man meistens (Wenn auch meistens nicht durchgehend). Es gilt ja Ansich nur ein Selektionskriterium zu finden, dass die gewünschten Daten zurückgibt und event. ein anderes, welches zusätzlich eine Sortierung erlaubt. Falls man zB. durch 5000 Datensätze in Batches von jeweils 100 durchgehen möchte, muß man sich dann eben die letzte Sortierungsattribut merken und im nächsten Schritt eben nur die nehmen, die entsprechend dahinterliegen.

Ist aber auch nur einer von vielen Wegen.

lg,

J.P.Jarolim

Hi - Tschuldigung, dass ich lästig bin - Aber…

An sich ist das mehr ein Oracle-SQL Problem und von daher im
Brett „SQL /Datenbankprogrammierung“ besser aufgehoben.

Ist imho beides richtig, da er ja über JDBC zugreifen möchte.

Zu deinen Links: Er hat nach einer Lösung für Oracle gefragt.

http://www.ianywhere.com/developer/product_manuals/s…

Nicht anwendbar: Gilt für SQL Anywhere - FIRST, TOP, START AT sind Elemente eines eigenen SQL Dialekts, welcher von Oracle nicht unterstützt wird.

http://www.tutorials.de/showthread.php?t=2708

Nicht anwendbar: Gilt für MySQL - LIMIT ebenfalls nur Teil eines Dialekts und nicht in Oracle unterstützt.

JDBC ist ja primär nicht nur ein nativer Datenbanktreiber, der SQL Statements an die jeweilige DB durchschleift, sondern eine Abstraktionsebene darüber. Dh. Mittels sauberer Programmierung sollte man in der Lage sein, die DB zu einem Zeitpunkt ohne große Probleme wechseln zu können.

Je mehr Elemente eines DB-eigenen SQL Dialekts mit dem standardisierten SQL92 kombiniert werden, desto abhängiger wird man vom eingesetzten DBMS (Und desto mehr Aufwand ist die Portierung).

Aber wie es immer ist - Direkt für die DB optimierte Statements laufen halt schneller :wink:

lg aus Salzburg,

J.P.Jarolim

Du könntest auch ein Scrollable ResultSet versuchen (müsste der Oracle JDBC Treiber eigentlich können hoff ich) und dann per absolute(100) navigieren und anfangen auszulesen.

Grüße
Bruno

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]