Usar un procedimiento almacenado con parámetros de salidaUsing a Stored Procedure with Output Parameters

DescargarDescargar controlador para JDBCDownloadDownload JDBC Driver

A SQL ServerSQL Server procedimiento almacenado que se puede llamar es aquella que devuelve uno o varios parámetros, que son parámetros que utiliza el procedimiento almacenado para devolver datos de salida devuelto a la aplicación que realiza la llamada.A SQL ServerSQL Server stored procedure that you can call is one that returns one or more OUT parameters, which are parameters that the stored procedure uses to return data back to the calling application. El Controlador JDBC de Microsoft para SQL ServerMicrosoft JDBC Driver for SQL Server proporciona el SQLServerCallableStatement (clase), que puede usar para llamar a este tipo de procedimiento almacenado y procesar los datos que devuelve.The Controlador JDBC de Microsoft para SQL ServerMicrosoft JDBC Driver for SQL Server provides the SQLServerCallableStatement class, which you can use to call this kind of stored procedure and process the data that it returns.

Cuando se llama a este tipo de procedimiento almacenado con el controlador JDBC, debe utilizar el call secuencia de escape SQL junto con la prepareCall método de la SQLServerConnection clase.When you call this kind of stored procedure by using the JDBC driver, you must use the call SQL escape sequence together with the prepareCall method of the SQLServerConnection class. La sintaxis de la call secuencia de escape con los parámetros de salida es la siguiente:The syntax for the call escape sequence with OUT parameters is the following:

{call procedure-name[([parameter][,[parameter]]...)]}

Nota

Para obtener más información acerca de las secuencias de escape SQL, consulte usar secuencias de Escape de SQL.For more information about the SQL escape sequences, see Using SQL Escape Sequences.

¿Al construir el call secuencia de escape, especifique los parámetros OUT con el?When you construct the call escape sequence, specify the OUT parameters by using the ? (signo de interrogación).(question mark) character. Este carácter actúa como un marcador de posición para los valores de parámetros devueltos por el procedimiento almacenado.This character acts as a placeholder for the parameter values that will be returned from the stored procedure. Para especificar un valor para un parámetro OUT, debe especificar el tipo de datos de cada parámetro mediante el registerOutParameter método de la clase SQLServerCallableStatement antes de ejecutar el procedimiento almacenado.To specify a value for an OUT parameter, you must specify the data type of each parameter by using the registerOutParameter method of the SQLServerCallableStatement class before you run the stored procedure.

El valor que especifique para el parámetro OUT en el método registerOutParameter debe ser uno de los tipos de datos JDBC incluidos en java.sql.Types, que a su vez se asigna a uno de nativo SQL ServerSQL Server tipos de datos.The value that you specify for the OUT parameter in the registerOutParameter method must be one of the JDBC data types contained in java.sql.Types, which in turn maps to one of the native SQL ServerSQL Server data types. Para obtener más información acerca de JDBC y SQL ServerSQL Server tipos de datos, consulte descripción de los tipos de datos del controlador JDBC.For more information about the JDBC and SQL ServerSQL Server data types, see Understanding the JDBC Driver Data Types.

Cuando se pasa un valor para el método registerOutParameter para un parámetro OUT, debe especificar no solo los tipos de datos que se utilizará para el parámetro, pero también posición ordinal del parámetro o el nombre del parámetro en el procedimiento almacenado.When you pass a value to the registerOutParameter method for an OUT parameter, you must specify not only the data type to be used for the parameter, but also the parameter's ordinal placement or the parameter's name in the stored procedure. Por ejemplo, si el procedimiento almacenado contiene un solo parámetro OUT, su valor ordinal es 1 y, si el procedimiento almacenado contiene dos parámetros, el primer valor ordinal es 1 y el segundo 2.For example, if your stored procedure contains a single OUT parameter, its ordinal value will be 1; if the stored procedure contains two parameters, the first ordinal value will be 1, and the second ordinal value will be 2.

Nota

El controlador JDBC no admite el uso de CURSOR, SQLVARIANT, tabla y marca de tiempo SQL ServerSQL Server tipos de datos como parámetros de salida.The JDBC driver does not support the use of CURSOR, SQLVARIANT, TABLE, and TIMESTAMP SQL ServerSQL Server data types as OUT parameters.

Por ejemplo, cree el siguiente procedimiento almacenado en el AdventureWorksAdventureWorks base de datos de ejemplo:As an example, create the following stored procedure in the AdventureWorksAdventureWorks sample database:

CREATE PROCEDURE GetImmediateManager  
   @employeeID INT,  
   @managerID INT OUTPUT  
