Использование хранимых процедур в Java
Last updated: 9 мая 2025 г.Хранимые процедуры
это по сути функции, только вместо java кода sql код и эти функции хранятся в БД.
Для создания этой процедуры в БД, нужно выполнить sql запрос CREATE PROCEDURE…
Давайте создадим две процедуры. Одна будет возвращать параметр, в другую будем передавать параметр.
1#В скобках ниже не входной параметр процедуры,
2#а выходной. OUT обозначает что этот параметр
3#countofbooks будет возвращаться из процедуры.
4CREATE PROCEDURE NumberOfBooks (OUT countofbooks INT)
5BEGIN
6 #Копируем количество строк
7 #в выходной параметр countofbooks.
8 SELECT COUNT(*) INTO countofbooks FROM books;
9END;
10
11#Также важным примером будет создание
12#процедуры, в которую передается параметр.
13#Создадим вторую процедуру.
14CREATE PROCEDURE getBooks (bookId INT)
15BEGIN
16 select * from books where id = bookId;
17END;
Через MySql консоль создадим их в нашей БД:

Работа с хранимыми процедурами с помощью JDBC
Для использования процедур важно рассмотреть CallableStatement
и sql escape
последовательности.
Если PreparedStatement предоставлял методы для управления входящими параметрами то CallableStatement для исходящих.
CallableStatement
используется для вызова хранимых процедур и манипуляции выходными параметрами процедуры.
Sql escape
последовательности являют собой часть sql запроса, которая выполняет какие-то действия. Например, вызов процедуры с помощью {call bookCount(?)}
.
Пример программы:
1import java.sql.*;
2
3public class Procedures {
4 public static void main(String[] args)
5 throws ClassNotFoundException, SQLException {
6 Class.forName("com.mysql.cj.jdbc.Driver");
7 Connection connection = DriverManager.getConnection(
8 "jdbc:mysql://localhost/storage",
9 "root", "07998MSD");
10
11 //используем первую процедуру.
12
13 //В ней можно увидеть escape последовательность.
14 //Здесь call для вызова указанной процедуры.
15 CallableStatement cstatement =
16 connection.prepareCall("{call NumberOfBooks(?)}");
17 //Теперь сообщаем JDBC драйверу
18 //какой параметр будет на выходе
19 //процедуры. В нашем случае INTEGER.
20 cstatement.registerOutParameter(1, Types.INTEGER);
21 //выполнить процедуру
22 cstatement.execute();
23 //Выведем на консоль значение первого
24 //параметра процедуры.
25 System.out.println(cstatement.getInt(1));
26
27 //используем вторую процедуру.
28
29 CallableStatement cstatement2 =
30 connection.prepareCall("{call getBooks(?)}");
31 //Можем передать параметр в процедуру.
32 //Передаем единицу на место первого вопросика
33 cstatement2.setInt(1, 1);
34 //выполнить процедуру
35 cstatement2.execute();
36 //получить результат процедуры
37 ResultSet presultSet = cstatement2.getResultSet();
38 while (presultSet.next()) {
39 int id = presultSet.getInt("id");
40 String name = presultSet.getString("name");
41 String author = presultSet.getString("author");
42
43 System.out.println("\n=================\n");
44 System.out.println("id: " + id);
45 System.out.println("name: " + name);
46 System.out.println("author: " + author);
47 }
48
49 System.out.println("Closing connection and "
50 +"releasing resources…");
51 presultSet.close();
52 cstatement.close();
53 cstatement2.close();
54 connection.close();
55 }
56}
Вывод:

Видим, что первая процедура выполнилась успешно – 5 записей в таблице с книгами. Вторая процедура тоже успешно вывела книгу с id = 1.
Следующие уроки
Что такое HTML и зачем он нужен
10
мин.
Ключевые теги HTML
9
мин.
Атрибуты в HTML
8
мин.