Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

JDBC CallableStatement로 데이터베이스 함수 호출하기 – 예제로 쉽게 이해하기

프로시저(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() 메서드로 읽어 오는 것입니다.