본문 바로가기

DB

오라클 PL/SQL

1. PL/SQL 이란?

  • PL/SQL = Procedural Language / SQL
  • 오라클에서 제공하는 절차적 프로그래밍 기능이 추가된 SQL 언어.
  • 단순 SQL 문장만 실행하는 것이 아니라, 변수/조건문/반복문/예외처리 등을 이용해 프로그램처럼 로직을 작성 가능.

2. 블록 구조

PL/SQL은 기본적으로 블록 단위로 작성됨.

  • 익명 블록: 이름 없이 실행만 되는 블록 (주로 테스트, 1회성 작업용)
  • 이름 있는 블록 (저장형 프로그램): DB 객체로 저장되어 재사용 가능
    • Procedure: 결과값 여러 개 가능, 반복 호출 작업에 적합
    • Function: 반드시 단일 리턴 값 반환
    • Package: 프로시저, 함수, 변수, 예외 등을 묶어 관리
    • Trigger: 이벤트(INSERT/UPDATE/DELETE 등)에 의해 자동 실행되는 블록

3. 변수 선언

DECLARE
    name VARCHAR2(20) := '이효리'; -- 선언 + 초기값
BEGIN
    DBMS_OUTPUT.PUT_LINE('이름: ' || name);
END;
  • CONSTANT → 상수 지정
  • DEFAULT → 기본값 지정
  • 블록의 DECLARE 구역에서만 선언 가능

4. DB 내에서 PL/SQL 사용 여부 확인

학습하며 정리한 방법:

  • USER_OBJECTS, ALL_OBJECTS, DBA_OBJECTS 뷰를 조회하면 어떤 PL/SQL 오브젝트가 있는지 확인 가능.
SELECT OBJECT_NAME, OBJECT_TYPE
FROM USER_OBJECTS
WHERE OBJECT_TYPE IN ('PROCEDURE','FUNCTION','PACKAGE','TRIGGER');
  • 패키지/프로시저/트리거가 많다 → PL/SQL을 실무에서 적극 사용 중이라는 의미.

5. 프로시저 (Procedure)

내가 이해한 핵심:
“DB 안에 저장된 프로그램 코드 블록”
→ SQL 여러 개를 묶어서 자동 실행 가능.
→ BEGIN ~ END 사이 로직을 저장해두고 CALL 하면 자동 실행.

예제 1) 단순 Update 처리

CREATE OR REPLACE PROCEDURE update_order_status (
    p_order_id IN NUMBER,
    p_new_status IN VARCHAR2
) AS
BEGIN
    UPDATE orders
    SET status = p_new_status,
        updated_at = SYSDATE
    WHERE order_id = p_order_id;

    COMMIT;
END;

예제 2) 반복 Insert (배치 처리)

CREATE OR REPLACE PROCEDURE insert_dummy_users (p_count IN NUMBER) AS
BEGIN
    FOR i IN 1..p_count LOOP
        INSERT INTO users (user_id, user_name, created_at)
        VALUES (user_seq.NEXTVAL, 'USER_' || i, SYSDATE);
    END LOOP;
    COMMIT;
END;

예제 3) 예외 처리 포함

CREATE OR REPLACE PROCEDURE safe_delete_order (p_order_id IN NUMBER) AS
BEGIN
    DELETE FROM orders WHERE order_id = p_order_id;
    COMMIT;

    DBMS_OUTPUT.PUT_LINE('Order ' || p_order_id || ' deleted.');
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;

6. 패키지 (Package)

실무에서 가장 많이 쓰이는 구조 → 여러 프로시저/함수를 묶어서 관리.

CREATE OR REPLACE PACKAGE order_pkg AS
    PROCEDURE update_order_status(p_order_id IN NUMBER, p_new_status IN VARCHAR2);
    PROCEDURE safe_delete_order(p_order_id IN NUMBER);
END order_pkg;

CREATE OR REPLACE PACKAGE BODY order_pkg AS
    -- 프로시저 구현부 작성
END order_pkg;

 

내가 학습한 걸 현 회사 구조에 대입해보면:

  • 패키지 + 프로시저 조합 → 비즈니스 로직이 DB 안에 들어가 있는 구조.
  • 트리거 존재 여부 → 자동화 처리(감사 로그, 수정일 자동 업데이트 등) 많이 씀.
  • 커서/루프 → 대량 배치 작업에서 자주 사용.
  • 예외처리 (EXCEPTION) → 오류 발생 시 로그 남기거나 롤백 처리.

  • PL/SQL은 오라클에서 절차적 로직을 구현하는 SQL 확장 언어
  • 블록 구조와 변수 선언 방식 학습 완료
  • 프로시저/함수/트리거/패키지 각각의 역할과 차이점 정리
  • 예제 프로시저 작성 및 호출 방식 실습
  • 실무에서는 “패키지 기반 구조 + 프로시저”가 주로 사용됨을 확인
  • 따라서 프로시저 작성 → 패키지에 묶기 → 예외처리 포함하기가 핵심 패턴