Was ist der richtige Weg, um alle (möglicherweise impliziten) Ergebnisse einer Oracle-Abfrage mit JDBC abzurufen?

9

Seit Oracle 12c können wir implizite Cursor von Clients abrufen. Zum Beispiel ist es möglich, den folgenden anonymen Block PL / SQL in SQL Developer

auszuführen %Vor%

Um das folgende Ergebnis zu erhalten:

%Vor%

Dies funktioniert fast wie ein MySQL- oder SQL Server-Batch ( wie in diesem Artikel gezeigt ), so denke ich, dass wir in der Lage sein sollten, den folgenden Code auszuführen:

%Vor%

Was zu einem Fehler bei der ojdbc6 Version 12.1.0.1.0 führt:

  

wahr   java.sql.SQLException: Keine Ergebnismenge verfügbar   bei oracle.jdbc.driver.OracleStatement.getResultSet (OracleStatement.java:3369)
  bei oracle.jdbc.driver.OracleStatementWrapper.getResultSet (OracleStatementWrapper.java:388)
  bei Oracle.main (Oracle.java:46)

Dies scheint gegen die Statement.execute() Methode, deren Javadoc angibt:

  

Rückgabe:
  Wahr, wenn das erste Ergebnis ein ResultSet-Objekt ist; false, wenn es sich um eine Aktualisierungsanzahl handelt oder wenn keine Ergebnisse vorhanden sind

Also, sobald Statement.execute() ergibt true , Statement.getResultSet() sollte meiner Meinung nach eine Ergebnismenge zurückgeben. Ein Workaround wäre:

%Vor%

Das Ergebnis ist jetzt:

  

wahr   Ergebnis holen 0
  wahre
  Abrufen des Ergebnisses 1
  false

Aber das scheint falsche API-Nutzung zu sein. Nach meinem Verständnis der JDBC-Spezifikation würde diese "verbesserte" Schleife nun die erste Ergebnismenge überspringen.

Zu allem Überfluss verhalten sich vorbereitete Anweisungen anders. Der folgende Code:

%Vor%

Ruft keine Ergebnismengen ab, sondern wird einfach beendet:

  

falsch

Es funktioniert wieder so:

%Vor%
  

wahr   Ergebnis holen 0
  wahre
  Abrufen des Ergebnisses 1
  false

Meine Fragen (endlich)

Angenommen, ich schreibe generischen JDBC-Client-Code, der nicht weiß, was die SQL-Zeichenfolge enthält (es könnte sich um eine normale Abfrage handeln). Ich möchte alle Ergebnismengen abrufen, die ich möglicherweise bekommen kann.

  • Verletzt ojdbc die JDBC-Spezifikationen hier?
  • Was ist der richtige Weg, um alle Ergebnismengen von ojdbc zu holen, wenn die SQL-Zeichenfolge unbekannt ist?

Um es klar zu sagen, die oben genannten Problemumgehungen sind für gewöhnliche Abfragen wie SELECT 1 FROM dual falsch.

    
Lukas Eder 07.02.2017, 13:55
quelle

1 Antwort

0

Vorläufig (obwohl dies ein Fehler in ojdbc sein kann oder nicht), habe ich diese fiese Lösung gefunden, um alle Anwendungen der JDBC-API abzudecken (ohne zu wissen, was die SQL-Zeichenfolge erzeugt):

%Vor%     
Lukas Eder 08.02.2017, 12:14
quelle

Tags und Links