JavaRush /Kurslar /All lectures for UZ purposes /SQL-server funksiyalarini chaqirish

SQL-server funksiyalarini chaqirish

All lectures for UZ purposes
Daraja, Dars
Mavjud

CallableStatement

JDBC’da yanada murakkab senariylar uchun yana bir interfeys bor. U PreparedStatement dan meros qilib olingan va CallableStatement deb nomlanadi.

U bazadagi saqlangan protseduralarni chaqirish uchun ishlatiladi. Bunday chaqirishning xususiyati shundaki, saqlangan protsedura ResultSet dan tashqari yana parametrlarni ham qabul qilishi mumkin.

Bu yerda nima yangilik, deb so'rashing mumkin? PreparedStatement ham ResultSet bilan ishlaydi va unga ham parametrlar yuborish mumkin. Ha, to'g'ri, lekin saqlangan protseduralarning xususiyati shundaki, ular parametrlar orqali faqat qabul qilish emas, ma’lumotlarni qaytarishi ham mumkin.

Saqlangan protsedura IN, OUT va INOUT parametrlari bilan chaqiriladi. U bitta yoki bir nechta ResultSet ob'ektlarini qaytaradi. CallableStatement ob'ektini yaratish uchun Connection.prepareCall() metodi mo'ljallangan.

Misol uchun, ADD deb nomlangan saqlangan prosedurangiz bor deb tasavvur qiling, bu prosedura a, b va c parametrlarini qabul qiladi. Bu prosedura a va b ni yig'adi va natijani c o'zgaruvchisiga qo'yadi.

Kod yozaylik va uni chaqirib ko'raylik:


 	// Serverga ulanish
 	Connection connection = DriverManager.getConnection("jdbc:as400://mySystem");
 
 	// CallableStatement ob'ektini yaratish. U saqlangan protsedurani chaqirishga
 	// oldindan tayyorgarlik ko'radi. Savol belgilari
 	// kiruvchi parametrlar qayerga, chiqish parametrlar qayerga joylashtirilishi
 	// kerakligini ko'rsatadi. Birinchi ikkita parametr kirish parametrlari,
 	// uchinchi esa chiqish parametri bo'ladi.
 	CallableStatement statement = connection.prepareCall("CALL MYLIBRARY.ADD (?, ?, ?)");
 
 	// Kirish parametrlari sozlanmoqda. Protseduraga 123 va 234 beramiz
 	statement.setInt (1, 123);
 	statement.setInt (2, 234);
 
 	// Chiqish parametri turini ro'yxatdan o'tkazish
 	statement.registerOutParameter (3, Types.INTEGER);
 
 	// Saqlangan protsedurani ishga tushirish
 	statement.execute();
 
 	// Chiqish parametri qiymatini olish
 	int sum = statement.getInt(3);
 
 	// CallableStatement va Connection ni yopish
 	statement.close();
 	connection.close();

Bu PreparedStatement bilan deyarli bir xil ishlaydi, faqat bir oz farq bor. Bizning ADD funksiyamiz uchinchi parametrda yig'ish natijasini qaytaradi. Ammo CallableStatement ob'ekti bu haqda bilmaydi. Shuning uchun biz registerOutParameter() metodini chaqirib, unga bu haqda aniq aytib o'tamiz:


registerOutParameter(parametrRaqami, parametrTuri)

Shundan so'ng execute() metodi orqali protsedurani chaqirish va keyin getInt() metodi yordamida uchinchi parametrdan ma'lumotlarni o'qish mumkin.

Batch so'rovlari

Haqiqiy loyihalarda ko'pincha juda ko'p bir xil turdagi so'rovlar qilish kerak bo'lgan vaziyatlar yuzaga keladi (bu holatda eng ko'p uchraydigan PreparedStatement), masalan, bir necha o'nlab yoki yuzlab yozuvlarni kiritish kerak.

Agar har bir so'rovni alohida bajaradigan bo'lsangiz, bu juda ko'p vaqt talab qiladi va dastur ishlashini pasaytiradi. Shunday qilish mumkin emasligi uchun batch-rejimdan foydalanish mumkin. Uning ma'nosi shundaki, siz o'z so'rovlari bilan biror buferi to'playsiz va keyin ularni bir vaqtning o'zida bajarasan.

Misol sifatida quyidagi kod parchasini keltiraman:


PreparedStatement stmt = con.prepareStatement(
        	"INSERT INTO jc_contact (first_name, last_name, phone, email) VALUES (?, ?, ?, ?)");
 
for (int i = 0; i < 10; i++) {
	// So'rov parametrlarini to'ldiramiz
	stmt.setString(1, "FirstName_" + i);
    stmt.setString(2, "LastNAme_" + i);
    stmt.setString(3, "phone_" + i);
    stmt.setString(4, "email_" + i);
	// So'rov bajarilmaydi, balki buferga qo'yiladi,
	//  keyin barcha buyruqlar uchun bir vaqtning o'zida bajariladi
	stmt.addBatch();
}
// Barcha so'rovlarni birdan bajarish
int[] results = stmt.executeBatch();

execute() metodi orqali so'rovni bajarish o'rniga, biz uni addBatch() metodi yordamida paketga qo'yamiz.

Keyin esa, bir necha yuz so'rov to'plangandan so'ng, ular birvaqtning o'zida serverga yuborilishi mumkin, executeBatch() buyruqni chaqirish bilan.

Foydali. executeBatch() metodi int[] - butun sonlar massivi qaytaradi. Bu massivning har bir hujayrasida mos so'rov o'zgartirgan qatorlar sonini belgilaydigan son mavjud. Agar batch'dagi 3-raqamli so'rov 5 qatorni o'zgartirsa, unda massivning 3-hujayrasi 5 raqamini o'z ichiga oladi.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION