오라클의 프로시저(Procedure)와 함수(Function)는 PL/SQL에서 자주 사용되는 두 가지 중요한 개념입니다. 이 둘은 많은 부분에서 유사하지만, 각기 다른 목적과 사용 사례가 존재합니다. 이 글에서는 오라클의 프로시저와 함수의 차이점을 설명하고, 문법과 사용 예시를 통해 각 개념을 자세히 설명하겠습니다. 이를 통해 언제 어떤 상황에서 프로시저와 함수를 사용하는 것이 적절한지에 대해 명확한 이해를 제공하겠습니다.
1. 프로시저(Procedure)란?
프로시저(Procedure)는 오라클에서 일련의 작업을 수행하는 이름이 지정된 PL/SQL 코드 블록입니다. 프로시저는 특정 작업을 수행하기 위해 설계되었으며, 결과 값을 반환하지 않는 경우가 많습니다. 일반적으로 데이터베이스의 상태를 변경하거나, 특정 비즈니스 로직을 수행할 때 사용됩니다. 예를 들어, 데이터를 업데이트하거나, 대량의 작업을 처리할 때 프로시저를 사용할 수 있습니다.
이를 실생활에 비유하자면, 예를 들어 쇼핑몰에서 신발을 구매하는 절차를 생각해 볼 수 있습니다:
- 쇼핑몰 로그인
- 원하는 신발 선택
- 배송지 입력
- 결제
이와 같은 단계들이 프로시저의 일련의 작업과 비슷합니다. 프로시저는 데이터베이스에서 여러 단계의 작업을 처리하는 데 사용됩니다.
프로시저 문법:
CREATE OR REPLACE PROCEDURE 프로시저_이름
(매개변수1 [IN | OUT | INOUT] 데이터타입,
매개변수2 [IN | OUT | INOUT] 데이터타입, ...)
IS
-- 선언부
BEGIN
-- 실행부
EXCEPTION
-- 예외 처리 (선택 사항)
END 프로시저_이름;
IN
,OUT
,INOUT
은 매개변수의 방향을 나타내며,IN
은 입력,OUT
은 출력,INOUT
은 입력과 출력을 동시에 할 수 있는 매개변수를 의미합니다.BEGIN
블록 안에 실제 실행될 코드가 포함됩니다.EXCEPTION
블록은 예외가 발생했을 때 처리하는 부분으로, 선택 사항입니다.
프로시저 예시:
CREATE OR REPLACE PROCEDURE update_sal(v_empno IN NUMBER)
IS
BEGIN
UPDATE emp
SET sal = sal * 1.1
WHERE empno = v_empno;
END update_sal;
이 예시는 update_sal
이라는 프로시저가 사원 번호를 입력받아 해당 사원의 급여를 10% 인상하는 로직을 구현한 것입니다. 이처럼 프로시저는 결과 값을 반환할 필요 없이 데이터베이스의 상태를 변경하는 작업에 주로 사용됩니다.
2. 함수(Function)란?
함수(Function)는 프로시저와 유사하지만 반드시 값을 반환해야 한다는 차이점이 있습니다. 함수는 입력 값을 받아서 계산이나 데이터 처리를 수행한 후, 그 결과 값을 반환하는 역할을 합니다. 함수는 계산, 데이터 변환 또는 결과 값을 필요로 하는 작업에 적합합니다.
예를 들어, 쇼핑몰에서 아이디와 비밀번호를 체크하는 기능을 함수로 생각할 수 있습니다.
함수 문법:
CREATE OR REPLACE FUNCTION 함수_이름
(매개변수1 데이터타입, 매개변수2 데이터타입, ...)
RETURN 반환할_데이터타입
IS
-- 선언부
BEGIN
-- 실행부
RETURN 반환값;
EXCEPTION
-- 예외 처리 (선택 사항)
END 함수_이름;
- 함수는 반드시 반환할 데이터 타입을 명시하고,
RETURN
키워드를 사용하여 반환할 값을 지정해야 합니다. - 함수는 주로 입력 값을 받아 처리하고, 그 결과를 반환하는 데 사용됩니다.
함수 예시:
CREATE OR REPLACE FUNCTION testDate(date DATE)
RETURN VARCHAR2
IS
changeDate VARCHAR2(20);
BEGIN
changeDate := TO_CHAR(date, 'YYYY-MM-DD');
RETURN changeDate;
END testDate;
이 예시는 testDate
라는 함수가 입력된 날짜를 받아 YYYY-MM-DD
형식으로 변환한 후, 문자열로 반환하는 함수입니다.
3. 프로시저와 함수의 주요 차이점
프로시저와 함수는 구조적으로 유사하지만, 그 목적과 사용 방식에서 차이점이 있습니다.
3.1 반환값의 유무:
- 프로시저: 주로 특정 작업을 수행하지만 반드시 값을 반환할 필요는 없습니다. 만약 값을 반환해야 한다면,
OUT
또는INOUT
매개변수를 사용할 수 있습니다. - 함수: 반드시 값을 반환해야 합니다. 함수는 주로 계산이나 데이터를 변환하여 결과 값을 반환하는 데 사용됩니다.
3.2 SQL 문에서의 사용 가능 여부:
- 함수: SQL 문장에서 사용할 수 있습니다. 예를 들어
SELECT
,INSERT
,UPDATE
,DELETE
문에서 호출하여 사용할 수 있습니다.sql코드 복사SELECT testDate(SYSDATE) FROM dual;
이 쿼리는testDate
함수를 호출하여 시스템 날짜를YYYY-MM-DD
형식으로 변환한 값을 반환합니다. - 프로시저: SQL 문장에서 직접 사용할 수 없으며, PL/SQL 블록에서 호출하여 사용해야 합니다.
3.3 PL/SQL 블록에서의 호출 방식:
- 프로시저:
EXEC
또는 PL/SQL 블록을 통해 호출됩니다.sql코드 복사BEGIN update_sal(101); END;
- 함수: SQL 문이나 PL/SQL 블록 내에서 호출될 수 있습니다.sql코드 복사
SELECT testDate(SYSDATE) FROM dual;
3.4 DML 문장 사용:
- 프로시저: 프로시저는
INSERT
,UPDATE
,DELETE
와 같은 DML 문을 자유롭게 사용할 수 있으며, 데이터베이스의 상태를 변경하는 작업에 주로 사용됩니다. - 함수: 함수도 DML 문을 사용할 수 있지만, SQL 문에서 호출되는 경우 DML 문을 사용하지 않도록 주의해야 합니다. SQL 문 내에서 DML 작업을 하는 함수는 불가능합니다.
4. 프로시저 사용의 장점
프로시저는 여러 단계의 작업을 순차적으로 실행하거나 복잡한 비즈니스 로직을 처리하는 데 적합합니다. 예를 들어:
- 데이터를 일괄적으로 처리하는 경우
- 여러 테이블에 걸쳐 비즈니스 규칙을 적용하는 경우
- 데이터베이스 내에서 복잡한 작업을 단일 호출로 처리하는 경우
복잡한 작업을 처리하는 프로시저 예시:
CREATE OR REPLACE PROCEDURE process_order(p_order_id IN NUMBER)
IS
BEGIN
-- Step 1: 주문 유효성 검사
VALIDATE_ORDER(p_order_id);
-- Step 2: 주문 상태 업데이트
UPDATE orders SET status = 'Processed' WHERE order_id = p_order_id;
-- Step 3: 결제 처리
PROCESS_PAYMENT(p_order_id);
COMMIT;
END process_order;
이 예시는 여러 단계를 하나의 프로시저로 묶어 주문 처리 작업을 수행하는 예시입니다.
5. 함수 사용의 장점
함수는 주로 데이터를 계산하거나 변환하고, 그 결과 값을 반환하는 데 사용됩니다. 함수는 SQL 문에서 직접 사용할 수 있기 때문에, 데이터를 조회하거나 변환할 때 매우 유용합니다.
계산을 수행하는 함수 예시:
CREATE OR REPLACE FUNCTION calc_discount(p_price NUMBER, p_discount_rate NUMBER)
RETURN NUMBER
IS
BEGIN
RETURN p_price - (p_price * p_discount_rate / 100);
END calc_discount;
이 함수는 가격과 할인율을 입력받아 할인된 가격을 반환하는 역할을 합니다.
6. 프로시저와 함수의 공통점
- 둘 다 재사용 가능한 코드 블록으로, PL/SQL에서 매우 중요한 역할을 합니다.
- 둘 다 매개변수를 받아 처리할 수 있으며, 결과 값을 반환할 수도 있습니다.
- 선언부, 실행부, 예외 처리부로 구성되며, 예외 처리 기능도 포함할 수 있습니다.
7. 결론 및 사용 가이드라인
프로시저는 데이터베이스 상태를 변경하는 작업에, 함수는 계산 또는 변환 작업에 적합합니다. 각 작업에 맞는 구조를 선택하여 데이터베이스 작업을 더 효율적이고 간결하게 만들 수 있습니다.
프로시저와 함수의 차이점을 이해하고, 각 상황에 맞는 도구를 선택함으로써 오라클 데이터베이스에서 보다 성능이 뛰어나고 유지보수가 용이한 코드를 작성할 수 있습니다.