PL/SQL 데이터 유형 (Data Types)

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 코드를 작성하고 데이터베이스 애플리케이션의 전반적인 성능을 최적화할 수 있습니다.

위로 스크롤