PL/SQL 데이터 유형 개요
PL/SQL은 오라클 데이터베이스에서 저장 프로시저, 함수, 트리거 등을 개발하기 위한 프로그래밍 언어입니다. PL/SQL의 강력함은 다양한 데이터 유형을 지원하여 데이터 처리의 유연성과 효율성을 높이는 데 있습니다. 올바른 데이터 유형 선택은 저장 공간을 절약하고, 성능을 향상시키며, 데이터 무결성을 유지하는 데 필수적입니다.
PL/SQL 스칼라 데이터 유형
스칼라 데이터 유형은 단일 값을 저장하는 기본 데이터 유형입니다. PL/SQL은 다양한 스칼라 데이터 유형을 제공하며, 각 데이터 유형은 특정 종류의 데이터를 저장하는 데 최적화되어 있습니다.
1. 숫자형 (Number)
숫자형 데이터 유형은 숫자 값을 저장하는 데 사용됩니다. 다양한 숫자형 데이터 유형이 있으며, 각각 저장할 수 있는 숫자 범위와 정밀도가 다릅니다.
- NUMBER(p, s): 가변 길이 숫자형으로, p는 전체 자릿수(precision), s는 소수점 이하 자릿수(scale)를 나타냅니다.
- INTEGER, INT: 정수 값을 저장합니다 (NUMBER(38)과 동일).
- SMALLINT: 작은 정수 값을 저장합니다 (NUMBER(38)과 동일).
- DECIMAL(p, s), NUMERIC(p, s): 정확한 숫자 값을 저장합니다.
- REAL: 부동 소수점 숫자 값을 저장합니다.
- DOUBLE PRECISION: 높은 정밀도의 부동 소수점 숫자 값을 저장합니다.
- FLOAT(p): 부동 소수점 숫자 값을 저장합니다 (p는 2진수 정밀도).
예시:
DECLARE
v_salary NUMBER(7, 2) := 5000.50; -- 전체 7자리, 소수점 2자리 숫자형 변수
v_age INTEGER := 30; -- 정수형 변수
BEGIN
DBMS_OUTPUT.PUT_LINE('Salary: ' || v_salary);
DBMS_OUTPUT.PUT_LINE('Age: ' || v_age);
END;
/
실행 결과:
Salary: 5000.50
Age: 30
2. 문자형 (Character)
문자형 데이터 유형은 문자열을 저장하는 데 사용됩니다. 다양한 문자형 데이터 유형이 있으며, 각각 저장할 수 있는 문자열 길이와 문자 인코딩 방식이 다릅니다.
- VARCHAR2(size): 가변 길이 문자열을 저장합니다 (최대 size 바이트).
- CHAR(size): 고정 길이 문자열을 저장합니다 (size 바이트).
- NVARCHAR2(size): 가변 길이 유니코드 문자열을 저장합니다 (최대 size 문자).
- NCHAR(size): 고정 길이 유니코드 문자열을 저장합니다 (size 문자).
- LONG: 긴 문자열을 저장합니다 (최대 32767 바이트).
예시:
DECLARE
v_name VARCHAR2(50) := '홍길동'; -- 최대 50바이트 문자열 변수
v_initial CHAR(1) := 'H'; -- 1바이트 고정 길이 문자 변수
BEGIN
DBMS_OUTPUT.PUT_LINE('Name: ' || v_name);
DBMS_OUTPUT.PUT_LINE('Initial: ' || v_initial);
END;
/
실행 결과:
Name: 홍길동
Initial: H
3. 날짜형 (Date)
날짜형 데이터 유형은 날짜와 시간 정보를 저장하는 데 사용됩니다.
- DATE: 날짜와 시간 정보를 저장합니다.
- TIMESTAMP: 날짜, 시간, 초, 그리고 fractional seconds 정보를 저장합니다.
- TIMESTAMP WITH TIME ZONE: 날짜, 시간, 초, fractional seconds 정보와 함께 시간대 정보를 저장합니다.
- TIMESTAMP WITH LOCAL TIME ZONE: 날짜, 시간, 초, fractional seconds 정보를 저장하며, 데이터베이스 시간대로 변환되어 저장됩니다.
예시:
DECLARE
v_today DATE := SYSDATE; -- 현재 날짜 및 시간을 저장
v_ts TIMESTAMP := SYSTIMESTAMP; -- 현재 날짜, 시간 및 fractional seconds 저장
BEGIN
DBMS_OUTPUT.PUT_LINE('Today: ' || TO_CHAR(v_today, 'YYYY-MM-DD HH24:MI:SS'));
DBMS_OUTPUT.PUT_LINE('Timestamp: ' || TO_CHAR(v_ts, 'YYYY-MM-DD HH24:MI:SS.FF'));
END;
/
실행 결과 (예시):
Today: 2024-01-27 15:30:00
Timestamp: 2024-01-27 15:30:00.123456
4. BOOLEAN
BOOLEAN 데이터 유형은 TRUE, FALSE, NULL 중 하나의 값을 저장합니다. PL/SQL에서 조건 검사, 로직 제어 등에 사용됩니다. SET DEFINE OFF;
를 사용하면 SQL*Plus에서 BOOLEAN 변수를 사용할 수 있습니다.
예시:
SET DEFINE OFF;
DECLARE
v_is_valid BOOLEAN := TRUE;
BEGIN
IF v_is_valid THEN
DBMS_OUTPUT.PUT_LINE('Valid');
ELSE
DBMS_OUTPUT.PUT_LINE('Invalid');
END IF;
END;
/
실행 결과:
Valid
5. ROWID
ROWID는 테이블 내 특정 행의 물리적 주소를 저장하는 데이터 유형입니다. 일반적으로 인덱스를 사용하여 테이블에 액세스하는 것이 효율적이지만, ROWID를 사용하면 특정 행에 직접 빠르게 액세스할 수 있습니다. ROWID는 테이블 구조 변경 및 행 이동에 따라 변경될 수 있으므로 주의하여 사용해야 합니다.
예시:
DECLARE
v_rowid ROWID;
v_employee_name VARCHAR2(50);
BEGIN
SELECT ROWID, last_name INTO v_rowid, v_employee_name
FROM employees
WHERE employee_id = 100;
DBMS_OUTPUT.PUT_LINE('ROWID: ' || v_rowid);
DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_employee_name);
END;
/
6. 사용자 정의 데이터 유형 (User-Defined Data Types)
PL/SQL을 사용하면 사용자가 직접 데이터 유형을 정의할 수 있습니다. 이는 복잡한 데이터 구조를 효과적으로 표현하고 관리하는 데 유용합니다. 사용자 정의 데이터 유형에는 RECORD, TABLE, VARRAY 등이 있습니다.
- RECORD: 서로 다른 데이터 유형의 필드를 포함하는 복합 데이터 구조입니다.
- TABLE: 동일한 데이터 유형의 요소들을 저장하는 컬렉션입니다. (연관 배열, 중첩 테이블).
- VARRAY: 동일한 데이터 유형의 요소들을 저장하며, 크기가 고정된 컬렉션입니다.
예시 (RECORD):
DECLARE
TYPE employee_record IS RECORD (
employee_id NUMBER(6),
last_name VARCHAR2(255),
salary NUMBER(8,2)
);
v_emp employee_record;
BEGIN
SELECT employee_id, last_name, salary
INTO v_emp
FROM employees
WHERE employee_id = 100;
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_emp.employee_id);
DBMS_OUTPUT.PUT_LINE('Last Name: ' || v_emp.last_name);
DBMS_OUTPUT.PUT_LINE('Salary: ' || v_emp.salary);
END;
/
데이터 유형 선택 가이드라인
PL/SQL에서 효율적인 데이터 처리를 위해 데이터 유형을 선택할 때 고려해야 할 몇 가지 주요 가이드라인은 다음과 같습니다.
- 데이터 유형 일치: SQL 문장 및 PL/SQL 변수 간의 데이터 유형을 일치시켜야 합니다. 불필요한 데이터 유형 변환은 성능 저하를 유발할 수 있습니다.
- 정밀도와 저장 공간: 데이터의 정밀도 요구 사항을 충족하면서도 저장 공간을 효율적으로 사용할 수 있는 데이터 유형을 선택합니다. 예를 들어, 정수 값만 저장한다면 INTEGER를 사용하는 것이 NUMBER보다 효율적입니다.
- 문자열 길이: VARCHAR2를 사용할 때, 실제 저장할 문자열 길이를 고려하여 size를 지정합니다. 너무 크게 지정하면 메모리 낭비를 초래할 수 있습니다.
- 유니코드 지원: 다국어 문자열을 저장해야 할 경우 NVARCHAR2 또는 NCHAR를 사용합니다.
- NULL 값 허용 여부: 특정 열에 NULL 값이 들어갈 가능성이 있다면 해당 열에 대해 NULL을 허용하도록 데이터 유형을 정의합니다.
데이터 유형 변환
PL/SQL은 암시적 및 명시적 데이터 유형 변환을 지원합니다. 암시적 변환은 자동으로 수행되지만, 명시적 변환은 TO_CHAR, TO_NUMBER, TO_DATE 등의 함수를 사용하여 수행합니다.
예시:
DECLARE
v_num NUMBER := 123;
v_str VARCHAR2(10);
BEGIN
v_str := TO_CHAR(v_num); -- 숫자형을 문자형으로 명시적 변환
DBMS_OUTPUT.PUT_LINE('String: ' || v_str);
END;
/
결론
PL/SQL에서 데이터 유형의 올바른 선택 및 사용은 데이터베이스 성능 향상과 애플리케이션의 안정성에 매우 중요합니다. 이 가이드라인을 통해 개발자는 효율적인 PL/SQL 코드를 작성하고 데이터베이스 애플리케이션의 전반적인 성능을 최적화할 수 있습니다.