자격증/sqld

[sqld 2장] SQL 저장 모듈(Stored Module) 개념 및 종류

딸기뚜왈기 2025. 3. 5. 19:02

📌 SQL 저장 모듈(Stored Module) 개념 정리

SQL 저장 모듈(Stored Module)은 데이터베이스에서 실행되는 SQL 코드 블록을 미리 저장하여 필요할 때 호출하여 실행할 수 있도록 만든 프로그램 객체. 일종의 sql 컴포넌트 프로그램. 독립적으로 실행되거나 다른 프로그램으로부터 실행될 수 있는 완전한 프로그램. oracle의 저장모듈로는 Trigger, Prodedure, User defined Function이 있음.

 

 

1. SQL 저장 모듈의 종류

(1) 저장 프로시저 (Stored Procedure)

  • 자주 실행하는 SQL 문을 미리 저장하고 필요할 때 호출하는 프로그램
  • IN/OUT 매개변수를 사용할 수 있어 데이터 입력 및 반환이 가능
  • 명시적으로 CALL 또는 EXECUTE를 통해 실행
  • 비즈니스 로직을 캡슐화하여 데이터베이스 내에 저장해 높은 명령문 집합으로 코드 재사용성을 높임

📌 예제 (저장 프로시저 생성 및 실행)

-- 특정 직원의 급여를 인상하는 저장 프로시저
CREATE OR REPLACE PROCEDURE update_salary (p_emp_id NUMBER, p_amount NUMBER) AS
BEGIN
    UPDATE employees SET salary = salary + p_amount WHERE emp_id = p_emp_id;
    COMMIT;
END;
/
-- 저장 프로시저 실행
BEGIN
    update_salary(101, 500); -- 직원 ID 101의 급여를 500 증가
END;
/

 

(2) 저장 함수 (Stored Function)

  • 저장 프로시저와 비슷하지만, 반드시 단일 값을 반환해야 함
  • SELECT 문에서 컬럼 값을 계산하는 용도로 사용 가능
  • 다른 sql문을 통하여 호출됨.
  • RETURN 키워드를 통해 결과 값을 반환.(sql의 보조적인 역할)

📌 예제 (저장 함수 생성 및 실행)

-- 직원의 연봉을 계산하는 저장 함수
CREATE OR REPLACE FUNCTION get_annual_salary (p_emp_id NUMBER) RETURN NUMBER IS
    v_salary NUMBER;
BEGIN
    SELECT salary * 12 INTO v_salary FROM employees WHERE emp_id = p_emp_id;
    RETURN v_salary;
END;
/
-- 저장 함수 실행
SELECT get_annual_salary(101) FROM dual;

 

(3) 트리거 (Trigger)

  • 특정 이벤트(INSERT, UPDATE, DELETE)가 발생할 때 자동으로 실행되는 SQL 블록
  • 데이터 변경을 감지하고 자동으로 특정 작업 수행
  • 예를 들어, 데이터 무결성을 유지하거나 변경 이력을 기록하는 데 사용

📌 예제 (트리거 생성 및 실행)

-- 직원 급여 변경 시 로그를 기록하는 트리거
CREATE OR REPLACE TRIGGER trg_salary_update
BEFORE UPDATE ON employees  -- employees 테이블에서 UPDATE 발생 전 실행
FOR EACH ROW
BEGIN
    INSERT INTO salary_log(emp_id, old_salary, new_salary, change_date)
    VALUES (:OLD.emp_id, :OLD.salary, :NEW.salary, SYSDATE);
END;
/

 

(4) 패키지 (Package)

  • 여러 개의 저장 프로시저, 함수, 변수, 상수 등을 하나의 단위로 묶어 관리
  • 캡슐화(Encapsulation)와 모듈화(Modularization)를 지원하여 코드 재사용성을 높임
  • 패키지는 **패키지 선언부(Specification)**와 **패키지 본문(Body)**로 구성됨

📌 예제 (패키지 생성 및 실행)

-- 패키지 선언부 (Specification)
CREATE OR REPLACE PACKAGE emp_pkg AS
    PROCEDURE update_salary(p_emp_id NUMBER, p_amount NUMBER);
    FUNCTION get_annual_salary(p_emp_id NUMBER) RETURN NUMBER;
END emp_pkg;
/

-- 패키지 본문 (Body)
CREATE OR REPLACE PACKAGE BODY emp_pkg AS
    -- 급여 업데이트 프로시저
    PROCEDURE update_salary(p_emp_id NUMBER, p_amount NUMBER) IS
    BEGIN
        UPDATE employees SET salary = salary + p_amount WHERE emp_id = p_emp_id;
        COMMIT;
    END;

    -- 연봉 계산 함수
    FUNCTION get_annual_salary(p_emp_id NUMBER) RETURN NUMBER IS
        v_salary NUMBER;
    BEGIN
        SELECT salary * 12 INTO v_salary FROM employees WHERE emp_id = p_emp_id;
        RETURN v_salary;
    END;
END emp_pkg;
/

-- 패키지 실행
BEGIN
    emp_pkg.update_salary(101, 500);
    DBMS_OUTPUT.PUT_LINE(emp_pkg.get_annual_salary(101));
END;
/

 

 


https://belle-sooir.tistory.com/190

 

[sqld 2장] 프로시저 트리거 특징 차이

프로시저 트리거 특징 차이프로시저트리거CREATE PROCEDURE 문법 사용CREATE TRIGGER 문법 사용COMMIT, ROLLBACK 실행 가능COMMIT, ROLLBACK 실행 불가능EXECURE 명령어로 실행생성 후 자동으로 실행

belle-sooir.tistory.com