Sobes.tech
Middle
179

Java'da saqlangan protsedurani qanday chaqirish mumkin?

AIdan javob

sobes.tech AI

Java-da saqlangan protsedurani chaqirish uchun java.sql paketidan CallableStatement ishlatiladi.

Asosiy bosqichlar:

  1. Ulanishni olish: Connection obyekti ishlatiladi.
    // Ulanishni olish misoli (drayver va konfiguratsiyaga bog'liq)
    Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydatabase", "user", "password");
    
  2. CallableStatement yaratish: SQL chaqiruvini prepareCall() konstruktoriga yuborasiz. Sintaksis ma'lumotlar bazasiga qarab o'zgaradi, lekin odatda { call procedure_name(?, ?, ...) } ko'rinishida bo'ladi.
    // Parametrsiz protsedurani chaqirish
    CallableStatement cstmt = conn.prepareCall("{ call my_procedure() }");
    
    // Parametrlar bilan chaqirish
    CallableStatement cstmtWithParams = conn.prepareCall("{ call my_procedure_with_params(?, ?) }");
    
  3. Kirish parametrlarini o'rnatish: Agar protsedura parametrlarni qabul qilsa, ularni setXxx() metodlari bilan o'rnatasiz, bu yerda Xxx ma'lumotlar turiga mos keladi (masalan, setString, setInt).
    // Kirish parametrlarini o'rnatish
    cstmtWithParams.setString(1, "value1");
    cstmtWithParams.setInt(2, 123);
    
  4. Chiqish parametrlarini ro'yxatdan o'tkazish (agar mavjud bo'lsa): Agar protsedura chiqish parametrlar orqali qiymat qaytaradigan bo'lsa, ularni registerOutParameter() yordamida ro'yxatdan o'tkazish kerak, parametr indeksini va JDBC ma'lumotlar turini ko'rsatib.
    // Chiqish parametrli protsedura
    CallableStatement cstmtWithOut = conn.prepareCall("{ call my_procedure_with_out(?) }");
    cstmtWithOut.registerOutParameter(1, Types.VARCHAR); // VARCHAR misol uchun
    
  5. So'rovni bajarish: execute() metodidan foydalaniladi. Agar protsedura natijaviy to'plamni qaytaradigan bo'lsa, executeQuery() ishlatiladi.
    // Protsedurani bajarish
    cstmt.execute(); // Natijaviy to'plam bo'lmagan protseduralar uchun
    
    // Natijaviy to'plam bilan bajarish
    // CallableStatement cstmtWithResultSet = conn.prepareCall("{ call get_data() }");
    // ResultSet rs = cstmtWithResultSet.executeQuery();
    
  6. Natijalarni qayta ishlash: Agar protsedura natijaviy to'plamni qaytaradigan bo'lsa, uni oddiy ResultSet sifatida qayta ishlash mumkin. Agar chiqish parametrlari bo'lsa, ularning qiymatlari getXxx() metodlari yordamida olinadi.
    // Chiqish parametrini qayta ishlash
    String result = cstmtWithOut.getString(1);
    
    // Natijaviy to'plamni qayta ishlash
    /*
    while (rs.next()) {
        // Natijaviy to'plamdan ma'lumotlarni o'qish
    }
    rs.close();
    */
    
  7. Resurslarni yopish: CallableStatement va Connection yopilishi muhim. try-with-resources blokidan foydalanish tavsiya etiladi.
    // Resurslarni yopish uchun try-with-resources
    try (Connection conn = DriverManager.getConnection("...", "...", "...")) {
        try (CallableStatement cstmt = conn.prepareCall("{ call my_procedure(?) }")) {
            cstmt.setString(1, "test");
            cstmt.execute();
            // Natijalarni qayta ishlash
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    

PostgreSQL/MySQL uchun RETURN orqali kirish va qaytarish qiymati bilan protsedura chaqirish misoli:

// Ma'lumotlar bazasidagi protsedura: 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")) {
    // Funktsiyani chaqirish sintaksisi odatda { ? = call function_name(?, ?) } bo'ladi
    try (CallableStatement cstmt = conn.prepareCall("{ ? = call add_numbers(?, ?) }")) {
        // Chiqish qiymatini ro'yxatdan o'tkazish
        cstmt.registerOutParameter(1, Types.INTEGER);
        // Kirish parametrlarini o'rnatish
        cstmt.setInt(2, 10);
        cstmt.setInt(3, 20);

        // Chaqiruvni bajarish
        cstmt.execute();

        // Natijani olish
        int sum = cstmt.getInt(1);
        System.out.println("Yig'indi: " + sum); // Natija: Yig'indi: 30
    }
} catch (SQLException e) {
    e.printStackTrace();
}

CallableStatement va PreparedStatement farqlari:

Xususiyat PreparedStatement CallableStatement
Maqsad Parametrli SQL so'rovlarni bajarish Saqlangan protseduralar va funksiyalarni chaqirish
Sintaksis ? bilan SQL so'rov Dialektga mos chaqirish sintaksisi ({ CALL ... })
Chiqish parametrlar Yo'q (faqat natijaviy to'plam) Bor (registerOutParameter() yordamida)
Qaytariladigan qiymat Faqat natijaviy to'plam (executeQuery) RETURN orqali (OUT parametr sifatida), natijaviy to'plam