2

私はこのコードスニペットを持っています:

final String adatbazisURL = "jdbc:mysql://localhost:3306";
Connection kapcsolat = null;
Statement utasitas = null;

try {
    Class.forName("com.mysql.jdbc.Driver");
    kapcsolat = DriverManager.getConnection(adatbazisURL, felhNev,
            jelszo);
    utasitas = kapcsolat.createStatement();
    String sql = "USE"+Azonositok.getAdatbazisNev()+";";
    utasitas.executeUpdate(sql);
} catch (Exception e) {
    e.printStackTrace();
    throw new RuntimeException(e);
}

String sql = "DROP PROCEDURE IF EXISTS proba ;";
utasitas.executeUpdate(sql);

sql = "CREATE PROCEDURE proba (" + "IN number1 INTEGER, "
        + "OUT number2 INTEGER) " + "BEGIN " +

        "SET number2 = number1;" + "END";
utasitas.execute(sql);
CallableStatement callableStatement = null;

String callString = "{CALL proba(?,?)}";

callableStatement = kapcsolat.prepareCall(callString);
callableStatement.setInt(1, 5);
callableStatement.registerOutParameter(2, java.sql.Types.INTEGER);

callableStatement.execute();

int number = callableStatement.getInt(2);

callableStatement.close();

このコードを実行すると、「パラメーター番号2はOUTパラメーターではありません」という例外がスローされます。なんで?

4

1 に答える 1

1

問題はこれです:

String sql = "USE"+Azonositok.getAdatbazisNev()+";";
utasitas.executeUpdate(sql);

使用コンテキストは、実行後のすべてのステートメントに設定されていないようです。SQL を実行してスキーマを変更する代わりに、JDBC URL に直接追加します。

final String adatbazisURL = 
    "jdbc:mysql://localhost:3306/" +
    Azonositok.getAdatbazisNev().trim();

または、プロシージャを実行する前に、プロシージャ名の前にスキーマを追加することもできます。

于 2013-02-20T14:24:21.723 に答える