DBMS

[DBMS/Oracle] 데이터 타입

elog 2023. 3. 14. 12:00

[DBMS/Oracle] 데이터 타입
[DBMS/Oracle] 데이터 타입

데이터 타입

  - 오라클에서 제공하는 자료형은 문자열, 숫자, 날짜, 기타 자료형으로 분류

 

1. 문자열 자료형

- 오라클에서 문자열자료는 ''안에 기술

  - 고정길이 문자열과 가변길이 문자열 구분

 

A. CHAR(n [BYTE|CHAR])

  - 고정길이 문자열을 저장
  - 최대 2000 BYTE까지 저장 가능
  - 저장시킬 자료가 선언된 공간보다 작으면 오른쪽에 공백으로 PADDING
  - 선언된 저장공간보다 큰 자료는 저장되지 않음
  - 한글 한 글자는 3 BYTE로 저장
  - 'n [BYTE|CHAR]' : n이 저장시킬 문자의 수(CHAR)인지 바이트(BYTE)인지 선택. 생략하면 BYTE로 간주한다.

사용예)
  CREATE TABLE TEMP01(
    COL1 CHAR(20),
    COL2 CHAR(20 BYTE),
    COL3 CHAR(20 CHAR));
        
  INSERT INTO TEMP01 VALUES('대전시 중구','대전시 중구','대전시 중구 오류동846');
    
  SELECT * FROM TEMP01;

  SELECT LENGTHB(COL1) AS "컬럼1",
         LENGTHB(COL2) AS "컬럼2",
         LENGTHB(COL3) AS "컬럼3"
    FROM TEMP01;

 

B. VARCHAR2(n [BYTE|CHAR])

  - 가변길이 문자열을 저장
  - 최대 4000BYTE까지 저장 가능
  - 나머지 특징은 CHAR과 동일
  - VARCHAR와 VARCHAR2는 저장방식이 동일
  - NVARCHAR2, NVARCHAR는 데이터 UTF-8, UTF-16방식으로 저장(다국어 지원)

사용예)
    CREATE TABLE TEMP02(
        COL1 CHAR(50),
        COL2 VARCHAR(2000),
        COL3 VARCHAR2(2000 BYTE),
        COL4 VARCHAR2(2000 CHAR));
    
    INSERT INTO TEMP02 VALUES('IL POSTINO Massimo Troisi',
                              'IL POSTINO Massimo Troisi','IL POSTINO Massimo Troisi',
                              'IL POSTINO Massimo Troisi');
        
    SELECT * FROM TEMP02;

 

C. LONG

  - 가변길이 문자열 저장
  - 최대 2GB 까지 저장 가능
  - 한 테이블에 하나의 컬럼에서만 사용 가능(단점)
  - 현재 기능 개선이 중단되어있음 => CLOB타입으로 대체 사용 권고
  - 일부 기능은 큰 크기로 인하여 사용할 수 없음(LENGTHB나 SUBSTR 등)
  - SELECT문의 SELECT절, UPDATE문의 SET절, INSERT문의 VALUES절에서 사용 가능

사용예) 
  CREATE TABLE TEMP03(
    COL1 VARCHAR2(4000),
    COL2 LONG);
        
  INSERT INTO TEMP03 VALUES('PERSIMMION APPLE BANANA', 'PERSIMMON APPLE BANANA');
    
  SELECT LENGTHB(COL1)
         --LENGTHB(COL2)
    FROM TEMP03;

  SELECT SUBSTR(COL1,11,5)
         -- SUBSTA(COL2,11,5)
    FROM TEMP03;

 

D. CLOB (Character Large OBject)

  - 가변길이 문자열 저장
  - 최대 4GB 저장 가능하며 한 테이블에 복수개의 CLOB 컬럼 생성 가능
  - 일부 기능들은 DBMS_LOB API 지원을 받아야 사용할 수 있음(LENGTHB는 LONG타입과 CLOB타입 모두 사용 불가)

