CodeGym/Cursos Java/Módulo 4. Working with databases/Llamar a funciones de SQL Server

Llamar a funciones de SQL Server

Disponible

CallableStatement

JDBC tiene otra interfaz para escenarios aún más complejos. Hereda de PreparedStatement y se llama CallableStatement .

Se utiliza para llamar (Call) a procedimientos almacenados en la base de datos. La peculiaridad de una llamada de este tipo es que, además del resultado de ResultSet , también se pueden pasar parámetros a dicho procedimiento almacenado.

¿Qué hay de nuevo, preguntas? PreparedStatement también tiene un resultado de ResultSet y también puede pasarle parámetros. Sí, así es, pero la peculiaridad de los procedimientos almacenados es que a través de parámetros no solo pueden recibir, sino también devolver datos.

El procedimiento almacenado se llama con los parámetros IN , OUT e INOUT . Devuelve uno o más objetos ResultSet . El método Connection.prepareCall() se usa para crear un objeto CallableStatement .

Aquí imagine que tiene un procedimiento almacenado ADD que acepta los parámetros a, b y c. Este procedimiento suma a y b y coloca el resultado de la suma en la variable c.

Escribamos el código donde intentaremos llamarlo:

// Connect to the server
Connection connection = DriverManager.getConnection("jdbc:as400://mySystem");

// Create a CallableStatement object. It does preprocessing
// calling a stored procedure. Question marks
// indicate where the input parameters should be substituted, and where the output ones
// The first two parameters are input,
// and the third one is a day off.
CallableStatement statement = connection.prepareCall("CALL MYLIBRARY.ADD (?, ?, ?)");

// Setting up input parameters. Passing 123 and 234 to the procedure
statement.setInt (1, 123);
statement.setInt (2, 234);

// Registering the output parameter type
statement.registerOutParameter (3, Types.INTEGER);

// Run stored procedure
statement.execute();

// Get the value of the output parameter
int sum = statement.getInt(3);

// Close CallableStatement and Connection
statement.close();
connection.close();

El trabajo es casi como con PreparedStatement , solo que hay un matiz. Nuestra función ADD devuelve el resultado de la suma en el tercer parámetro. Solo el objeto CallableStatement no sabe nada de esto. Por lo tanto, le decimos esto explícitamente llamando al método registerOutParameter() :

registerOutParameter(parameter number, Parameter type)

Después de eso, puede llamar al procedimiento a través del método execute() y luego leer los datos del tercer parámetro usando el método getInt() .

Solicitudes por lotes

En proyectos reales, a menudo surge una situación en la que necesita realizar muchas consultas del mismo tipo (la más común en este caso es PreparedStatement ), por ejemplo, necesita insertar varias decenas o cientos de registros.

Si ejecuta cada solicitud por separado, llevará mucho tiempo y reducirá el rendimiento de la aplicación. Para evitar esto, puede utilizar el modo de inserción por lotes. Se encuentra en el hecho de que acumula algo de búfer con sus solicitudes y luego las ejecuta de inmediato.

Aquí hay un fragmento de código como ejemplo:

PreparedStatement stmt = con.prepareStatement(
        	"INSERT INTO jc_contact (first_name, last_name, phone, email) VALUES (?, ?, ?, ?)");

for (int i = 0; i < 10; i++) {
	// Fill in the request parameters
	stmt.setString(1, "FirstName_" + i);
    stmt.setString(2, "LastNAme_" + i);
    stmt.setString(3, "phone_" + i);
    stmt.setString(4, "email_" + i);
	// The request is not executed, but fits into the buffer,
	// which is then executed immediately for all commands
	stmt.addBatch();
}
// Execute all requests at once
int[] results = stmt.executeBatch();

En lugar de ejecutar la consulta con el método execute() , la procesamos por lotes con el método addBatch() .

Y luego, cuando hay varios cientos de solicitudes, puede enviarlas todas a la vez al servidor llamando al comando executeBatch() .

Saludable. El método executeBatch() devuelve una matriz de enteros — int[]. Cada celda de esta matriz contiene un número que indica el número de filas modificadas por la consulta correspondiente. Si la solicitud número 3 en el lote cambió 5 filas, entonces la tercera celda de la matriz contendrá el número 5.

1
Tarea
Módulo 4. Working with databases,  nivel 8lección 2
Bloqueada
task0804
task0804
Comentarios
  • Populares
  • Nuevas
  • Antiguas
Debes iniciar sesión para dejar un comentario
Esta página aún no tiene comentarios