CodeGym /Java tanfolyam /All lectures for HU purposes /SQL Server Functions hívása

SQL Server Functions hívása

All lectures for HU purposes
Szint , Lecke
Elérhető

CallableStatement

A JDBC-nek van egy másik felülete a még bonyolultabb forgatókönyvekhez. A PreparedStatementből öröklődik , és CallableStatement néven hívják .

Az adatbázisban tárolt eljárások meghívására (hívásra) szolgál. Az ilyen hívás sajátossága, hogy a ResultSet eredmény mellett paraméterek is átadhatók egy ilyen tárolt eljárásnak.

Mi az új, kérdezed? A PreparedStatementnek ResultSet eredménye is van , és paramétereket is átadhat neki. Igen, ez így van, de a tárolt eljárások sajátossága, hogy a paramétereken keresztül nem csak fogadni, hanem visszaadni is tudnak adatokat.

A tárolt eljárást IN , OUT és INOUT paraméterekkel hívják meg . Egy vagy több ResultSet objektumot ad vissza . A Connection.prepareCall() metódus egy CallableStatement objektum létrehozására szolgál .

Képzelje el, hogy van egy tárolt ADD eljárása, amely elfogadja az a, b és c paramétereket. Ez az eljárás összeadja a-t és b-t, és az összeadás eredményét a c változóba helyezi.

Írjuk be a kódot, ahol megpróbáljuk hívni:

// 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();

A munka majdnem olyan, mint a PreparedStatementnél , csak van egy árnyalat. Az ADD függvényünk az összeadás eredményét adja vissza a harmadik paraméterben. Csak a CallableStatement objektum nem tud erről semmit. Ezért ezt kifejezetten elmondjuk neki a registerOutParameter() metódus meghívásával :

registerOutParameter(parameter number, Parameter type)

Ezt követően meghívhatja az eljárást az execute() metóduson keresztül , majd a harmadik paraméter adatait a getInt() metódussal olvashatja ki .

Kötegelési kérelmek

Valós projektekben gyakran adódik olyan helyzet, amikor sok azonos típusú lekérdezést kell végrehajtani (a leggyakoribb ebben az esetben a PreparedStatement ), például több tíz vagy száz rekordot kell beszúrni.

Ha minden kérést külön hajt végre, az sok időt vesz igénybe, és csökkenti az alkalmazás teljesítményét. Ennek elkerülésére használhatja a kötegelt beszúrási módot. Ez abban rejlik, hogy felhalmoz egy puffert a kéréseihez, majd azonnal végrehajtja azokat.

Íme egy kódrészlet példaként:

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();

A lekérdezés végrehajtása helyett az execute() metódussal, az addBatch() metódussal kötegeljük .

És akkor, ha több száz kérés van, az executeBatch() parancs meghívásával egyszerre elküldheti őket a szervernek .

Egészséges. Az executeBatch() metódus egész számokból álló tömböt ad vissza – int[]. A tömb minden cellája tartalmaz egy számot, amely a megfelelő lekérdezés által módosított sorok számát jelzi. Ha a köteg 3-as számú kérése 5 sort változtatott, akkor a tömb 3. cellája az 5-ös számot fogja tartalmazni.

Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION