2016-07-31 15 views
2

Ich versuche, den zurückgegebenen Wert einer gespeicherten MySQL Funktion aus dem JDBC-Code, der wie folgt ist (ich benutze MySQL Server 5.7.13) zu drucken:Fehler im JDBC-Code Aufruf einer gespeicherten Funktion, die einen Wert

package jdbc; 

import java.sql.DriverManager; 
import java.sql.*; 
import java.util.Scanner; 


public class CallableStatementsCallingFunctions { 
    public static void main(String... syrt) 
    { 
     try 
    { 
     try 
     {     
      Class.forName("com.mysql.jdbc.Driver"); 
     } 
     catch(ClassNotFoundException e) 
     { 
      System.out.println("Error(class): "+ e); 
     } 
     try 
     { 
     Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/collablestatement","root","mysql") ; 
     CallableStatement cs = conn.prepareCall("{call ?:=getBalance1(?)}"); 
     String s = new Scanner(System.in).nextLine(); 
     cs.registerOutParameter(1,Types.INTEGER); 
     cs.setInt(2,Integer.parseInt(s));    
     cs.execute(); 
     System.out.println("Account number :" + cs.getInt(1)); 
     conn.close(); 
     } 
     catch(SQLException e) 
     { 
      System.out.println("Error(SQL) : "+e); 
     } 
    } 
    catch(Exception e) 
    { 
     System.out.println("Error(Fro outer try) : "+ e); 
    } 
} 

}

die gespeicherte Funktion getBalance1(acno) wird hier gezeigt

getBalance(acno numeric)

meine Code-Ausgabe wird hier

jdbc output

gezeigt

ich die Ausgabe von dem SQL-Befehl bekommen, aber in JDBC Ich erhalte und SQLException sagen, dass

Parameter 1 ist nicht ein Ausgabeparameter

Ich weiß, dass Parameter 1 als Platzhalter des zurückgegebenen Werts aus der Funktion in JDBC-Code verwendet wurde. In prepareCall habe ich auch versucht, die Syntax - {?:= call getBalance1(?)}, aber auch dann immer die gleiche Ausnahme.

Warum bekomme ich die Ausnahme?

+0

eine schnelle Schätzung ist cs.getString ("1"); –

Antwort

2

Ich denke, ich w wie bekomme ich die SQLException, weil ich jdk1.8.xx verwende, in dem die Syntax des Aufrufens der gespeicherten Funktion unterschiedlich ist. Das Problem wurde durch Anweisung ersetzt gelöst

CallableStatement cs = conn.prepareCall("{call ?:=getBalance1(?)}"); 

im Code mit

CallableStatement cs = conn.prepareCall("{? = call getBalance1(?)}"); 

Die Syntax der Aufruf der Funktion in der prepareCall() Methode als Parameter here ist.

+0

Ich glaube nicht, dass sich die Syntax in Java 8 in irgendeiner Weise geändert hat. Sie hatten einfach einen Tippfehler (extra Doppelpunkt + fehlplatziertes Call-Schlüsselwort) in Ihrer ursprünglichen Anweisung. –

1

getBalance1() ist ein MySQL-FUNCTION, kein PROCEDURE, so würde ich nicht erwarten, dass ein JDBC CallableStatement Verwendung anwendbar.

Auch in Ihrer MySQL-Konsole testen Sie verwenden

select getBalance1(103) 

so einfach Sie tun müssen, die gleiche Sache in Ihrem Java-Code unter Verwendung eines PreparedStatement: sollte

PreparedStatement ps = conn.prepareStatement("select getBalance1(?)"); 
ps.setInt(1) = 103; 
ResultSet rs = ps.executeQuery(); 
rs.next(); 
Double bal = rs.getDouble(1); 

(Es sei bemerkt, dass seit "balance" bezieht sich anscheinend auf "geld", ist keine gute wahl für den spalten typ; details here.)

+0

Ich bekomme, was Sie hier geschrieben haben.Aber dann, was würde die CallableStatement-Schnittstelle verwendet werden, wenn ich PreparedStatement statt ?? Ich versuche, die Ergebnisse mit CallableStatement zu bekommen, da ich dann dutzende Probleme bekommen kann. – user404

+1

Das 'CallableStatement' ist die Art und Weise, wie JDBC Stored Procedures ausführt, die in MySQL mit' CREATE PROCEDURE' erstellt und in MySQL mit 'CALL proceduryname' aufgerufen werden. Sie haben 'CREATE FUNCTION' verwendet, um eine benutzerdefinierte Funktion zu erzeugen, die normalerweise aufgerufen wird, indem sie in einen Ausdruck, z.als Teil einer SELECT-Anweisung. –

+0

Eigentlich können Sie auch SQL 'FUNCTION' mit 'CallableStatement' aufrufen. Die JDBC-Syntax dafür ist 'myConnection.prepareCall (" {? = My_function (?)} ");', Wie in der vom OP verfassten Antwort veranschaulicht. –