PL/SQL

PL/SQL 기초 01강 — PL/SQL이란 + 블록 구조

🎯 학습 목표

  • PL/SQL이 무엇이고 순수 SQL과 어떻게 다른지 설명한다.
  • 익명 블록의 네 가지 구역(DECLARE/BEGIN/EXCEPTION/END)을 안다.
  • 변수를 선언하고 값을 대입(:=)하여 DBMS_OUTPUT.PUT_LINE으로 출력한다.

📖 PL/SQL이란?

PL/SQL(Procedural Language/SQL)은 오라클이 SQL에 절차적 프로그래밍 요소(변수, 조건문, 반복문, 예외처리 등)를 더한 언어입니다. 순수 SQL은 “무엇을 가져올지”만 기술하는 집합 기반 언어지만, PL/SQL은 “어떤 순서로 어떻게 처리할지”도 기술할 수 있습니다.

PL/SQL의 핵심 장점:

  • 서버 내 실행: 여러 SQL을 한 번의 서버 호출로 처리 → 네트워크 왕복 횟수 감소.
  • 절차적 제어: IF/LOOP로 복잡한 업무 로직을 DB 안에서 처리.
  • 에러 처리: EXCEPTION 블록으로 SQL 오류를 체계적으로 처리.
  • 재사용: 프로시저·함수·패키지로 로직을 캡슐화하여 여러 곳에서 호출.

📖 블록(Block) 구조 — PL/SQL의 기본 단위

PL/SQL의 모든 코드는 블록이라는 단위로 작성됩니다. 블록은 최대 네 구역으로 나뉩니다.

-- 익명 블록(Anonymous Block) 기본 틀
DECLARE
  -- 선택 구역: 변수·상수·커서 등 선언
BEGIN
  -- 필수 구역: 실행할 SQL과 PL/SQL 문
EXCEPTION
  -- 선택 구역: 오류 처리
END;
/   -- SQL*Plus에서 블록을 실행(전송)하는 구분자
  • DECLARE: 이 블록에서 쓸 변수·상수·커서를 선언합니다. 없으면 생략 가능.
  • BEGIN: 실제 로직이 들어가는 필수 구역. SQL 문과 PL/SQL 제어문을 모두 씁니다.
  • EXCEPTION: 오류 발생 시 처리 로직. 없으면 오류가 호출자에게 전파됩니다.
  • END: 블록 종료. 반드시 세미콜론(;)을 붙이고 SQL*Plus에서는 /를 씁니다.

💻 출력 설정과 첫 번째 익명 블록

-- SQL*Plus / SQL Developer에서 서버 출력을 켠다 (세션마다 한 번 실행)
SET SERVEROUTPUT ON;

-- 첫 번째 익명 블록
DECLARE
  v_msg VARCHAR2(100);                   -- 변수 선언: 타입은 VARCHAR2(100)
BEGIN
  v_msg := '안녕하세요, PL/SQL!';        -- := 대입 연산자
  DBMS_OUTPUT.PUT_LINE(v_msg);           -- 화면(서버 출력)에 출력
  DBMS_OUTPUT.PUT_LINE('현재 날짜: ' || TO_CHAR(SYSDATE, 'YYYY-MM-DD'));
END;
/

실행 결과:

안녕하세요, PL/SQL!
현재 날짜: 2024-03-15

💻 변수 선언과 대입 규칙

DECLARE
  v_name    VARCHAR2(50);                -- 선언만 (NULL로 초기화)
  v_age     NUMBER(3)  := 30;            -- 선언과 동시에 초기값 대입
  v_pi      CONSTANT NUMBER := 3.14159;  -- 상수: 이후 변경 불가
  v_today   DATE := SYSDATE;            -- 함수 결과로 초기화
BEGIN
  v_name := '홍길동';                    -- BEGIN 안에서 :=로 대입
  DBMS_OUTPUT.PUT_LINE(v_name || '의 나이: ' || v_age);
  DBMS_OUTPUT.PUT_LINE('원주율: '  || v_pi);
  DBMS_OUTPUT.PUT_LINE('오늘: ' || TO_CHAR(v_today, 'YYYY-MM-DD'));
  -- v_pi := 3.0;  -- 이 줄을 활성화하면 컴파일 오류: 상수는 변경 불가
END;
/
  • 대입 연산자는 := (콜론 + 등호). SQL의 등호 =는 비교에만 사용합니다.
  • 문자열 연결은 || 연산자를 씁니다.
  • CONSTANT로 선언된 변수는 값을 바꿀 수 없습니다.

⚠️ 주의사항

  • SET SERVEROUTPUT ON을 실행하지 않으면 DBMS_OUTPUT.PUT_LINE 결과가 화면에 표시되지 않습니다. 세션이 끊기면 다시 설정해야 합니다.
  • 블록 끝의 /는 SQL*Plus에서 PL/SQL 블록을 서버로 전송하는 명령입니다. SQL Developer 등 도구에서는 실행 버튼으로 대체되며, 항상 필요하지 않을 수 있습니다.
  • PL/SQL 변수 이름은 대소문자를 구분하지 않습니다(Oracle 식별자 규칙). 관례상 v_ 접두사를 변수에 씁니다.

💡 팁

  • 익명 블록은 저장되지 않고 그때그때 실행됩니다. 재사용이 필요하면 7강에서 배울 프로시저·함수로 저장하세요.
  • 블록 안에 블록을 중첩할 수 있습니다(중첩 블록). 안쪽 블록의 변수는 바깥에서 접근할 수 없습니다.