Пытаясь выполнить хранимую процедуру с помощью 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);
}
}
Если определение хранимой процедуры содержит параметр 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);
В любом случае, поделитесь своим определением процедуры, которое сделает его более понятным.
cs3.setString(1, java.sql.Types.VARCHAR);
будет синтаксической ошибкой, так как вы назначаете целое число для строкового параметра. Вы бы присвоили ему строковое значение. И поскольку этот вопрос о OUT
, он не имеет смысла как часть вашего ответа. Во-вторых, {? = call sp1()}
escape {? = call sp1()}
будет для хранимых процедур с одним возвращаемым значением, а не для параметров OUT
.