ki-sd 님의 블로그
[2026-04-22] 오라클 PL/SQL 입문: 절차적 프로그래밍과 커서(Cursor) 제어 본문
단순한 쿼리(SQL)의 나열을 넘어, 오라클 내부에서 변수를 선언하고 제어문(IF, FOR)을 사용해 프로그래밍을 할 수 있게 해주는 PL/SQL(Procedural Language extension to SQL)의 기초를 확립했다. 향후 실무에서 Java(JDBC)나 스프링 프레임워크와 DB가 어떻게 소통하는지 구조를 잡는 중요한 뼈대가 된다.
1. PL/SQL의 기본 아키텍처와 변수 활용
- PL/SQL은 애플리케이션 서버(Java)가 아닌 데이터베이스 서버 내부에서 직접 실행되므로 네트워크 트래픽을 줄이고 속도를 비약적으로 높일 수 있는 강력한 무기다.
- 기본 구조는 DECLARE(선언부), BEGIN(구현부), EXCEPTION(예외처리), END;의 블록 형태로 구성됨을 파악했다.
- 변수 선언의 4단계 고도화:
- 스칼라 변수: vempno NUMBER(4); 처럼 데이터형을 직접 지정.
- %TYPE: vempno emp.empno%TYPE; 테이블의 특정 컬럼 데이터형을 그대로 동적 상속받아, 테이블 스키마가 변경되어도 PL/SQL 코드를 수정할 필요가 없는 유연한 방식을 실습했다.
- %ROWTYPE: vemp emp%ROWTYPE; 테이블의 모든 컬럼을 자바의 VO(Value Object) 클래스처럼 한 번에 묶어서 받는 1행(Row) 전용 변수다.
- 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단계 (명시적 커서):
- CURSOR 커서명 IS SELECT... (선언)
- OPEN 커서명; (메모리 할당 및 쿼리 실행)
- FETCH 커서명 INTO 변수; (한 행씩 데이터 추출) -> EXIT WHEN 커서명%NOTFOUND; (데이터가 없을 때 탈출하는 핵심 탈출 조건)
- CLOSE 커서명; (메모리 해제)
- FOR-EACH 커서 루프: 위 4단계의 번거로운 과정을 한 번에 단축해 주는 FOR 변수 IN 커서명 LOOP 구문을 통해, 커서의 오픈, 패치, 클로즈 과정을 시스템에 위임하고 자바의 향상된 for문처럼 우아하게 다중 데이터를 처리하는 실무적 코딩 기법을 체득했다.
'OracleStudy' 카테고리의 다른 글
| [2026-04-24] Java JDBC 연동 실전: 음악 목록/검색/상세보기 시스템 구현 (1) | 2026.04.24 |
|---|---|
| [2026-04-23] PL/SQL 심화: 함수, 프로시저, 트리거의 완벽한 분리와 SQL 실전 총정리 (0) | 2026.04.23 |
| [2026-04-21] 오라클 성능 최적화의 핵심, 인덱스(Index)와 DDL/객체 총정리 (1) | 2026.04.21 |
| [2026-04-20] 오라클 핵심 총정리 및 서브쿼리, 뷰(View), 시퀀스의 심화 (0) | 2026.04.20 |
| [2026-04-17] 테이블 설계(DDL)와 제약조건, 그리고 CRUD 실무 구현 (0) | 2026.04.18 |
