Как передавать параметры в CallableStatement для вызова хранимых процедур?

«Как передавать параметры в CallableStatement для вызова хранимых процедур?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, параметры в CallableStatement передаются и регистрируются явно. В отличие от обычного Statement, CallableStatement работает с параметризованными вызовами хранимых процедур и функций.

Типы параметров и работа с ними:

Тип параметра Установка значения Регистрация Получение результата
IN (входной) setXXX(int parameterIndex, XXX value) Не требуется Не требуется
OUT (выходной) Не требуется registerOutParameter(...) getXXX(...) после execute()
INOUT (входно-выходной) setXXX(...) registerOutParameter(...) getXXX(...) после execute()

Пример вызова процедуры с IN и OUT параметрами:

String sql = "{call get_employee_name(?, ?)}"; // SQL-вызов процедуры
try (CallableStatement stmt = connection.prepareCall(sql)) {
    // Установка IN-параметра (ID сотрудника)
    stmt.setInt(1, 101);
    // Регистрация OUT-параметра (Имя сотрудника)
    stmt.registerOutParameter(2, Types.VARCHAR);

    stmt.execute(); // Выполнение вызова

    // Получение значения OUT-параметра
    String employeeName = stmt.getString(2);
    System.out.println("Employee: " + employeeName);
}

Важно: Параметры индексируются с 1. Порядок должен соответствовать объявлению в хранимой процедуре.