🎯 학습 목표
- 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강에서 배울 프로시저·함수로 저장하세요.
- 블록 안에 블록을 중첩할 수 있습니다(중첩 블록). 안쪽 블록의 변수는 바깥에서 접근할 수 없습니다.