2016-07-31 2 views
2

Я пытаюсь напечатать возвращаемое значение MySQL, хранящее , функцию из кода JDBC, который выглядит следующим образом (я использую MySQL Server 5.7.13):Ошибка в коде JDBC, вызывающем хранимую функцию, которая возвращает значение

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); 
    } 
} 

}

хранимая функция getBalance1(acno) показана здесь

getBalance(acno numeric)

мой выходной код показан здесь

jdbc output

Я получаю вывод команды SQL, но в JDBC Я получаю и SQLException о том, что

параметр 1 не является выходным параметром

Я знаю, что параметр 1 использовался в качестве заполнителя возвращаемого значения из функции в коде jdbc. В prepareCall я также пробовал синтаксис - {?:= call getBalance1(?)}, но даже тогда получил то же Исключение.

Почему я получаю исключение?

+0

Быстрое предположение: cs.getString ("1"); –

ответ

2

Я думаю, что я как получение SQLException, потому что я использую jdk1.8.xx, в котором синтаксис вызова хранимой функции отличается. Проблема была решена путем замены о

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

в коде с

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

Синтаксис вызова функции в методе prepareCall() в качестве параметра here.

+0

Я не думаю, что синтаксис каким-либо образом изменился в Java 8. У вас просто была опечатка (дополнительное двоеточие + неуместное ключевое слово 'call') в вашем исходном заявлении. –

1

getBalance1() является MySQL FUNCTION, не PROCEDURE, так что я бы не стал ожидать, используя JDBC CallableStatement применимой.

Даже в тестовой консоли MySQL вы используете

select getBalance1(103) 

так что вам просто нужно сделать то же самое в коде Java с помощью PreparedStatement:

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

(Следует отметить, что поскольку «баланс», по-видимому, относится к «деньгам», REAL не является хорошим выбором для типа столбца; подробности here.)

+0

Я получаю то, что вы здесь написали. Но тогда будет использоваться интерфейс CallableStatement, если я вместо этого использовал PreparedStatement? Я пытаюсь получить результаты с помощью CallableStatement, так как я могу получить десятки проблем, с которыми вам придется столкнуться. – user404

+1

«CallableStatement» - это способ запуска хранимых процедур JDBC, которые создаются в MySQL с помощью 'CREATE PROCEDURE' и вызывается в MySQL с помощью' CALL procedureurename'. Вы использовали 'CREATE FUNCTION' для создания пользовательской функции, которая обычно вызывается путем включения ее в выражение, например., как часть инструкции SELECT. –

+0

На самом деле вы также можете вызвать SQL 'FUNCTION' с 'CallableStatement'. Синтаксисом JDBC для этого является 'myConnection.prepareCall (" {? = Вызов my_function (?)} ");', Как это показано в ответе, создаваемом OP. –