JDBC 代码调用一个值 returns 的存储函数时出错
Error in JDBC code calling a stored function which returns a value
我正在尝试从 JDBC 代码中打印 MySQL 存储的 函数 的返回值,如下所示(我正在使用 MySQL 服务器 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)
我的代码输出显示在这里
我正在从 SQL 命令中获取输出,但在 JDBC 中,我正在获取并且 SQLException
表示
parameter 1 is not an output parameter
我知道参数 1 在 jdbc 代码中用作函数返回值的占位符。在 prepareCall
中,我也尝试了语法 - {?:= call getBalance1(?)}
,但即使那样也得到了相同的异常。
为什么我得到异常?
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);
(需要注意的是,由于 "balance" 显然是指 "money",因此 REAL
不是列类型的好选择;详情 here。)
我想我收到 SQLException 是因为我使用的是 jdk1.8.xx,其中调用存储函数的语法不同。问题已通过替换 statement
解决
CallableStatement cs = conn.prepareCall("{call ?:=getBalance1(?)}");
在代码中加上
CallableStatement cs = conn.prepareCall("{? = call getBalance1(?)}");
调用prepareCall()方法中的函数作为参数的语法是here.
我正在尝试从 JDBC 代码中打印 MySQL 存储的 函数 的返回值,如下所示(我正在使用 MySQL 服务器 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)
我的代码输出显示在这里
我正在从 SQL 命令中获取输出,但在 JDBC 中,我正在获取并且 SQLException
表示
parameter 1 is not an output parameter
我知道参数 1 在 jdbc 代码中用作函数返回值的占位符。在 prepareCall
中,我也尝试了语法 - {?:= call getBalance1(?)}
,但即使那样也得到了相同的异常。
为什么我得到异常?
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);
(需要注意的是,由于 "balance" 显然是指 "money",因此 REAL
不是列类型的好选择;详情 here。)
我想我收到 SQLException 是因为我使用的是 jdk1.8.xx,其中调用存储函数的语法不同。问题已通过替换 statement
解决CallableStatement cs = conn.prepareCall("{call ?:=getBalance1(?)}");
在代码中加上
CallableStatement cs = conn.prepareCall("{? = call getBalance1(?)}");
调用prepareCall()方法中的函数作为参数的语法是here.