Ответ
CallableStatement — это интерфейс в JDBC API, предназначенный для выполнения хранимых процедур и функций, вызываемых из базы данных. Он наследует от PreparedStatement и поддерживает параметры типов IN (входные), OUT (выходные) и INOUT (входо-выходные).
Пример вызова хранимой процедуры с OUT-параметром:
// Предположим, есть процедура: CREATE PROCEDURE get_employee_name(IN emp_id INT, OUT emp_name VARCHAR(100))
String sql = "{call get_employee_name(?, ?)}"; // Синтаксис вызова процедуры
try (Connection conn = dataSource.getConnection();
CallableStatement stmt = conn.prepareCall(sql)) {
// Установка IN-параметра
stmt.setInt(1, 123);
// Регистрация OUT-параметра (указание его типа)
stmt.registerOutParameter(2, Types.VARCHAR);
// Выполнение процедуры
stmt.execute();
// Получение значения OUT-параметра после выполнения
String employeeName = stmt.getString(2);
System.out.println("Employee name: " + employeeName);
} catch (SQLException e) {
e.printStackTrace();
}
Основные особенности и преимущества:
- Производительность: Хранимые процедуры часто выполняются быстрее, так как компилируются и кэшируются на стороне СУБД.
- Бизнес-логика на стороне БД: Позволяет инкапсулировать сложную логику работы с данными внутри базы.
- Безопасность: Может помочь предотвратить SQL-инъекции и предоставить более строгий контроль доступа.
- Работа с REF CURSOR: Поддерживает возврат результирующих наборов через курсоры.
- Множественные результаты: Может возвращать несколько результирующих наборов (используется
stmt.getMoreResults()).