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:
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
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.
Um es klar zu sagen, die oben genannten Problemumgehungen sind für gewöhnliche Abfragen wie SELECT 1 FROM dual
falsch.
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%