프로시저(Stored Procedure)와 마찬가지로 데이터베이스에 함수(Function)를 생성하고 저장해 둘 수 있습니다. 저장된 함수는 필요할 때마다 호출하여 재사용할 수 있어 코드 중복을 줄이고 유지보수성을 높여 줍니다. 함수는 반드시 값을 반환한다는 점에서 프로시저와 차별화됩니다.
함수 생성 문법
다음은 MySQL 데이터베이스에서 함수를 생성하는 기본 문법입니다:
CREATE FUNCTION Function_Name(input_arguments) RETURNS output_parameter
BEGIN
declare variables;
statements . . . . . . . . . .
return data_type;
END예제 테이블 소개
데이터베이스에 다음과 같은 내용을 가진 Emp 테이블이 있다고 가정해 보겠습니다:
+--------+------------+----------------+ | Name | DOB | Location | +--------+------------+----------------+ | Amit | 1970-01-08 | Hyderabad | | Sumith | 1970-01-08 | Vishakhapatnam | | Sudha | 1970-01-05 | Vijayawada | +--------+------------+----------------+
아래는 실제 함수를 생성하는 예제입니다. 여기서는 직원 이름을 입력받아 해당 직원의 DOB(생년월일) 컬럼 값을 조회한 뒤 반환하는 getDob() 함수를 만듭니다.
CREATE FUNCTION getDob(emp_name VARCHAR(50)) RETURNS DATE BEGIN declare dateOfBirth DATE; select DOB into dateOfBirth from EMP where Name = emp_name; return dateOfBirth; END
JDBC를 사용한 함수 호출 방법
저장 프로시저와 마찬가지로 CallableStatement 객체를 사용하면 데이터베이스 함수도 호출할 수 있습니다. JDBC 프로그램에서 함수를 호출하려면 다음 단계를 따릅니다:
데이터베이스에 연결합니다.
prepareCall()메서드로 CallableStatement 객체를 생성하고, 함수 호출문을 문자열 형태로 전달합니다.플레이스홀더(?)에 값을 설정합니다.
CallableStatement를 실행합니다.
JDBC에서 함수를 호출하는 쿼리는 다음과 같습니다:
{? = call getDob(?)}위 쿼리에는 PreparedStatement나 CallableStatement처럼 플레이스홀더(?)가 포함되어 있습니다. 첫 번째 플레이스홀더는 함수의 반환값을 나타내고, 두 번째 플레이스홀더는 입력 매개변수를 나타냅니다.
반환값을 담는 플레이스홀더는 CallableStatement 인터페이스의 registerOutParameter() 메서드를 사용해 출력 파라미터로 등록해야 합니다. 이 메서드에는 플레이스홀더의 위치를 나타내는 정숫값과 해당 파라미터의 SQL 타입을 나타내는 정숫값을 전달합니다.
cstmt.registerOutParameter(1, Types.DATE);
그다음 setString() 메서드로 입력 매개변수에 값을 설정합니다. getDob() 함수가 VARCHAR 타입의 값을 받기 때문입니다.
전체 예제 코드
다음 JDBC 프로그램은 getDob 함수를 실행하고 그 결과를 조회합니다:
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Types;
public class CallingFunctionsUsingCallable2 {
public static void main(String args[]) throws SQLException {
// 드라이버 등록
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
// 데이터베이스 연결
String mysqlUrl = "jdbc:mysql://localhost/sampleDB";
Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
System.out.println("Connection established......");
// CallableStatement 준비
CallableStatement cstmt = con.prepareCall("{? = call getDob(?)}");
cstmt.registerOutParameter(1, Types.DATE);
cstmt.setString(2, "Amit");
cstmt.execute();
System.out.print("Date of birth: " + cstmt.getDate(1));
}
}실행 결과
Connection established...... Date of birth: 1970-01-08
이처럼 CallableStatement를 활용하면 저장 함수의 반환값을 손쉽게 처리할 수 있습니다. 핵심은 반환값 위치의 플레이스홀더를 반드시 registerOutParameter()로 등록한 후, 실행 결과를 getXxx() 메서드로 읽어 오는 것입니다.