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:
- Ulanishni olish:
Connectionobyekti ishlatiladi.// Ulanishni olish misoli (drayver va konfiguratsiyaga bog'liq) Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydatabase", "user", "password"); CallableStatementyaratish: SQL chaqiruviniprepareCall()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(?, ?) }");- Kirish parametrlarini o'rnatish: Agar protsedura parametrlarni qabul qilsa, ularni
setXxx()metodlari bilan o'rnatasiz, bu yerdaXxxma'lumotlar turiga mos keladi (masalan,setString,setInt).// Kirish parametrlarini o'rnatish cstmtWithParams.setString(1, "value1"); cstmtWithParams.setInt(2, 123); - 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 - 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(); - Natijalarni qayta ishlash: Agar protsedura natijaviy to'plamni qaytaradigan bo'lsa, uni oddiy
ResultSetsifatida qayta ishlash mumkin. Agar chiqish parametrlari bo'lsa, ularning qiymatlarigetXxx()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(); */ - Resurslarni yopish:
CallableStatementvaConnectionyopilishi muhim.try-with-resourcesblokidan 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 |