当前位置: 首页 > 知识库问答 >
问题:

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

拓拔高畅
2023-03-14

我试图从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)显示在这里

我的代码输出显示在这里

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

参数1不是输出参数

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

为什么我会有例外?


共有2个答案

卞浩漫
2023-03-14

getBalance1()是一个MySQL函数,而不是一个PROCEDURE,所以我不认为使用JDBCCallable语句是适用的。

甚至在你正在使用的MySQL控制台测试中

select getBalance1(103)

因此,您只需在Java代码中使用准备语句执行相同的操作:

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

(应该注意的是,因为余额显然指的是钱,REAL不是列类型的好选择;这里有详细信息。)

贺高飞
2023-03-14

我想我得到了SQLExc0019,因为我使用了jdk1.8.xx,其中调用存储函数的语法是不同的。通过替换语句解决了这个问题

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

在代码中使用

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

在prepareCall()方法中将函数作为参数调用的语法如下所示。

 类似资料:
  • 问题内容: 我正在使用Postgresql 8.3,并具有以下简单功能,该功能会将a返回 给客户端 现在,我可以使用以下SQL命令来调用此函数并操纵返回的游标,但是游标名称是由PostgreSQL自动生成的 此外,如38.7.3.5中所述,显式地将游标名称声明为函数的输入参数 。返回游标。我可以声明自己的游标名称并使用此游标名称来操纵返回的游标,而不是为我自动生成的Postgresql吗?如果不是

  • 本文向大家介绍Python 函数返回值的示例代码,包括了Python 函数返回值的示例代码的使用技巧和注意事项,需要的朋友参考一下 0x 00 返回值简介 回顾下,上一节简单介绍了函数及其各种参数,其中也有简单介绍 print 和 return 的区别,print 仅仅是打印在控制台,而 return 则是将 return 后面的部分作为返回值作为函数的输出,可以用变量接走,继续使用该返回值做其它

  • 本文向大家介绍使用C#代码获取存储过程返回值,包括了使用C#代码获取存储过程返回值的使用技巧和注意事项,需要的朋友参考一下 废话不多说,直接给大家贴C#代码了。 ps:在C#中调用存储过程中的两种返回值

  • 问题内容: 我试图使用Hibernate从Java调用Oracle9i DB中的遗留存储函数。该函数的声明如下: 经过几次失败的尝试和广泛的谷歌搜索之后,我在Hibernate论坛上发现了该线程,该线程建议了如下映射: 我执行它的代码是 结果日志是 任何提示我在做什么错?还是调用此存储函数的更好方法? 更新: 尝试@axtavt的建议时,出现以下错误: 该函数确实进行了大量的插入/更新,因此我想运

  • 本文向大家介绍Sql Server 存储过程调用存储过程接收输出参数返回值,包括了Sql Server 存储过程调用存储过程接收输出参数返回值的使用技巧和注意事项,需要的朋友参考一下 创建存储过程: 接收输出参数: 2,带返回值 创建存储过程: 接收返回值: 以上所述是小编给大家介绍的Sql Server 存储过程调用存储过程接收输出参数返回值,希望对大家有所帮助,如果大家有任何疑问请给我留言,小

  • 问题内容: 我正在调用一个Sybase存储过程,该存储过程通过JDBC返回多个结果集。我需要获取一个具有名为“ Result”的列的特定结果集,这是我的代码: 这里发生的是返回很多空结果集,直到达到目标结果集为止。我不能用作循环条件,因为它对空结果集返回false。 我放置了一个固定数字以结束循环,条件是没有返回所需的结果集,以防止其进入无限循环。它工作正常,但我认为这是不对的。 我认为从Syba