Spec-Zone .ru
спецификации, руководства, описания, API

21.3.6.3. Используя JDBC CallableStatements Выполнить StoredProcedures

Запускаясь с версии 5.0 сервера MySQL когда использующийся с Connector/J 3.1.1 или более новый, java.sql.CallableStatement интерфейс полностью реализуется за исключением getParameterMetaData() метод.

Для получения дополнительной информации по хранимым процедурам MySQL, пожалуйста, обратитесь к http://dev.mysql.com/doc/mysql/en/stored-routines.html.

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, следуйте за этими шагами:

  1. Подготовьте вызываемый оператор при использовании 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 экземпляры в Вашем коде.

  2. Зарегистрируйте выходные параметры (если кто-либо существует),

    Получать значения выходных параметров (параметры, определенные как 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);...
  3. Установите входные параметры (если кто-либо существует),

    Ввод и в / параметрах устанавливается что касается 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);...
  4. Выполнитесь 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...