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

  1. Kapcsolat megszerzése: A Connection objektumot 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");
    
  2. CallableStatement létrehozása: A tárolt eljárás hívását a prepareCall() 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(?, ?) }");
    
  3. 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 az Xxx az adat típusának felel meg.
    // Bemeneti paraméterek beállítása
    cstmtWithParams.setString(1, "value1");
    cstmtWithParams.setInt(2, 123);
    
  4. 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
    
  5. Lekérdezés végrehajtása: A execute() metódus használata. Ha az eljárás eredményhalmazt ad vissza, akkor a executeQuery() 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();
    
  6. 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 a getXxx() 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();
    */
    
  7. Erőforrások bezárása: Fontos a CallableStatement és a Connection bezárása. Ajánlott a try-with-resources blokk 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.