Параметр номер 1 не является параметром OUT

1

Пытаясь выполнить хранимую процедуру с помощью 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);
    }

}
  • 0
    Sproc работает автономно (то есть вне Java)?
  • 0
    Какую СУБД вы используете?
Показать ещё 2 комментария
Теги:
stored-procedures
jdbc
parameters

1 ответ

-3

Если определение хранимой процедуры содержит параметр IN, просматривающий код, который вы использовали, тогда оператор вызова должен выглядеть так:

 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);

В любом случае, поделитесь своим определением процедуры, которое сделает его более понятным.

  • 0
    Я попробовал ваш второй вариант, так как у меня есть один выходной параметр. Теперь я получаю эту ошибку: java.lang.NullPointerException
  • 2
    cs3.setString(1, java.sql.Types.VARCHAR); будет синтаксической ошибкой, так как вы назначаете целое число для строкового параметра. Вы бы присвоили ему строковое значение. И поскольку этот вопрос о OUT , он не имеет смысла как часть вашего ответа. Во-вторых, {? = call sp1()} escape {? = call sp1()} будет для хранимых процедур с одним возвращаемым значением, а не для параметров OUT .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню