【问题标题】:Parameter number 1 is not an OUT parameter参数号 1 不是 OUT 参数
【发布时间】:2023-03-25 16:31:01
【问题描述】:

尝试使用 JDBC 执行存储过程,我似乎无法克服这个错误,

java.sql.SQLException: 参数号 1 不是 OUT 参数

public static void SP1() throws SQLException, IOException {

    try {

        stmt = conn.createStatement();
        stmt.executeUpdate("DROP PROCEDURE IF EXISTS sp1;");

        stmt.executeUpdate("CREATE PROCEDURE sp1(OUT cName VARCHAR(20))"
                + "SELECT CuratorName FROM curator "
                + "WHERE CuratorPhone = \"90394857\" INTO cName;");

        conn.commit();

        System.out.println("Sp1 created");

        CallableStatement cs3 = conn.prepareCall("{call sp1(?)}");
        cs3.registerOutParameter(1, java.sql.Types.VARCHAR);
        cs3.execute();
        String result = cs3.getString("cName");
        System.out.println("Result from sp1:" + result);

    } catch (Exception e) {

        System.out.println(e);
    }

}

【问题讨论】:

  • 存储过程是否独立运行(即在 Java 之外)?
  • 您使用的是什么 DBMS?
  • 我正在使用在本地主机上运行的 Mysql。我在 Netbeans IDE 中运行一切
  • 奇怪,我无法重现此异常。你的代码为我运行。我正在使用 MySQL 5.5.22 版、MySQL 连接器 JAR 5.1.18 版、Windows 8.1 x64、Java 1.8.0_05,如果有任何帮助的话。

标签: java sql stored-procedures jdbc parameters


【解决方案1】:

如果您的存储过程定义包含查看您共享的代码的 IN 参数,则 Call 语句应如下所示

 CallableStatement cs3 = conn.prepareCall("{call sp1(?)}");
    cs3.setString(1, java.sql.Types.VARCHAR);

参数需要设置为IN参数。

如果您的存储过程定义包含 OUT 参数,则需要修改您的调用语句。

CallableStatement cs3 = conn.prepareCall("{? = call sp1()}");
        cs3.registerOutParameter(1, java.sql.Types.VARCHAR);

无论如何,请分享您的过程定义,这样会更清楚。

【讨论】:

  • 我已经尝试了您的第二个选项,因为我有一个 out 参数。我现在收到此错误:java.lang.NullPointerException
  • cs3.setString(1, java.sql.Types.VARCHAR); 将是一个语法错误,因为您将整数分配给字符串参数。您将为它分配一个字符串值。由于这个问题是关于OUT,因此作为您答案的一部分没有意义。其次,{? = call sp1()} 转义适用于具有单个 return 值的存储过程,而不适用于 OUT 参数。
猜你喜欢
  • 2013-10-23
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
相关资源
最近更新 更多