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:
- 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"); - Kreiranje
CallableStatement: SQL poziv čuvane procedure se prosleđuje u konstruktorprepareCall(). 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(?, ?) }"); - Postavljanje ulaznih parametara: Ako procedura prima parametre, oni se postavljaju pomoću metoda
setXxx(), gdeXxxodgovara tipu podataka (npr.setString,setInt).// Postavljanje ulaznih parametara cstmtWithParams.setString(1, "value1"); cstmtWithParams.setInt(2, 123); - 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 - Izvršavanje zahteva: Koristi se metoda
execute(). Ako procedura vraća rezultatski skup, može se koristitiexecuteQuery().// 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(); - 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 metodamagetXxx().// Obrada izlaznog parametra String result = cstmtWithOut.getString(1); // Obrada rezultatskog skupa /* while (rs.next()) { // Čitanje podataka iz rezultatskog skupa } rs.close(); */ - Zatvaranje resursa: Važno je zatvoriti
CallableStatementiConnection. Bolje je koristiti bloktry-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.