Oracle und die Nur-Weiterleiten-Ergebnismenge

Schon mancher deutschsprachige Entwickler, der zum Beispiel über JDBC auf eine Oracle-Datenbank zugegriffen hat, hat gelegentlich folgende Fehlermeldung bekommen (eine Web-Suche* beweist es):

ORA-17075: Ungültiger Vorgang bei Nur-Weiterleiten-Ergebnismenge

In den meisten Fällen bringt man diese Meldung rasch damit in Verbindung, dass man mit einer Ergebnismenge (Java: java.sql.ResultSet) arbeitet. Hinter ihr steckt in der Regel ein so genannter SQL-Cursor, der es erlaubt, durch die Ergebnisse einer Datenbankabfrage (select) zu iterieren. Aber wo kommt hier eine Weiterleitung ins Spiel?

Das Rätsel löst sich, wenn man irgendwo die englische Form dieser Fehlermeldung findet und versteht: Sie lautet nämlich

ORA-17075: Invalid operation for forward only resultset

Das heißt nun ganz einfach, dass die ResultSet-Datenstruktur (und mithin der Cursor dahinter) nur vorwärts positioniert werden kann. Ein Zurücksetzen etwa mit der Methode ResultSet.first() ist nicht möglich und führt zu dem beobachteten Fehler.

Das englische forward heißt also hier einmal nicht "weiterleiten", sondern schlicht und einfach "vorwärts". Es ist begrüßenswert, dass Oracle seine Fehlermeldungen internationalisiert, aber diese Übersetzung könnte von Babelfish stammen.

Wie kann man nun dieses Problem lösen? Hinweise gibt es zum Beispiel in "The JDBC Tutorial" im Sun Developer Network. Dort heißt es, dass man beim Erzeugen eines Statement-Objekts zu einer Datenbank-Verbindung (Java: Connection.createStatement) für den Parameter resultSetType einen der Werte ResultSet.TYPE_SCROLL_INSENSITIVE oder ResultSet.TYPE_SCROLL_SENSITIVE angeben muss, je nachdem, ob die Ergebnismenge parallele Änderungen anderer widerspiegeln soll oder nicht. In der parameterlosen Version der Methode wird der Wert TYPE_FORWARD_ONLY verwendet, und das oben beschriebene Problem kann auftreten. Näheres beschreibt das JavaDoc zur Schnittstelle ResultSet.

Reinhard Fößmeier


* Am 2012-05-18 lieferte eine Google-Suche nach "Nur-Weiterleiten-Ergebnismenge" immerhin 137 Treffer.