Sobes.tech
Middle

Čo sú uložené procedúry a ako ich možno volať cez JDBC?

sobes.tech AI

Odpoveď od AI

Uložené procedúry sú súbor SQL inštrukcií, ktoré sú skompilované a uložené v databáze. Sú vykonávané ako celok a môžu prijímať parametre, vracať hodnoty. Umožňujú enkapsuláciu podnikovej logiky, zlepšujú výkon a bezpečnosť.

Na volanie uložených procedúr cez JDBC sa používa rozhranie CallableStatement.

import java.sql.*;

public class StoredProcedureExample {

    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase"; // URL vašej DB
        String user = "myuser";
        String password = "mypassword";

        try (Connection conn = DriverManager.getConnection(url, user, password)) {

            // Volanie bez parametrov
            String sqlNoParams = "{CALL my_procedure_no_params()}";
            try (CallableStatement stmtNoParams = conn.prepareCall(sqlNoParams)) {
                stmtNoParams.execute();
                System.out.println("Procedúra bez parametrov bola vykonaná.");
            }

            // Volanie s vstupným parametrom
            String sqlWithInParams = "{CALL my_procedure_with_in(?, ?)}";
            try (CallableStatement stmtWithInParams = conn.prepareCall(sqlWithInParams)) {
                stmtWithInParams.setString(1, "Hodnota1"); // Nastavenie prvého IN parametra
                stmtWithInParams.setInt(2, 42);           // Nastavenie druhého IN parametra
                stmtWithInParams.execute();
                System.out.println("Procedúra s vstupnými parametrami bola vykonaná.");
            }

            // Volanie s výstupným parametrom
            String sqlWithInOutParams = "{CALL my_procedure_with_out(?, ?)}";
            try (CallableStatement stmtWithInOutParams = conn.prepareCall(sqlWithInOutParams)) {
                stmtWithInOutParams.setInt(1, 123); // Nastavenie IN parametra
                stmtWithInOutParams.registerOutParameter(2, Types.VARCHAR); // Registrácia OUT parametra
                stmtWithInOutParams.execute();
                String outValue = stmtWithInOutParams.getString(2);
                System.out.println("Procedúra s výstupným parametrom bola vykonaná. Výstupná hodnota: " + outValue);
            }

            // Volanie s 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()) {
                             // Spracovanie dát z ResultSet
                             System.out.println("ID: " + rs.getInt("id") + ", Meno: " + rs.getString("name"));
                         }
                     }
                 }
             }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Hlavné kroky:

  1. Získať spojenie s databázou (Connection).
  2. Vytvoriť objekt CallableStatement pomocou connection.prepareCall(). Riadok volania by mal byť vo formáte {CALL názov_procedúry(...)}.
  3. Ak procedúra má vstupné parametre (INOUT alebo IN), nastaviť ich hodnoty pomocou metód setXyz(). Číslo parametra začína od 1.
  4. Ak procedúra má výstupné parametre (OUT alebo INOUT), je potrebné ich predvolene zaregistrovať s určením typu dát pomocou registerOutParameter(int parameterIndex, int sqlType).
  5. Spustiť volanie uložené procedúry pomocou execute() alebo executeQuery() (ak procedúra vracia ResultSet).
  6. Pre výstupné parametre získať hodnoty pomocou getXyz().
  7. Spracovať ResultSet, ak ho procedúra vracia.
  8. Zatvoriť CallableStatement, ResultSet a Connection. Odporúča sa použiť try-with-resources.

Použitie CallableStatement umožňuje pracovať s rôznymi typmi parametrov uložených procedúr, vrátane polí, štruktúr a objektov špecifických databázových typov.