Java JDBC代码调用返回值的存储函数时出错
我试图打印JDBC代码中MySQL存储函数的返回值,如下所示(我使用的是MySQL Server 5.7.13): } 此处显示了存储的函数Java JDBC代码调用返回值的存储函数时出错,java,mysql,jdbc,stored-functions,callable-statement,Java,Mysql,Jdbc,Stored Functions,Callable Statement,我试图打印JDBC代码中MySQL存储函数的返回值,如下所示(我使用的是MySQL Server 5.7.13): } 此处显示了存储的函数getBalance1(acno) 这里显示了我的代码输出 我从SQL命令中获得输出,但在JDBC中,我得到了,SQLException这样说 参数1不是输出参数 我知道在jdbc代码中,参数1被用作函数返回值的占位符。在prepareCall中,我还尝试了语法-{?:=callgetbalance1(?)},但即使如此,还是得到了相同的异常 为什么会出
getBalance1(acno)
这里显示了我的代码输出
我从SQL命令中获得输出,但在JDBC中,我得到了,SQLException
这样说
参数1不是输出参数
我知道在jdbc代码中,参数1被用作函数返回值的占位符。在prepareCall
中,我还尝试了语法-{?:=callgetbalance1(?)}
,但即使如此,还是得到了相同的异常
为什么会出现异常?getBalance1()
是一个MySQL函数
,而不是一个过程
,因此我不希望使用JDBCCallableStatement
适用
即使在您使用的MySQL控制台测试中
选择getBalance1(103)
因此,您只需在Java代码中使用PreparedStatement
执行相同的操作:
PreparedStatement ps=conn.prepareStatement(“选择getBalance1(?));
ps.setInt(1)=103;
结果集rs=ps.executeQuery();
rs.next();
双倍余额=rs.getDouble(1);
(应该注意的是,由于“balance”显然是指“money”,所以对于列类型;details,
REAL
不是一个好的选择。)我想我得到了SQLException,因为我使用的是jdk1.8.xx,其中调用存储函数的语法不同。通过替换语句解决了问题
CallableStatement cs = conn.prepareCall("{call ?:=getBalance1(?)}");
在代码中使用
CallableStatement cs = conn.prepareCall("{? = call getBalance1(?)}");
在prepareCall()方法中作为参数调用函数的语法是。快速猜测是cs.getString(“1”);我得到了你在这里写的东西。但是如果我改用PreparedStatement,CallableStatement接口将用于什么呢??我正在尝试使用CallableStatement获得结果,因为我可能会遇到几十个问题。
CallableStatement
是JDBC运行存储过程的方式,它在MySQL中使用CREATE PROCEDURE
创建,在MySQL中使用CALL procedurename
调用。您已经使用CREATE FUNCTION
创建了一个用户定义的函数,该函数通常通过将其包含在表达式中来调用,例如,作为SELECT
语句的一部分。实际上,您也可以使用CallableStatement
s调用SQLFUNCTION
s。这个函数的JDBC语法是myConnection.prepareCall(“{?=callmyu函数(?)}”)代码>,如OP编写的答案所示。我认为Java8中的语法没有任何变化。您只是在原始语句中输入了一个拼写错误(额外的冒号+错位的call
关键字)。
CallableStatement cs = conn.prepareCall("{? = call getBalance1(?)}");