Middle
176
Hogyan hívhatunk meg egy tárolt eljárást Java-ban?
Válasz az MI-től
sobes.tech MI
Java-ban a tárolt eljárás hívásához a java.sql csomagból származó CallableStatement használatos.
Fő lépések:
- Kapcsolat megszerzése: A
Connectionobjektumot használjuk.// Kapcsolat megszerzésének példája (a driver és konfiguráció függvénye) Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydatabase", "user", "password"); CallableStatementlétrehozása: A tárolt eljárás hívását aprepareCall()konstruktorba adjuk. A szintaxis az adatbázistól függ, de gyakran{ call procedure_name(?, ?, ...) }alakú.// Paraméter nélküli eljárás hívása CallableStatement cstmt = conn.prepareCall("{ call my_procedure() }"); // Paraméterekkel rendelkező hívás CallableStatement cstmtWithParams = conn.prepareCall("{ call my_procedure_with_params(?, ?) }");- Bemeneti paraméterek beállítása: Ha az eljárás fogad paramétereket, azokat a
setXxx()metódusokkal kell beállítani, ahol azXxxaz adat típusának felel meg.// Bemeneti paraméterek beállítása cstmtWithParams.setString(1, "value1"); cstmtWithParams.setInt(2, 123); - Kimeneti paraméterek regisztrálása (ha vannak): Ha az eljárás értékeket ad vissza kimeneti paramétereken keresztül, azokat a
registerOutParameter()segítségével kell regisztrálni, megadva a paraméter indexét és a JDBC adat típusát.// Kimeneti paraméterrel rendelkező eljárás CallableStatement cstmtWithOut = conn.prepareCall("{ call my_procedure_with_out(?) }"); cstmtWithOut.registerOutParameter(1, Types.VARCHAR); // Például VARCHAR - Lekérdezés végrehajtása: A
execute()metódus használata. Ha az eljárás eredményhalmazt ad vissza, akkor aexecuteQuery()is használható.// Eljárás végrehajtása cstmt.execute(); // Olyan eljárásokhoz, amelyek nem adnak eredményhalmazt // Olyan eljárás végrehajtása, amely eredményhalmazt ad vissza // CallableStatement cstmtWithResultSet = conn.prepareCall("{ call get_data() }"); // ResultSet rs = cstmtWithResultSet.executeQuery(); - Eredmények feldolgozása: Ha az eljárás eredményhalmazt ad vissza, azt normál
ResultSet-ként lehet feldolgozni. Ha kimeneti paraméterek vannak, azok értékei agetXxx()metódusokkal nyerhetők ki.// Kimeneti paraméter feldolgozása String result = cstmtWithOut.getString(1); // Eredményhalmaz feldolgozása /* while (rs.next()) { // Adatok olvasása az eredményhalmazból } rs.close(); */ - Erőforrások bezárása: Fontos a
CallableStatementés aConnectionbezárása. Ajánlott atry-with-resourcesblokk használata.// Erőforrások bezárása try-with-resources-szel try (Connection conn = DriverManager.getConnection("...", "...", "...")) { try (CallableStatement cstmt = conn.prepareCall("{ call my_procedure(?) }")) { cstmt.setString(1, "test"); cstmt.execute(); // Eredmények feldolgozása } } catch (SQLException e) { e.printStackTrace(); }
Példa egy bemeneti paramétert és visszatérő értéket tartalmazó eljárás hívására (a RETURN segítségével, nem OUT-paraméter, jellemző PostgreSQL/MySQL esetén):
// Az adatbázisban lévő eljárás: 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")) {
// Függvény hívása szintaxissal { ? = call function_name(?, ?) }
try (CallableStatement cstmt = conn.prepareCall("{ ? = call add_numbers(?, ?) }")) {
// Kimeneti érték regisztrálása
cstmt.registerOutParameter(1, Types.INTEGER);
// Bemeneti paraméterek beállítása
cstmt.setInt(2, 10);
cstmt.setInt(3, 20);
// Hívás végrehajtása
cstmt.execute();
// Eredmény lekérése
int sum = cstmt.getInt(1);
System.out.println("Összeg: " + sum); // Kimenet: Összeg: 30
}
} catch (SQLException e) {
e.printStackTrace();
}
A CallableStatement és a PreparedStatement közötti különbség:
| Jellemző | PreparedStatement |
CallableStatement |
|---|---|---|
| Cél | Parametrizált SQL lekérdezések végrehajtása | Tárolt eljárások és függvények hívása |
| Szintaxis | SQL lekérdezés ?-el |
Dialektus-specifikus hívási szintaxis ({ CALL ... }) |
| Kimeneti paraméterek | Nincs (csak eredményhalmaz) | Van (registerOutParameter()) |
| Visszatérő érték | Csak eredményhalmaz (executeQuery) |
Lehet RETURN-nel (mint OUT-paraméter), eredményhalmaz |
Fontos ellenőrizni a tárolt eljárások/függvények hívási szintaxisát ({ call ... } vagy más) és a JDBC típusok (Types) támogatását az adott adatbázisban.