🎯 학습 목표
- 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.ename이 VARCHAR2(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강).