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

私は2つのことを試します:

  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 に答える