AS  
BEGIN  
   SELECT @managerID = ManagerID   
   FROM HumanResources.Employee   
   WHERE EmployeeID = @employeeID  
END  

Este procedimiento almacenado devuelve un solo parámetro OUT (managerID), que es un entero, en función del parámetro IN (employeeID) especificado, que también es un entero.This stored procedure returns a single OUT parameter (managerID), which is an integer, based on the specified IN parameter (employeeID), which is also an integer. El valor devuelto en el parámetro OUT es ManagerID en función de EmployeeID en la tabla HumanResources.Employee.The value that is returned in the OUT parameter is the ManagerID based on the EmployeeID that is contained in the HumanResources.Employee table.

En el ejemplo siguiente, una conexión abierta a la AdventureWorksAdventureWorks base de datos de ejemplo se pasa a la función y el ejecutar método se usa para llamar al procedimiento almacenado GetImmediateManager:In the following example, an open connection to the AdventureWorksAdventureWorks sample database is passed in to the function, and the execute method is used to call the GetImmediateManager stored procedure:

public static void executeStoredProcedure(Connection con) {  
   try {  
      CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");  
      cstmt.setInt(1, 5);  
      cstmt.registerOutParameter(2, java.sql.Types.INTEGER);  
      cstmt.execute();  
      System.out.println("MANAGER ID: " + cstmt.getInt(2));  
   }  
   catch (Exception e) {  
      e.printStackTrace();  
   }  
}  

Este ejemplo utiliza las posiciones ordinales para identificar los parámetros.This example uses the ordinal positions to identify the parameters. También puede identificar un parámetro utilizando su nombre en lugar de su posición ordinal.Alternatively, you can identify a parameter by using its name instead of its ordinal position. En el ejemplo de código siguiente se modifica el ejemplo anterior para demostrar cómo utilizar los parámetros con nombre en una aplicación Java.The following code example modifies the previous example to demonstrate how to use named parameters in a Java application. Observe que los nombres de parámetros se corresponden con los nombres de parámetros en la definición del procedimiento almacenado:Note that parameter names correspond to the parameter names in the stored procedure's definition:

public static void executeStoredProcedure(Connection con) {  
   try {  
      CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");  
      cstmt.setInt("employeeID", 5);  
      cstmt.registerOutParameter("managerID", java.sql.Types.INTEGER);  
      cstmt.execute();  
      System.out.println("MANAGER ID: " + cstmt.getInt("managerID"));  
      cstmt.close();  
   }  
   catch (Exception e) {  
      e.printStackTrace();  
   }  

}}

Nota

Estos ejemplos utilizan el método execute de la clase SQLServerCallableStatement para ejecutar el procedimiento almacenado.These examples use the execute method of the SQLServerCallableStatement class to run the stored procedure. Se usa dicho método porque el procedimiento almacenado no ha devuelto ningún conjunto de resultados.This is used because the stored procedure did not also return a result set. Si lo hiciera, el executeQuery se usaría el método.If it did, the executeQuery method would be used.

Los procedimientos almacenados también pueden devolver recuentos de actualizaciones y múltiples conjuntos de resultados.Stored procedures can return update counts and multiple result sets. El Controlador JDBC de Microsoft para SQL ServerMicrosoft JDBC Driver for SQL Server sigue la especificación de JDBC 3.0, que indica que se deben recuperar varios conjuntos de resultados y recuentos de actualizaciones antes de que se recuperen los parámetros OUT.The Controlador JDBC de Microsoft para SQL ServerMicrosoft JDBC Driver for SQL Server follows the JDBC 3.0 specification, which states that multiple result sets and update counts should be retrieved before the OUT parameters are retrieved. Es decir, la aplicación debe recuperar todos los objetos de conjunto de resultados y recuentos de actualizaciones antes de recuperar los parámetros OUT mediante los métodos de CallableStatement.getter.That is, the application should retrieve all of the ResultSet objects and update counts before retrieving the OUT parameters by using the CallableStatement.getter methods. En caso contrario, los objetos de conjunto de resultados y recuentos de actualizaciones que no se han recuperado se perderán cuando se recuperen los parámetros OUT.Otherwise, the ResultSet objects and update counts that have not already been retrieved will be lost when the OUT parameters are retrieved. Para obtener más información sobre recuentos de actualizaciones y conjuntos de resultados, vea mediante un procedimiento almacenado con un recuento de actualización y utilizando varios conjuntos de resultados.For more information about update counts and multiple result sets, see Using a Stored Procedure with an Update Count and Using Multiple Result Sets.

Vea tambiénSee Also

Usar instrucciones con procedimientos almacenadosUsing Statements with Stored Procedures