사용예) 
  CREATE TABLE TEMP04(
    COL1 VARCHAR2(4000),
    COL2 CLOB,
    COL3 CLOB);
        
  INSERT INTO TEMP04 VALUES('PERSIMMON APPLE BANANA', 'PERSIMMON APPLE BANANA','PERSIMMON APPLE BANANA');
    
  SELECT * FROM TEMP04;

  SELECT LENGTH(COL1),
         LENGTH(COL2),
         DBMS_LOB.GETLENGTH(COL2),
         LENGTH(COL3)
    FROM TEMP04;

  SELECT SUBSTR(COL1,11,5),
         SUBSTR(COL2,11,5),
         DBMS_LOB.SUBSTR(COL2,5,11)
    FROM TEMP04;

 

2. 숫자 자료형

  - 정수와 실수를 저장

  - NUMBER 타입 제공

(사용형식)
컬럼명 NUMBER[(정밀도|* [,스케일])]

- '정밀도' : 전체 자리수
-  '스케일' : 소숫점 이하의 자리 수
-  표현(저장) 범위 : 1.0E-130 ~ 9.99...9E+125('9'의 갯수 38개)
-  정밀도 대신 '*'가 사용되면 시스템에서 사용자가 기술한 자료를 저장하기 위한 최소한의 자리를 확보 함
- 저장방식은 소숫점 이하 '스케일'+1번째 자리에서 반올림하여 '스케일'자리까지 저장
- 정수부분의 자리수가 부족하면 오류
- 스케일이 음수이면 정수부분의 스케일 위치에서 반올림
- 스케일이 생략되면 0으로 간주

사용예)
-------------------------------------------------
입력 값         선언              기억되는 값
-------------------------------------------------
123456.7895    NUMBER           123456.7895
123456.7895    NUMBER(*,2)      123456.79
123456.7895    NUMBER(7,2)      오류
123456.7895    NUMBER(8,2)      123456.79
123456.7895    NUMBER(8.0)      123457
123456.7895    NUMBER(8)        123457
123456.7895    NUMBER(8, -2)    123500
-------------------------------------------------
  CREATE TABLE TEMP05(
    COL1 NUMBER,
    COL2 NUMBER(*,2),
    COL3 NUMBER(7,2),
    COL4 NUMBER(8,2),
    COL5 NUMBER(8,0),
    COL6 NUMBER(8),
    COL7 NUMBER(8,-2));
        
  INSERT INTO TEMP05 VALUES (123456.7895, 123456.7895,23456.7895,123456.7895,123456.7895,123456.7895,123456.7895);
  
  SELECT * FROM TEMP05;

 

3. 날짜 자료형

  - 날짜자료(년,월,일,시,분,초)저장
  - 기본형인 DATE 타입과, TIMESTAMP형 제공된

 

A. DATE

  - 기본 날짜 자료형

  - '+'과 '-'연산의 대상이 될 수 있슴('*', '/'은 수행할 수 없음)

  - 출력시 시,분,초는 별도 FORMAT 문자열을 사용해야 출력 됨 

(사용형식)
    컬럼명 DATE

** SYSDATE 함수 : 시스템에서 제공하는 날짜자료 변환

 

  CREATE TABLE TEMP06 (
    COL1 DATE,
    COL2 DATE,
    COL3 DATE);
    
  INSERT INTO TEMP06 VALUES(SYSDATE, SYSDATE-15, SYSDATE+25);
  SELECT * FROM TEMP06;

(시간표시)
    SELECT TO_CHAR(COL1, 'YYYY-MM-DD HH24:MI:SS'),
           TO_CHAR(COL2, 'YYYY-MM-DD HH24:MI:SS'),
           TO_CHAR(COL3, 'YYYY-MM-DD HH24:MI:SS')
      FROM TEMP06;

 

B. TIMESTAMP

  - 기본 년,월,일,시,분,초 정보 제공
  - 초는 밀리초 단위의 시각정보 제공

  - 시간대역(TIME ZONE) 정보를 제공

 

