2017-03-24 1 views
0

Ich versuche eine gespeicherte Prozedur auszuführen, die ein resultSet mit oracle jdbc zurückgibt. Das Verfahren ist wie folgt.Festlegen des out-Parameters in der aufrufbaren Anweisung

create or replace procedure display_players (rset OUT sys_refcursor) 
as 
Begin 
open rset for select * from player_data; 
End; 
/

Der Java-Code ist wie folgt

try { 
sql = "{call display_players()}"; 
call = conn.prepareCall(sql); 
call.execute(); 
rs = call.getResultSet(); 

while(rs.next()){ 
    System.out.println(rs.getString("name") + " : " + rs.getString("club")); 
} 

Ich versuchte, die out-Parameter als

call = conn.prepareCall("{call display_players(?)}"); 
call.registerOutParameter(1, OracleTypes.CURSOR); 

Aber die vermöge Arbeit zu registrieren, noch wird der aktuelle Code arbeiten, wie ich eine Null erhalten Zeigerausnahme, was bedeutet, dass die Ergebnismenge nicht zurückgegeben wird. Wie erreiche ich das?

+0

können Sie Fehlercode schreiben. –

+0

Ausnahme im Thread "main" java.lang.NullPointerException \t bei tester.main (tester.java:49) – codepoetly

+0

posten Sie bitte Ihren vollständigen Fehlercode. –

Antwort

1

Ich denke, Sie haben nicht ganz herausgefunden, wie Sie die Ergebnismenge von einem OUT Parameter von einem Aufruf der gespeicherten Prozedur erhalten.

Zunächst müssen Sie den OUT Parameter registrieren, wie in Ihrem zweiten Codebeispiel:

call = conn.prepareCall("{call display_players(?)}"); 
call.registerOutParameter(1, OracleTypes.CURSOR); 

Allerdings, wenn Sie die Anweisung ausgeführt haben, ist es nicht richtig call.getResultSet() um das Ergebnis zu erhalten setzen in der OUT Parameter. Angenommen, Sie rufen eine gespeicherte Prozedur mit zwei OUT Parametern auf, die Cursor zurückgeben. Welcher sollte call.getResultSet() zurückgeben?

Der Trick ist call.getObject(...) zu verwenden, um den Wert des Parameters von call als Object zu bekommen und diese dann zu einem ResultSet gegossen. Mit anderen Worten, ersetzen Sie die Zeile

rs = call.getResultSet(); 

mit

rs = (ResultSet)call.getObject(1); 
+0

Hallo Lukas. Das scheint zu funktionieren. Problem gelöst. – codepoetly

Verwandte Themen