Назад к вопросам
Middle
67
questionbank
Что такое хранимые процедуры и каким образом их можно вызвать через JDBC?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Хранимые процедуры - это набор инструкций SQL, скомпилированных и сохраненных в базе данных. Они выполняются как единое целое и могут принимать параметры, возвращать значения. Позволяют инкапсулировать бизнес-логику, улучшать производительность и безопасность.
Для вызова хранимых процедур через JDBC используется интерфейс CallableStatement.
import java.sql.*;
public class StoredProcedureExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase"; // URL вашей БД
String user = "myuser";
String password = "mypassword";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// Вызов процедуры без параметров
String sqlNoParams = "{CALL my_procedure_no_params()}";
try (CallableStatement stmtNoParams = conn.prepareCall(sqlNoParams)) {
stmtNoParams.execute();
System.out.println("Процедура без параметров выполнена.");
}
// Вызов процедуры с входным параметром
String sqlWithInParams = "{CALL my_procedure_with_in(?, ?)}";
try (CallableStatement stmtWithInParams = conn.prepareCall(sqlWithInParams)) {
stmtWithInParams.setString(1, "Значение1"); // Установка первого IN параметра
stmtWithInParams.setInt(2, 42); // Установка второго IN параметра
stmtWithInParams.execute();
System.out.println("Процедура с входными параметрами выполнена.");
}
// Вызов процедуры с выходным параметром
String sqlWithInOutParams = "{CALL my_procedure_with_out(?, ?)}";
try (CallableStatement stmtWithInOutParams = conn.prepareCall(sqlWithInOutParams)) {
stmtWithInOutParams.setInt(1, 123); // Установка IN параметра
stmtWithInOutParams.registerOutParameter(2, Types.VARCHAR); // Регистрация OUT параметра
stmtWithInOutParams.execute();
String outValue = stmtWithInOutParams.getString(2);
System.out.println("Процедура с выходным параметром выполнена. Выходное значение: " + outValue);
}
// Вызов процедуры, возвращающей ResultSet
String sqlWithResultSet = "{CALL my_procedure_return_rs()}";
try (CallableStatement stmtWithResultSet = conn.prepareCall(sqlWithResultSet)) {
boolean hasResultSet = stmtWithResultSet.execute();
if (hasResultSet) {
try (ResultSet rs = stmtWithResultSet.getResultSet()) {
while (rs.next()) {
// Обработка данных из ResultSet
System.out.println("ID: " + rs.getInt("id") + ", Имя: " + rs.getString("name"));
}
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Основные шаги:
- Получить соединение с базой данных (
Connection). - Создать объект
CallableStatementс использованиемconnection.prepareCall(). Строка вызова должна быть в формате{CALL procedure_name(...)}. - Если процедура имеет входные параметры (
INOUTилиIN), установить их значения с помощью методовsetXyz(). Нумерация параметров начинается с 1. - Если процедура имеет выходные параметры (
OUTилиINOUT), их необходимо предварительно зарегистрировать с указанием типа данных с помощьюregisterOutParameter(int parameterIndex, int sqlType). - Выполнить вызов хранимой процедуры с помощью
execute()илиexecuteQuery()(если процедура возвращаетResultSet). - Для выходных параметров получить значения с помощью методов
getXyz(). - Обработать
ResultSet, если процедура его возвращает. - Закрыть
CallableStatement,ResultSetиConnection. Рекомендуется использоватьtry-with-resources.
Использование CallableStatement позволяет работать с различными типами параметров хранимых процедур, включая массивы, структуры и объекты специфичных для БД типов.