(사용형식)
    컬럼명 TIMESTAMP -- 시간대역 정보 없음
    컬럼명 TIMESTAMP WITH LOCAL TIME ZONE -- 로컬서버의 시간대역 정보 => TIMESTAMP와 동일
    컬럼명 TIMESTAMP WITH TIME ZONE -- 서버가 위치한 지역의 시간대 정보 제공
사용예)
  CREATE TABLE TEMP07(
    COL1 TIMESTAMP,
    COL2 TIMESTAMP WITH LOCAL TIME ZONE,
    COL4 TIMESTAMP WITH TIME ZONE);
    
  INSERT INTO TEMP07 VALUES(SYSTIMESTAMP, SYSTIMESTAMP, SYSTIMESTAMP);
  INSERT INTO TEMP07 VALUES(SYSDATE, SYSDATE, SYSDATE);
    
  SELECT * FROM TEMP07;

 

4. 기타 자료형

  - 오라클에서 사용될 2진수를 저장하는 데이터 타입
  - 기타 자료형으로 저장된 자료는 오라클에 의해 해석되거나 변환되지 않음
  - RAW, BFILE, BLOB 타입이 제공됨
  - 주로 멀티미디어 자료 저장에 사용

 

A. RAW

  - 비교적 작은 양의 이진 정보를 저장
  - 최대 2000 BYTE까지 저장
  - 주로 음성, 이미지 자료 저장
  - 인덱스 처리 가능

(사용형식)
  컬럼명 RAW(크기) -- 저장은 2진수와 16진수만 가능
사용예)
  CREATE TABLE TEMP08(
    COL1 RAW(1000),
    COL2 RAW(500));
        
  INSERT INTO TEMP08 VALUES('3C7A', HEXTORAW('3C7A'));
  INSERT INTO TEMP08 VALUES('001111000011111010', '3C7A');
    
  SELECT * FROM TEMP08;

 

B. BFILE

  - 이진자료 저장
  - 저장될 원본자료는 데이터베이스 밖에 저장되고 테이블에는 경로와 파일명 정보만 저장
  - 최대 4GB까지 저장

(사용형식)
    칼럼명 BFILE
(사용예)
  1)테이블 및 그림파일 준비
  CREATE TABLE TEMP09(
    COL1 BFILE);
    
  2) 디렉토리객체 생성
  CREATE OR REPLACE DIRECTORY 디렉토리객체명 As 경로명
        
  CREATE OR REPLACE DIRECTORY TEST_DIR As 'D:\A_TeachingMaterial\Orcle';  
  
  3) 그림자료 입력(삽입)
  INSERT INTO TEMP09 (COL1) VALUES (BFILENAME('TEST_DIR','sample.jpg'));
        
  SELECT * FROM TEMP09;

 

C. BLOB(Binary Large OBject)

  - 이진자료 저장
  - 저장될 원본자료가 데이터베이스 내부에 직접 저장
  - 최대 4GB까지 저장

(사용형식)
    컬럼명 BLOB
(사용예)
  1)테이블생성 및 그림파일 준비
  CREATE TABLE TEMP10(
    COL1 BLOB);
            
  2)익명블록 등 PL/SQL을 이용하여 입력 모듈 작성
  DECLARE
      L_DIR VARCHAR2(20) := 'TEST_DIR';
      L_FILE VARCHAR2(30) := 'sample.jpg';
      L_BFILE BFILE;
      L_BLOB BLOB;
            
  BEGIN
      INSERT INTO TEMP10(COL1)VALUES(EMPTY_BLOB())
        RETURN COL1 INTO L_BLOB;
            
      L_BFILE:=BFILENAME(L_DIR,L_FILE);
      DBMS_LOB.FILEOPEN(L_BFILE,DBMS_LOB.FILE_READONLY);
      DBMS_LOB.LOADFROMFILE(L_BLOB,L_BFILE,DBMS_LOB.GETLENGTH(L_BFILE));
      DBMS_LOB.FILECLOSE(L_BFILE);
            
      COMMIT;
  END;
        
  SELECT * FROM TEMP10;