Middle
O que são procedimentos armazenados e como podem ser chamados através do JDBC?
sobes.tech IA
Resposta da IA
Procedimentos armazenados são um conjunto de instruções SQL compiladas e armazenadas na base de dados. São executados como uma unidade e podem aceitar parâmetros, retornar valores. Permitem encapsular a lógica de negócio, melhorar o desempenho e a segurança.
Para chamar procedimentos armazenados através do JDBC, utiliza-se a interface CallableStatement.
import java.sql.*;
public class StoredProcedureExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase"; // URL da sua base de dados
String user = "myuser";
String password = "mypassword";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// Chamada de procedimento sem parâmetros
String sqlNoParams = "{CALL my_procedure_no_params()}";
try (CallableStatement stmtNoParams = conn.prepareCall(sqlNoParams)) {
stmtNoParams.execute();
System.out.println("Procedimento sem parâmetros executado.");
}
// Chamada de procedimento com parâmetro de entrada
String sqlWithInParams = "{CALL my_procedure_with_in(?, ?)}";
try (CallableStatement stmtWithInParams = conn.prepareCall(sqlWithInParams)) {
stmtWithInParams.setString(1, "Valor1"); // Definir o primeiro parâmetro IN
stmtWithInParams.setInt(2, 42); // Definir o segundo parâmetro IN
stmtWithInParams.execute();
System.out.println("Procedimento com parâmetros de entrada executado.");
}
// Chamada de procedimento com parâmetro de saída
String sqlWithInOutParams = "{CALL my_procedure_with_out(?, ?)}";
try (CallableStatement stmtWithInOutParams = conn.prepareCall(sqlWithInOutParams)) {
stmtWithInOutParams.setInt(1, 123); // Definir o parâmetro IN
stmtWithInOutParams.registerOutParameter(2, Types.VARCHAR); // Registrar o parâmetro OUT
stmtWithInOutParams.execute();
String outValue = stmtWithInOutParams.getString(2);
System.out.println("Procedimento com parâmetro de saída executado. Valor de saída: " + outValue);
}
// Chamada de procedimento que retorna ResultSet
String sqlWithResultSet = "{CALL my_procedure_return_rs()}";
try (CallableStatement stmtWithResultSet = conn.prepareCall(sqlWithResultSet)) {
boolean hasResultSet = stmtWithResultSet.execute();
if (hasResultSet) {
try (ResultSet rs = stmtWithResultSet.getResultSet()) {
while (rs.next()) {
// Processar dados do ResultSet
System.out.println("ID: " + rs.getInt("id") + ", Nome: " + rs.getString("name"));
}
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Principais passos:
- Obter uma conexão com a base de dados (
Connection). - Criar um objeto
CallableStatementusandoconnection.prepareCall(). A string de chamada deve estar no formato{CALL nome_procedimento(...)}. - Se o procedimento tiver parâmetros de entrada (
INouINOUT), definir seus valores usando os métodossetXyz(). A numeração dos parâmetros começa em 1. - Se o procedimento tiver parâmetros de saída (
OUTouINOUT), eles devem ser previamente registrados com o tipo de dado usandoregisterOutParameter(int parameterIndex, int sqlType). - Executar a chamada do procedimento armazenado usando
execute()ouexecuteQuery()(se o procedimento retornar umResultSet). - Para os parâmetros de saída, obter seus valores usando
getXyz(). - Processar o
ResultSetse o procedimento retornar um. - Fechar
CallableStatement,ResultSeteConnection. Recomenda-se usartry-with-resources.
O uso de CallableStatement permite trabalhar com diferentes tipos de parâmetros em procedimentos armazenados, incluindo arrays, estruturas e objetos de tipos específicos do banco de dados.