CallableStatement
JDBC์๋ ํจ์ฌ ๋ ๋ณต์กํ ์๋๋ฆฌ์ค๋ฅผ ์ํ ๋ ๋ค๋ฅธ ์ธํฐํ์ด์ค๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ PreparedStatement ์์ ์์๋๋ฉฐ CallableStatement ๋ผ๊ณ ํฉ๋๋ค .
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ ํ๋ก์์ ๋ฅผ ํธ์ถ(ํธ์ถ)ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฌํ ํธ์ถ์ ํน์ง์ ResultSet ๊ฒฐ๊ณผ ์ธ์๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ด๋ฌํ ์ ์ฅ ํ๋ก์์ ์ ์ ๋ฌํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์๋ก์ด ๊ฒ์ด ๋ฌด์์ ๋๊น? PreparedStatement ์๋ ResultSet ๊ฒฐ๊ณผ ๋ ์์ผ๋ฉฐ ์ฌ๊ธฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ ์๋ ์์ต๋๋ค. ์, ๋ง์ต๋๋ค. ํ์ง๋ง ์ ์ฅ ํ๋ก์์ ์ ํน์ง์ ๋งค๊ฐ ๋ณ์๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์์ ๋ฟ๋ง ์๋๋ผ ๋ฐํํ ์๋ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ ์ฅ ํ๋ก์์ ๋ IN , OUT ๋ฐ INOUT ๋งค๊ฐ๋ณ์ ๋ก ํธ์ถ๋ฉ๋๋ค . ํ๋ ์ด์์ ResultSet ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค . Connection.prepareCall() ๋ฉ์๋๋ CallableStatement ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค .
์ฌ๊ธฐ์์ ๋งค๊ฐ๋ณ์ a, b ๋ฐ c๋ฅผ ํ์ฉํ๋ ์ ์ฅ ํ๋ก์์ ADD๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด ์ ์ฐจ๋ a์ b๋ฅผ ๋ํ๊ณ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ c์ ๋ฐฐ์นํฉ๋๋ค.
ํธ์ถ์ ์๋ํ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
// 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)
๊ทธ๋ฐ ๋ค์ execute() ๋ฉ์๋๋ฅผ ํตํด ํ๋ก์์ ๋ฅผ ํธ์ถํ ๋ค์ getInt() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ธ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค .
์ผ๊ด ์ฒ๋ฆฌ ์์ฒญ
์ค์ ํ๋ก์ ํธ์์๋ ๋์ผํ ์ ํ์ ์ฟผ๋ฆฌ๋ฅผ ๋ง์ด ๋ง๋ค์ด์ผ ํ๋ ์ํฉ์ด ์์ฃผ ๋ฐ์ํฉ๋๋ค(์ด ๊ฒฝ์ฐ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฟผ๋ฆฌ๋ PreparedStatement ). ์๋ฅผ ๋ค์ด ์์ญ ๋๋ ์๋ฐฑ ๊ฐ์ ๋ ์ฝ๋๋ฅผ ์ฝ์ ํด์ผ ํฉ๋๋ค.
๊ฐ ์์ฒญ์ ๊ฐ๋ณ์ ์ผ๋ก ์คํํ๋ฉด ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ด ์ ํ๋ฉ๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ผ๊ด ์ฝ์ ๋ชจ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์์ฒญ๊ณผ ํจ๊ป ์ผ๋ถ ๋ฒํผ๋ฅผ ์ถ์ ํ ๋ค์ ์ฆ์ ์คํํ๋ค๋ ์ฌ์ค์ ์์ต๋๋ค.
๋ค์์ ์์ ์ฝ๋์ ๋๋ค.
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๊ฐ โโํ์ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ ๋ฐฐ์ด์ ์ธ ๋ฒ์งธ ์ ์๋ ์ซ์ 5๊ฐ ํฌํจ๋ฉ๋๋ค.
GO TO FULL VERSION