Sobes.tech
Middle
178

Ako zavolať uloženú procedúru v Jave?

Odpoveď od AI

sobes.tech AI

Za pozivanje čuvane procedure u Javi koristi se CallableStatement iz paketa java.sql.

Glavni koraci:

  1. Dobijanje veze: Koristi se objekat Connection.
    // Primer dobijanja veze (zavisi od drajvera i konfiguracije)
    Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydatabase", "user", "password");
    
  2. Kreiranje CallableStatement: SQL poziv čuvane procedure se prosleđuje u konstruktor prepareCall(). Sintaksa zavisi od SGBD, ali često ima oblik { call procedure_name(?, ?, ...) }.
    // Poziv procedure bez parametara
    CallableStatement cstmt = conn.prepareCall("{ call my_procedure() }");
    
    // Poziv procedure sa parametrima
    CallableStatement cstmtWithParams = conn.prepareCall("{ call my_procedure_with_params(?, ?) }");
    
  3. Postavljanje ulaznih parametara: Ako procedura prima parametre, oni se postavljaju pomoću metoda setXxx(), gde Xxx odgovara tipu podataka (npr. setString, setInt).
    // Postavljanje ulaznih parametara
    cstmtWithParams.setString(1, "value1");
    cstmtWithParams.setInt(2, 123);
    
  4. Registracija izlaznih parametara (ako ih ima): Ako procedura vraća vrednosti putem izlaznih parametara, oni se registruju pomoću registerOutParameter(), navodeći indeks parametra i tip podataka JDBC.
    // Procedura sa izlaznim parametrom
    CallableStatement cstmtWithOut = conn.prepareCall("{ call my_procedure_with_out(?) }");
    cstmtWithOut.registerOutParameter(1, Types.VARCHAR); // VARCHAR kao primer
    
  5. Izvršavanje zahteva: Koristi se metoda execute(). Ako procedura vraća rezultatski skup, može se koristiti executeQuery().
    // Izvršavanje procedure
    cstmt.execute(); // Za procedure bez rezultatskog skupa
    
    // Izvršavanje procedure koja vraća rezultatski skup
    // CallableStatement cstmtWithResultSet = conn.prepareCall("{ call get_data() }");
    // ResultSet rs = cstmtWithResultSet.executeQuery();
    
  6. Obrada rezultata: Ako procedura vraća rezultatski skup, on se može obraditi kao običan ResultSet. Ako postoje izlazni parametri, njihove vrednosti se izvlače metodama getXxx().
    // Obrada izlaznog parametra
    String result = cstmtWithOut.getString(1);
    
    // Obrada rezultatskog skupa
    /*
    while (rs.next()) {
        // Čitanje podataka iz rezultatskog skupa
    }
    rs.close();
    */
    
  7. Zatvaranje resursa: Važno je zatvoriti CallableStatement i Connection. Bolje je koristiti blok try-with-resources.
    // Zatvaranje resursa korišćenjem try-with-resources
    try (Connection conn = DriverManager.getConnection("...", "...", "...")) {
        try (CallableStatement cstmt = conn.prepareCall("{ call my_procedure(?) }")) {
            cstmt.setString(1, "test");
            cstmt.execute();
            // Obrada rezultata
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    

Primer poziva procedure sa ulaznim i vraćajućim vrednostima (kroz RETURN, a ne OUT-parametar, karakteristično za PostgreSQL/MySQL):

// Procedura u bazi podataka: CREATE OR REPLACE FUNCTION add_numbers(a INT, b INT) RETURNS INT AS $$ BEGIN RETURN a + b; END; $$ LANGUAGE plpgsql;
try (Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydatabase", "user", "password")) {
    // SQL poziv funkcije (često se koristi sintaksa { ? = call function_name(?, ?) } za funkcije)
    try (CallableStatement cstmt = conn.prepareCall("{ ? = call add_numbers(?, ?) }")) {
        // Registracija izlaznog parametra (vraćene vrednosti)
        cstmt.registerOutParameter(1, Types.INTEGER);
        // Postavljanje ulaznih parametara
        cstmt.setInt(2, 10);
        cstmt.setInt(3, 20);

        // Izvršavanje poziva
        cstmt.execute();

        // Dobijanje rezultata
        int sum = cstmt.getInt(1);
        System.out.println("Suma: " + sum); // Izlaz: Suma: 30
    }
} catch (SQLException e) {
    e.printStackTrace();
}

Razlike CallableStatement od PreparedStatement:

Osobina PreparedStatement CallableStatement
Namen Izvršavanje parametrizovanih SQL upita Pozivanje skladištenih procedura i funkcija
Sintaksa SQL upit sa ? Dijalektička sintaksa poziva ({ CALL ... })
Izlazni parametri Nema (samo rezultatni skup) Ima (kroz registerOutParameter)
Vraćena vrednost Samo rezultatni skup (executeQuery) Može biti kroz RETURN (kao OUT-parametar), rezultatni skup

Potrebno je proveriti sintaksu poziva skladištenih procedura/funkcija ({ call ... } ili drugi) i podršku JDBC tipova (Types) za konkretnu SGBD.