Sobes.tech
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:

  1. Obter uma conexão com a base de dados (Connection).
  2. Criar um objeto CallableStatement usando connection.prepareCall(). A string de chamada deve estar no formato {CALL nome_procedimento(...)}.
  3. Se o procedimento tiver parâmetros de entrada (IN ou INOUT), definir seus valores usando os métodos setXyz(). A numeração dos parâmetros começa em 1.
  4. Se o procedimento tiver parâmetros de saída (OUT ou INOUT), eles devem ser previamente registrados com o tipo de dado usando registerOutParameter(int parameterIndex, int sqlType).
  5. Executar a chamada do procedimento armazenado usando execute() ou executeQuery() (se o procedimento retornar um ResultSet).
  6. Para os parâmetros de saída, obter seus valores usando getXyz().
  7. Processar o ResultSet se o procedimento retornar um.
  8. Fechar CallableStatement, ResultSet e Connection. Recomenda-se usar try-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.