PL/SQL

PL/SQL 기초 02강 — 변수와 자료형: %TYPE·%ROWTYPE

🎯 학습 목표

  • PL/SQL의 주요 스칼라 자료형(NUMBER, VARCHAR2, DATE, BOOLEAN)을 안다.
  • %TYPE으로 테이블 컬럼의 타입을 그대로 참조하는 법을 안다.
  • %ROWTYPE으로 행 전체를 하나의 변수에 담는 법을 안다.

📖 스칼라 자료형

PL/SQL에서 자주 쓰는 스칼라(단일 값) 자료형입니다.

DECLARE
  v_num     NUMBER(10,2);       -- 정수+소수: 전체 10자리, 소수 2자리
  v_str     VARCHAR2(200);      -- 가변 길이 문자열, 최대 32767바이트
  v_char    CHAR(1);            -- 고정 길이 문자열 (공백 패딩)
  v_date    DATE;               -- 날짜+시간 (초 단위까지)
  v_ts      TIMESTAMP;          -- 날짜+시간 (밀리초 이하까지)
  v_bool    BOOLEAN := TRUE;    -- TRUE / FALSE / NULL (PL/SQL 전용)
  v_int     PLS_INTEGER;        -- 정수 연산 특화 (내부 최적화)
BEGIN
  v_num  := 12345.67;
  v_str  := '홍길동';
  v_date := SYSDATE;
  IF v_bool THEN
    DBMS_OUTPUT.PUT_LINE('참입니다: ' || v_num);
  END IF;
END;
/

주의: BOOLEAN은 PL/SQL 전용이며, SQL의 SELECT/WHERE 절에서는 직접 사용할 수 없습니다.

📖 상수(CONSTANT)와 DEFAULT

DECLARE
  c_tax_rate  CONSTANT NUMBER := 0.1;         -- 한 번 정하면 변경 불가
  v_count     NUMBER DEFAULT 0;               -- DEFAULT는 := 와 동일
  v_name      VARCHAR2(50) NOT NULL := '기본값';  -- NULL 허용 안 함
BEGIN
  DBMS_OUTPUT.PUT_LINE('세율: '        || c_tax_rate);
  DBMS_OUTPUT.PUT_LINE('초기 카운트: ' || v_count);
END;
/

📖 %TYPE — 컬럼 타입을 그대로 참조

변수 테이블명.컬럼명%TYPE으로 선언하면, 해당 컬럼의 타입(길이 포함)을 그대로 가져옵니다. 테이블 스키마가 바뀌어도 PL/SQL 코드를 수정할 필요가 없어 유지보수에 매우 유리합니다.

DECLARE
  -- emp.ename의 타입이 바뀌어도 v_name은 자동으로 맞춰짐
  v_name  emp.ename%TYPE;
  v_sal   emp.sal%TYPE;
BEGIN
  SELECT ename, sal INTO v_name, v_sal
    FROM emp WHERE empno = 7369;
  DBMS_OUTPUT.PUT_LINE(v_name || ': ' || v_sal);
END;
/

이 패턴을 쓰지 않으면, emp.enameVARCHAR2(10)에서 VARCHAR2(20)으로 바뀔 때 변수 선언을 일일이 찾아 수정해야 합니다. %TYPE을 쓰면 그 작업이 없습니다.

📖 %ROWTYPE — 행 전체를 하나의 레코드로

테이블명%ROWTYPE으로 선언하면, 테이블의 모든 컬럼을 멤버로 가진 레코드 타입 변수가 만들어집니다. SELECT … INTO에서 한 행 전체를 한 번에 받을 수 있습니다.

DECLARE
  r_emp  emp%ROWTYPE;     -- emp의 모든 컬럼을 담는 레코드
BEGIN
  SELECT * INTO r_emp
    FROM emp WHERE empno = 7369;
  -- 각 필드는 레코드변수.컬럼명으로 접근
  DBMS_OUTPUT.PUT_LINE('이름: ' || r_emp.ename);
  DBMS_OUTPUT.PUT_LINE('급여: ' || r_emp.sal);
  DBMS_OUTPUT.PUT_LINE('부서: ' || r_emp.deptno);
END;
/

⚠️ 주의사항

  • %TYPE%ROWTYPE은 선언 시점의 테이블 구조를 참조합니다. 프로시저를 만든 뒤 테이블 컬럼이 추가되면 프로시저를 재컴파일해야 새 구조가 반영됩니다.
  • PL/SQL의 BOOLEAN은 SQL 함수(DECODE, CASE 등)와 직접 연동되지 않습니다. 중간에 숫자(0/1)나 문자(‘Y’/’N’)로 변환해야 할 때가 있습니다.
  • 대용량 데이터를 담으려면 CLOB(문자 대용량), BLOB(이진 대용량) 타입을 사용합니다. 이 강좌에서는 스칼라 타입에 집중합니다.

💡 팁

  • 실무에서는 거의 모든 변수를 %TYPE이나 %ROWTYPE으로 선언합니다. “하드코딩된 타입 선언”은 유지보수 부채가 됩니다.
  • 커서의 각 행을 받을 변수도 %ROWTYPE이 편리합니다(5강).