Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC代码调用返回值的存储函数时出错_Java_Mysql_Jdbc_Stored Functions_Callable Statement - Fatal编程技术网

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

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(?)},但即使如此,还是得到了相同的异常 为什么会出

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

}

此处显示了存储的函数
getBalance1(acno)

这里显示了我的代码输出

我从SQL命令中获得输出,但在JDBC中,我得到了,
SQLException
这样说

参数1不是输出参数

我知道在jdbc代码中,参数1被用作函数返回值的占位符。在
prepareCall
中,我还尝试了语法-
{?:=callgetbalance1(?)}
,但即使如此,还是得到了相同的异常

为什么会出现异常?

getBalance1()
是一个MySQL
函数
,而不是一个
过程
,因此我不希望使用JDBC
CallableStatement
适用

即使在您使用的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调用SQL
FUNCTION
s。这个函数的JDBC语法是
myConnection.prepareCall(“{?=callmyu函数(?)}”),如OP编写的答案所示。我认为Java8中的语法没有任何变化。您只是在原始语句中输入了一个拼写错误(额外的冒号+错位的
call
关键字)。
CallableStatement cs = conn.prepareCall("{? = call getBalance1(?)}");