Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

ki-sd 님의 블로그

[2026-04-22] 오라클 PL/SQL 입문: 절차적 프로그래밍과 커서(Cursor) 제어 본문

OracleStudy

[2026-04-22] 오라클 PL/SQL 입문: 절차적 프로그래밍과 커서(Cursor) 제어

ki-sd 2026. 4. 23. 08:50

단순한 쿼리(SQL)의 나열을 넘어, 오라클 내부에서 변수를 선언하고 제어문(IF, FOR)을 사용해 프로그래밍을 할 수 있게 해주는 PL/SQL(Procedural Language extension to SQL)의 기초를 확립했다. 향후 실무에서 Java(JDBC)나 스프링 프레임워크와 DB가 어떻게 소통하는지 구조를 잡는 중요한 뼈대가 된다.

 

1. PL/SQL의 기본 아키텍처와 변수 활용

  • PL/SQL은 애플리케이션 서버(Java)가 아닌 데이터베이스 서버 내부에서 직접 실행되므로 네트워크 트래픽을 줄이고 속도를 비약적으로 높일 수 있는 강력한 무기다.
  • 기본 구조는 DECLARE(선언부), BEGIN(구현부), EXCEPTION(예외처리), END;의 블록 형태로 구성됨을 파악했다.
  • 변수 선언의 4단계 고도화:
    1. 스칼라 변수: vempno NUMBER(4); 처럼 데이터형을 직접 지정.
    2. %TYPE: vempno emp.empno%TYPE; 테이블의 특정 컬럼 데이터형을 그대로 동적 상속받아, 테이블 스키마가 변경되어도 PL/SQL 코드를 수정할 필요가 없는 유연한 방식을 실습했다.
    3. %ROWTYPE: vemp emp%ROWTYPE; 테이블의 모든 컬럼을 자바의 VO(Value Object) 클래스처럼 한 번에 묶어서 받는 1행(Row) 전용 변수다.
    4. RECORD: JOIN이나 서브쿼리처럼 여러 테이블의 컬럼이 섞인 결과를 받아야 할 때 개발자가 직접 구조체(Struct) 형태의 커스텀 데이터형을 정의하는 방식이다.

2. 제어문(Control Statement)을 활용한 분기 및 반복 로직 단순 쿼리로는 불가능한 '조건에 따른 다른 실행 흐름'을 PL/SQL 제어문으로 제어했다.

  • 조건 분기: IF ~ ELSIF ~ ELSE 문법을 사용해 부서 번호에 따라 부서명을 다르게 매핑하는 로직을 작성했다. 자바의 switch-case와 유사한 PL/SQL 전용 CASE WHEN THEN의 간결함도 확인했다.
  • 반복 제어: 1부터 100까지의 짝수/홀수 총합을 구하는 로직 등을 통해 기본 LOOP (do-while), WHILE, 그리고 가장 많이 쓰이는 FOR i IN 1..100 LOOP 구문을 마스터했다.

3. 다중 행 처리를 위한 핵심 객체, 커서(CURSOR)

  • PL/SQL의 일반 변수(%TYPE, RECORD)는 단 하나의 행(Row)만 담을 수 있다는 치명적인 한계가 있다.
  • 이를 해결하기 위해 SELECT 결과로 반환되는 여러 행의 결과 집합(Result Set) 전체를 담아두고, 포인터를 이동하며 데이터를 한 줄씩 꺼내오는 커서(CURSOR)의 메커니즘을 학습했다.
  • 커서 제어의 4단계 (명시적 커서):
    1. CURSOR 커서명 IS SELECT... (선언)
    2. OPEN 커서명; (메모리 할당 및 쿼리 실행)
    3. FETCH 커서명 INTO 변수; (한 행씩 데이터 추출) -> EXIT WHEN 커서명%NOTFOUND; (데이터가 없을 때 탈출하는 핵심 탈출 조건)
    4. CLOSE 커서명; (메모리 해제)
  • FOR-EACH 커서 루프: 위 4단계의 번거로운 과정을 한 번에 단축해 주는 FOR 변수 IN 커서명 LOOP 구문을 통해, 커서의 오픈, 패치, 클로즈 과정을 시스템에 위임하고 자바의 향상된 for문처럼 우아하게 다중 데이터를 처리하는 실무적 코딩 기법을 체득했다.