1

我一直在尝试在 MySQL Workbanch 中创建的调用过程“proc”:

create database test_database;
use test_database;

delimiter &&
create procedure proc(inout param INT UNSIGNED)
begin
    set param = 2*param;
end&&

使用此应用程序:

package test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

public class Test {

public static void main(String[] args) {
    try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1", "root", "root");
        connection.createStatement().execute("USE test_database");
        CallableStatement callableStatement = connection.prepareCall("{call proc(?)}");
        callableStatement.setInt(1, 5);
        callableStatement.registerOutParameter(1, java.sql.Types.INTEGER);
        ResultSet result = callableStatement.executeQuery();
        if (result.first()) {
            System.out.println(result.getInt(1));
        }            
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}}

但我总是得到这个错误:

java.sql.SQLException: Parameter number 1 is not an OUT parameter
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1094)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:997)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:983)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:928)
at com.mysql.jdbc.CallableStatement.checkIsOutputParam(CallableStatement.java:695)
at com.mysql.jdbc.CallableStatement.registerOutParameter(CallableStatement.java:2016)
at test.Test.main(Test.java:16)

几个小时以来,我一直试图找出问题所在,但没有成功。我看到了很多问题,但是: 这是没用的,因为在函数中不能是事务

这是没用的,因为当我使用命名参数 NullPointerEx 时被抛出(为什么??)

这是没用的,因为存在过程,并且当我仅使用 IN 参数时不会抛出任何异常,但使用 INOUT 或 OUT 会抛出提到的异常

这是没用的,因为我看不到任何明显的错误

这是没用的,因为更新 JDBC 连接器没有帮助

所以我的问题很简单:知道有什么问题吗?

4

1 回答 1

0

我会尝试两件事:

  1. 使用"jdbc:mysql://127.0.0.1/test_database"连接字符串,并删除调用execute("USE test_database")
  2. 交换setIntregisterOutParameter线路。

一般来说,执行USE test_database应该没问题,但MySQL 文档明确警告再次使用它:

在 JDBC 应用程序中始终使用Connection.setCatalog()方法来指定所需的数据库,而不是USE database语句。

尽管上下文略有不同,但似乎相同的建议也适用于您的情况。

于 2014-08-22T01:19:38.890 回答