7.3 Использование JDBC CallableStatements для выполнения хранимых процедур
Connector/J полностью реализует интерфейс java.sql.CallableStatement.
Для получения дополнительной информации о хранимых процедурах MySQL, обратитесь к .
Connector/J предоставляет функциональность хранимых процедур через интерфейс JDBC CallableStatement.
Следующий пример демонстрирует хранимую процедуру, возвращающую значение inOutParam, увеличенное на 1, и строку, переданную с помощью inputParam в качестве ResultSet:
Пример 7.3 Connector/J: Вызов хранимых процедур
CREATE PROCEDURE demoSp(IN inputParam VARCHAR(255), \
INOUT inOutParam INT)
BEGIN
DECLARE z INT;
SET z = inOutParam + 1;
SET inOutParam = z;
SELECT inputParam;
SELECT CONCAT('zyxw', inputParam);
END
Для использования процедуры demoSp с Connector/J, выполните следующие шаги:
-
Подготовьте вызываемый оператор с помощью
Connection.prepareCall().Обратите внимание, что вам необходимо использовать синтаксис экранирования JDBC, и скобки вокруг заполнитель параметров не являются необязательными:
Пример 7.4 Connector/J: Использование
Connection.prepareCall()import java.sql.CallableStatement; ... // // Prepare a call to the stored procedure 'demoSp' // with two parameters // // Notice the use of JDBC-escape syntax ({call ...}) // CallableStatement cStmt = conn.prepareCall("{call demoSp(?, ?)}"); cStmt.setString(1, "abcdefg");ПримечаниеConnection.prepareCall()является дорогостоящим методом, из-за извлечения метаданных, которое выполняет драйвер для поддержки выходных параметров. По соображениям производительности, минимизируйте ненужные вызовы кConnection.prepareCall(), повторно используя экземплярыCallableStatementв вашем коде. -
Зарегистрируйте выходные параметры (если они существуют)
Для получения значений выходных параметров (параметров, указанных как
OUTилиINOUTпри создании хранимой процедуры), JDBC требует, чтобы они были указаны до выполнения оператора с помощью различных методовregisterOutputParameter()в интерфейсеCallableStatement:Пример 7.5 Connector/J: Регистрация выходных параметров
import java.sql.Types; ... // // Connector/J supports both named and indexed // output parameters. You can register output // parameters using either method, as well // as retrieve output parameters using either // method, regardless of what method was // used to register them. // // The following examples show how to use // the various methods of registering // output parameters (you should of course // use only one registration per parameter). // // // Registers the second parameter as output, and // uses the type 'INTEGER' for values returned from // getObject() // cStmt.registerOutParameter(2, Types.INTEGER); // // Registers the named parameter 'inOutParam', and // uses the type 'INTEGER' for values returned from // getObject() // cStmt.registerOutParameter("inOutParam", Types.INTEGER); ...
-
Установите входные параметры (если они существуют)
Входные и входно-выходные параметры устанавливаются как для объектов
PreparedStatement. Однако,CallableStatementтакже поддерживает установку параметров по имени:Пример 7.6 Connector/J: Установка
CallableStatementвходных параметров... // // Set a parameter by index // cStmt.setString(1, "abcdefg"); // // Alternatively, set a parameter using // the parameter name // cStmt.setString("inputParam", "abcdefg"); // // Set the 'in/out' parameter using an index // cStmt.setInt(2, 1); // // Alternatively, set the 'in/out' parameter // by name // cStmt.setInt("inOutParam", 1); ...
-
Выполните
CallableStatementи получите любые наборы результатов или выходные параметры.Хотя
CallableStatementподдерживает вызов любого из методов выполненияStatement(executeUpdate(),executeQuery()илиexecute()), наиболее гибким методом для вызова являетсяexecute(), так как вам не нужно знать заранее, возвращает ли хранимая процедура наборы результатов:Пример 7.7 Connector/J: Получение результатов и значений выходных параметров
... boolean hadResults = cStmt.execute(); // // Process all returned result sets // while (hadResults) { ResultSet rs = cStmt.getResultSet(); // process result set ... hadResults = cStmt.getMoreResults(); } // // Retrieve output parameters // // Connector/J supports both index-based and // name-based retrieval // int outputValue = cStmt.getInt(2); // index-based outputValue = cStmt.getInt("inOutParam"); // name-based ...
© 2025 Oracle
Licensed under the GPLv2 License.