최근 데이터 이관 작업을 진행하면서 예외 처리에 대해 Function을 사용하여 효율적으로 트러블 슈팅을 진행했다.
트러블 슈팅 진행 과정에서 한가지 의문점이 생겼다.
Function(함수)과 Procedure(프로시저) 둘 다 비슷한 구조를 가졌지만 어떤 시점에서 어떤 객체를 사용해야지 더 적절한 선택인지에 대한 의문이 생겼다.
그에 따라서 Function과 Procedure의 차이점, 각 장단점, 그리고 적절한 상황 판별에 대해서 써본다.
1. Function과 Procedure의 기본 개념
Function (함수)
- 정의: Function은 특정 작업을 수행한 후 반드시 하나의 값을 반환하는 SQL 객체다.
- 주용도: 주로 값을 계산하거나 데이터를 변환하는데 사용된다. 이를 통해 반환값을 다른 SQL문 또는 PL/SQL 블록에서 재사용이 가능해진다.
- 구조
CREATE OR REPLACE FUNCTION function_name
(parameter_name datatype, ...) RETURN return_datatype IS
BEGIN
-- 로직 작성
RETURN return_value;
END function_name;
Procedure (프로시저)
- 정의: Procedure는 작업을 수행하는 PL/SQL 객체로, 반환값이 없거나(명시적 반환값이 없다는 의미), 출력 매개변수를 통해 결과를 반환할 수 있다.
- 주용도: 프로시저는 데이터 처리, 트랜잭션 관리, 대규모 작업을 처리하는데 적합하다.
- 구조:
CREATE OR REPLACE PROCEDURE procedure_name
(parameter_name datatype, ...) IS
BEGIN
-- 로직 작성
END procedure_name;
2. 함수와 프로시저의 주요 차이점
항목 | Function 함수 | Procedure 프로시저 |
반환값 | 반드시 하나의 값을 반환 (RETUEN) | 반환값이 없거나 OUT 파라미터를 통해 다중값을 반환할 수 있음 |
호출 방식 | SQL문에 호출 가능 (SELECT, WHERE, ORDER BY 등) |
SQL문에서 직접 호출 불가능 (PL/SQL 블록 내에서 호출 가능) |
사용 목적 | 값을 계산하거나 변환하는 목적 | 트랜잭션 처리, 복잡한 로직 수행, 대규모 작업 처리 |
OUT 파라미터 사용 | 지원하지 않음 | 지원 (out 파라미터로 다중 값 반환 가능) |
오버헤드 | 상대적으로 가벼움 | 작업에 따라 오버헤드가 클 수 있음 |
3. 함수의 장점과 단점
장점:
1. SQL 내에서 호출 가능: Function은 SELECT, INSERT, UPDATE, DELETE와 같은 SQL문 내에서 호출할 수 있기 때문에, SQL 쿼리 내에서 데이터를 변환하거나 계산할 때 매우 유용하다.
2. 재사용성: 데이터를 처리하고 그 결과를 반환하는 로직을 Function으로 작성하면 다양한 곳에서 호출하여 동일한 작업을 반복할 수 있다.
단점:
1. 복잡한 로직 처리 한계: Function은 복잡한 트랜잭션 작업보다는 주로 값을 반환하는 단순한 작업에 적합하다. 복잡한 로직이 필요한 경우에는 Procedure를 사용하는 것이 더 나을 수 있다.
2. DML 작업 제한: Function 내에서는 INSERT, UPDATE, DELETE와 같은 DML 작업을 사용할 수 있지만, SQL문 내에서 호출할 경우 제한이 있다. 특히, Function이 DML을 수행하는 경우 SQL문 내에서 호출이 불가능하다.
4. 프로시저의 장점과 단점
장점:
1. 복잡한 로직 처리: Procedure는 복잡한 트랜잭션 작업이나 대규모 데이터 처리를 효과적으로 처리할 수 있다. 여러 개의 OUT 파라미터를 사용하여 다수의 값을 반환할 수 있다.
2. 유연성: Procedure는 다양한 형태의 작업을 처리할 수 있으며, 트랜잭션 관리, 오류 처리, 로깅 등의 기능을 포함할 수 있다.
단점:
1. SQL에서 호출 불가: Procedure는 Function과 달리 SQL문 내에서 직접 호출할 수 없습니다. 반드시 PL/SQL 블록 내에서 호출해야한다.
2. 반환값의 제한: Procedure는 명시적인 반환값이 없으며, OUT 파라미터를 사용하여 결과를 반환할 수 있지만, Function처럼 하나의 값을 바로 반환할 수는 없다.
5. 사용 상황에 따른 선택 방법
Function을 사용하는 상황
- 데이터 변환 또는 계산이 필요한 경우: 예를 들어, 특정 데이터 필드를 계산하거나 형식을 변환해야 할 때 Function을 사용하면 유용
- SQL 문 내에서 호출이 필요한 경우: SELECT, WHERE, ORDER BY 절에서 값을 반환해야 하는 경우 Function이 적합
- 단일 값 반환이 필요한 경우: 특정 작업의 결과로 단일 값을 반환해야 할 때는 Function이 더 적합
Procedure를 사용하는 상황
- 복잡한 비즈니스 로직이 필요한 경우: 여러 가지 데이터를 처리하고, 트랜잭션을 관리하거나, 여러 값이 반환되는 경우 Procedure를 사용하는 것이 적합
- 대규모 데이터 처리 및 트랜잭션 관리가 필요한 경우: Procedure는 여러 단계의 데이터 처리와 트랜잭션 관리를 쉽게 처리 가능
- 출력 값이 다수인 경우: 여러 값을 반환해야 할 때는 OUT 파라미터를 사용하여 Procedure로 처리하는 것이 효율적
6. 결론
Oracle에서 Function과 Procedure는 각각의 장점과 사용 목적이 분명한 두 가지 PL/SQL 객체다.
Function은 값을 반환하거나 변환 작업을 수행하는 데 최적화되어 있고, SQL문 오느내에서 호출할 수 있다는 장점이 있다.
반면, Procedure는 복잡한 로직 처리와 트랜잭션 관리를 할 수 있으며, 다수의 값을 반환할 수 있는 유연성을 제공한다.
따라서 단순한 값 반환이나 SQL문에서의 호출이 필요하다면 Function을, 복잡한 로직 처리나 다양한 값을 반환해야 하는 경우에는 Procedure를 사용하는 것이 적합하다. 상황에 맞는 선택을 통해 성능을 최적화하고, 유지보수성을 높일 수 있다.
막상 공부하며 정리해보니, 디테일한 부분은 내가 알고 있는 지식이 틀린 경우가 많다.
실패한 경험이 오래가듯이 틀렸던 기억을 정정하면 더욱 오래 남는 것 같다.
'Dev > DB' 카테고리의 다른 글
[DB] ORA-12505 에러 원인 및 해결 방법 (3) | 2024.11.10 |
---|---|
[DB] 오라클 DBA_TAB_PRIVS 테이블 계정 권한 조회하기 (0) | 2024.11.07 |
[DB] Oracle AWR 스냅샷을 활용한 SQL 성능 분석 (0) | 2024.08.20 |
[ORACLE] 오라클 쿼리 로그 확인하기 (0) | 2024.08.13 |
[DB] SQL에서 순차적인 번호 부여하기: ROW_NUMBER() 함수 사용법 (0) | 2024.07.17 |