JDBC代码调用存储函数时返回值的错误

时间:2016-07-31 12:56:57

标签: java mysql jdbc stored-functions callable-statement

我正在尝试从JDBC代码打印MySQL存储的函数的返回值,如下所示(我正在使用MySQL Server 5.7.13):

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(?)},但即便如此,也会遇到相同的异常。

为什么我得到例外?

2 个答案:

答案 0 :(得分:2)

我认为我得到了SQLException,因为我使用的是jdk1.8.xx,其中调用存储函数的语法不同。通过替换语句

解决了这个问题
CallableStatement cs = conn.prepareCall("{call ?:=getBalance1(?)}");

代码中的

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

在prepareCall()方法中调用函数作为参数的语法是here

答案 1 :(得分:1)

getBalance1()是MySQL FUNCTION,而不是PROCEDURE,因此我不希望使用JDBC CallableStatement

即使在MySQL控制台测试中,您正在使用

select getBalance1(103)

所以你只需要使用PreparedStatement

在Java代码中做同样的事情
PreparedStatement ps = conn.prepareStatement("select getBalance1(?)");
ps.setInt(1) = 103;
ResultSet rs = ps.executeQuery();
rs.next();
Double bal = rs.getDouble(1);

(应该注意,由于“余额”显然是指“钱”,REAL不是列类型的好选择;详情here。)