CodeGym/Java курс/All lectures for BG purposes/Извикване на функции на SQL Server

Извикване на функции на SQL Server

На разположение

CallableStatement

JDBC има друг интерфейс за още по-сложни сценарии. Той наследява от PreparedStatement и се нарича CallableStatement .

Използва се за извикване (Call) на съхранени proceduresи в базата данни. Особеността на такова извикване е, че в допълнение към резултата ResultSet могат да се предават и параметри на такава запаметена proceduresа.

Какво ново, ще попитате? PreparedStatement също има резултат ResultSet и можете също да подадете параметри към него. Да, така е, но особеността на съхранените proceduresи е, че чрез параметри те могат не само да получават, но и да връщат данни.

Съхранената proceduresа се извиква с параметри IN , OUT и INOUT . Той връща един or повече ResultSet обекти . Методът Connection.prepareCall() се използва за създаване на обект CallableStatement .

Тук си представете, че имате запаметена proceduresа ADD, която приема параметри a, b и c. Тази proceduresа събира a и b и поставя резултата от събирането в променливата c.

Нека напишем codeа, където ще се опитаме да го извикаме:

// Connect to the server
Connection connection = DriverManager.getConnection("jdbc:as400://mySystem");

// Create a CallableStatement object. It does preprocessing
// calling a stored procedure. Question marks
// indicate where the input parameters should be substituted, and where the output ones
// The first two parameters are input,
// and the third one is a day off.
CallableStatement statement = connection.prepareCall("CALL MYLIBRARY.ADD (?, ?, ?)");

// Setting up input parameters. Passing 123 and 234 to the procedure
statement.setInt (1, 123);
statement.setInt (2, 234);

// Registering the output parameter type
statement.registerOutParameter (3, Types.INTEGER);

// Run stored procedure
statement.execute();

// Get the value of the output parameter
int sum = statement.getInt(3);

// Close CallableStatement and Connection
statement.close();
connection.close();

Работата е почти като с PreparedStatement , само че има нюанс. Нашата функция ADD връща резултата от събирането в третия параметър. Само обектът CallableStatement не знае нищо за това. Следователно, ние му казваме това изрично, като извикваме метода registerOutParameter() :

registerOutParameter(parameter number, Parameter type)

След това можете да извикате proceduresата чрез метода execute() и след това да прочетете данните от третия параметър с помощта на метода getInt() .

Пакетиране на заявки

В реални проекти често възниква ситуация, когато трябва да направите много от същия тип заявки (най-често срещаният в този случай е PreparedStatement ), например, трябва да вмъкнете няколко десетки or стотици записи.

Ако изпълните всяка заявка поотделно, това ще отнеме много време и ще намали производителността на приложението. За да предотвратите това, можете да използвате режима на партидно вмъкване. Той се крие във факта, че натрупвате няHowъв буфер с вашите заявки и след това ги изпълнявате незабавно.

Ето част от codeа като пример:

PreparedStatement stmt = con.prepareStatement(
        	"INSERT INTO jc_contact (first_name, last_name, phone, email) VALUES (?, ?, ?, ?)");

for (int i = 0; i < 10; i++) {
	// Fill in the request parameters
	stmt.setString(1, "FirstName_" + i);
    stmt.setString(2, "LastNAme_" + i);
    stmt.setString(3, "phone_" + i);
    stmt.setString(4, "email_" + i);
	// The request is not executed, but fits into the buffer,
	// which is then executed immediately for all commands
	stmt.addBatch();
}
// Execute all requests at once
int[] results = stmt.executeBatch();

Вместо да изпълним заявката с метода execute() , ние я пакетираме с метода addBatch() .

И тогава, когато има няколкостотин заявки, можете да ги изпратите наведнъж към сървъра, като извикате командата executeBatch() .

Здрави. Методът executeBatch() връща масив от цели числа — int[]. Всяка клетка в този масив съдържа число, което показва броя на редовете, модифицирани от съответната заявка. Ако заявка номер 3 в партида промени 5 реда, тогава 3-та клетка от масива ще съдържа числото 5.

Коментари
  • Популярен
  • Нов
  • Стар
Трябва да сте влезли, за да оставите коментар
Тази страница все още няма коментари