페이지 불러오는 중
내부 함수는 입력값을 받아 내부적인 연산 처리를 거친 후, 반드시 하나의 결과값(리턴값)을 반환하는 데이터베이스 오브젝트입니다. 기본적으로 SQL 문(SELECT, WHERE, INSERT 등) 내부에서 일반적인 내장 함수(예: NOW(), CONCAT())처럼 직접 호출되어 녹아들 수 있는 구조를 가집니다.
VIP, GOLD, SILV)를 입력받아 사용자가 보기 편한 한글 명칭으로 변환하여 리턴하는 함수입니다.DELIMITER //
CREATE FUNCTION fn_get_grade_name(p_grade_code VARCHAR(10))
RETURNS VARCHAR(20)
DETERMINISTIC -- 동일한 입력에 대해 항상 동일한 결과를 반환함을 명시 (성능 최적화)
BEGIN
DECLARE v_grade_name VARCHAR(20);
-- 비즈니스 규칙 분리 및 가공 로직
IF p_grade_code = 'VIP' THEN
SET v_grade_name = '최우수 회원';
ELSEIF p_grade_code = 'GOLD' THEN
SET v_grade_name = '우수 회원';
ELSEIF p_grade_code = 'SILV' THEN
SET v_grade_name = '일반 회원';
ELSE
SET v_grade_name = '미지정';
END IF;
-- 반드시 하나의 값을 리턴해야 함
RETURN v_grade_name;
END //
DELIMITER ;프로시저는 특정한 비즈니스 로직이나 일련의 SQL 작업들을 하나의 실행 단위로 묶어둔 절차적 스크립트 블록입니다. 함수와 달리 리턴값이 필수적이지 않으며, 단독으로 CALL 프로시저명() 형태로 호출되어 실행됩니다. 여러 개의 행(ResultSet)을 반환하거나, 입력(IN) 파라미터뿐만 아니라 출력(OUT) 파라미터를 통해 여러 값을 동시에 넘겨줄 수도 있습니다.
DELIMITER //
CREATE PROCEDURE sp_use_user_point(
IN p_user_id INT,
IN p_use_point INT,
OUT p_result_code VARCHAR(10) -- 결과를 애플리케이션에 전달할 출력 파라미터
)
BEGIN
-- 에러 발생 시 롤백을 수행하기 위한 핸들러 선언
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
-- 예외 발생 시 전처리를 모두 취소하고 에러 코드 반환
ROLLBACK;
SET p_result_code = 'FAIL';
END;
-- 트랜잭션 시작 (개별 트랜잭션 관리 필요)
START TRANSACTION;
-- 1. 포인트 사용 이력 테이블에 데이터 삽입 (DML)
INSERT INTO point_history (user_id, amount, type, created_at)
VALUES (p_user_id, p_use_point, 'USE', NOW());
-- 2. 회원 테이블의 현재 포인트 정보 차감 (DML)
UPDATE users
SET current_point = current_point - p_use_point
WHERE user_id = p_user_id;
-- 모든 작업이 정상적으로 수행되면 영구 반영
COMMIT;
SET p_result_code = 'SUCCESS';
END //
DELIMITER ;Row-by-Row 부하가 발생합니다. 10만 건을 조회하면 함수가 10만 번 호출되므로 대량 데이터 처리 시 성능이 급격히 저하됩니다.WHERE my_function(column) = '값'), 옵티마이저가 해당 컬럼에 걸린 인덱스를 타지 못하고 풀 테이블 스캔(Full Table Scan)을 수행하게 됩니다. 즉, 엔진의 최적화 경로를 따르지 않아 심각한 병목을 유발합니다.IF-ELSE), 반복문(WHILE), 예외 처리 등을 활용하여 DB 엔진 내부에서 복잡한 커스텀 비즈니스 로직을 완결성 있게 수행할 수 있습니다.DB 내부에서 자율적으로 혹은 절차적으로 돌아가는 이 요소들은 큰 틀에서 서로 유기적으로 연결된 DB 프로그래밍 객체들입니다.
댓글
GitHub 계정으로 의견이나 질문을 남길 수 있습니다.