Spec-Zone .ru
спецификации, руководства, описания, API
|
Запускаясь с версии 5.0 сервера MySQL когда использующийся с Connector/J 3.1.1 или более новый, java.sql.CallableStatement
интерфейс полностью реализуется за исключением getParameterMetaData()
метод.
Для получения дополнительной информации по хранимым процедурам MySQL, пожалуйста, обратитесь к
Connector/J представляет функциональность хранимой процедуры через JDBC's CallableStatement
интерфейс.
Текущие версии сервера MySQL не возвращают достаточную информацию для драйвера JDBC, чтобы
обеспечить метаданные набора результатов для вызываемых операторов. Это означает это при использовании CallableStatement
, ResultSetMetaData
может
возвратиться NULL
.
Следующий пример показывает хранимую процедуру, которая возвращает значение inOutParam
постепенно увеличенный 1, и строка передается в использовании inputParam
как a ResultSet
:
Пример 21.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()
.
Заметьте, что необходимо использовать синтаксис escape JDBC, и что круглые скобки, окружающие заполнителей параметра, не являются дополнительными:
Пример 21.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
интерфейс:
Пример 21.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
также поддерживает устанавливающие
параметры по имени:
Пример 21.6. Connector/J: Установка CallableStatement
inputparameters
... // // Set a parameter by index // cStmt.setString(1, "abcdefg"); // // Alternatively, set a parameter using // the parameter name // cStmt.setString("inputParameter", "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()
,
поскольку Вы не должны знать заранее, если хранимая процедура возвращает наборы результатов:
Пример 21.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...