본문 바로가기
[ Developer ]/DB2

[DB2] DB2 vs Oracle 차이점

by 김현섭. 2018. 11. 7.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
DB2 vs Oracle 데이터 타입 차이점


Data Type
오라클 DB와 DB2의 데이터 타입의 차이점
. DB2 : 데이터 타입은 사용자 편의보다는 옵티마이저가 가장 잘 해석하도록 세분화되어 있다.

 Oracle Data Type
 DB2 Data Type
Scope(DB2) 
 CHAR(n)
 CHAR(n)
 254 bytes
 VARCHAR(n)
 VARCHAR(n)
 32,672 bytes
 LONG
 LONG VARCHAR(n)
 32,700 bytes
 NUMBER
 SMALLINT 
 + - 32,768 (5 digits, 2byte)
 
 INTEGER
 2 147 483 648 ( 10 digitx, 4byte)
 
 BIGINT
 9,233,372,036,854,775,808
(64bit integers, 8byte)
 
 DECIMAL(p,s)
 NUMERIC(p,s)
 정밀도 31 
 
 REAL
 
 
 DOUBLE(FLOAT)
 +2.225E-307 
 BLOB
 BLOB(n)
 2GB
 CLOB
 CLOB(n)
 2GB
 NCLOB
 DBCLOB
 2GB
 DATE
 TIMESTAMP
 0001-01-01-00.00.00.000000
 
 DATE
 0001-01-01~9999-12-31
 
 TIME
 00:00:00~24:00:00
 
 
 

 
DB2는 오라클 DB에서와 같이 숫자와 문자간 자동 형 변환을 지원하지 않는다. 따라서 문자와 숫자간 비교나 조인시 반드시 CAST, INT, CHAR 함수 등으로 형 변환을 해주어야 한다.
 
DB2에서의 날짜 계산
1. TO_CHAR() 함수
  : DB2에도 오라클 DB의 TO_CHAR()와 동일한 함수는 있으나 오라클 DB에서와 같이 날짜 형식의 다양한 포맷팅을 지원하지 않는다. 오라클 DB의 TO_CHAR()함수를 쓰기 위해서는 별도의 UDF가 필요하다.
 
2. SYSDATE(ORACLE) -> CURRENT DATE(현재날짜), CURRENT TIMESTAMP(현재 시간소인)
 
3. HEX(CURRENT DATE)
  : 문자열 YYYYMMDD 형식
 
4. DATE/YEAR/MONTH/DAY 함수
  : 입력된 시간소인(혹은 날짜형식 문자열)에 날짜(DATE YYYY-MM-DD), 년도(YEAR YYYY), 월(MONTH MM 2월인 경우 02가 아니고 2로 표시), 일(DAY DD)로 변환하는 SCALAR 함수
 
5. 날짜 더하기 / 빼기 / "+/- n days", "+/- months", "+/- years"
  : ex)current date + 1 months
 
6. 날짜끼리 뺄 경우 결과는 YYYYMMDD(decimal(8,0)) 형식으로 두 일자 사이의 기간을 나타나게 된다.
 
7. 날짜 포멧 변경
  : CHAR(CURRENT DATE, ISO) ? 2008-01-01
  : CHAR(CURRENT DATE, EUR) ? 01.01.2008
  : CHAR(CURRENT DATE, USA) ? 01/01/2008
 
Page navigation 을 위한 Row Number
 
OLAP 함수인 row_number() over(order by 컬럼이름) 로 대체해서 사용해야 한다.
 
ex) SELECT EMPNO, FULLNAME
     FROM (SELECT EMPNO , FIRSTNAME || '' ||LASTNAME AS FULLNAME,
                             row_number() over(order by empno) AS R_NUM
                FROM EMPLOYEE ) AS T1
     WHERE R_NUM >= 10 AND R_NUM < 20
 
Dummy Table
Sysibm.sysdummy1 (DB2)
select * from sysibm.sysdummy1
 
Truncate Table
DB2에서는 오라클 DB에서의 Truncate table이 존재하지 않는다. DB2에서 테이블의 데이터를 효율적으로 지우는 방법은 아래와 같다.
ex) IMPORT FROM /DEV/NULL OF DEL REPLACE INTO 테이블이름
     ALTER TABLE 테이블이름 ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE
 
DECODE문
DECODE문은 지원하지 않는다. CASE문으로 대체해야 한다.
 

 ORACLE
 UPDATE STAFF
 SET COMM = SALARY + DECODE(JOB,'MGR',100,0)
 DB2
 UPDATE STAFF
 SET COMM = SALARY + CASE JOP
 WHEN 'MGR' THEN 100 ELSE 0 END

 
NULL 처리

 ORACLE
 DB2
 NVL(TO_CHAR(MGR_ID),'No Manager')
 COALESCE(MGR_ID,'No Manager')
 VALUE(MGR_ID,'No Manager')

 
OUTER JOIN

 ORACLE
 DB2
 SELECT A.LAST_NAME, A.ID, B.NAME
 FROM EMP A, CUSTOMER B
 WHERE A.ID(+) = B.SALES_REP_ID;
 SELECT A.LAST_NAME, A.ID, B.NAME
 FROM EMP A
           RIGHT OUTER JOIN CUSTOMER B
           ON A.ID = B.SALES_REP_ID;
 SELECT A.LAST_NAME, A.ID, B.NAME
 FROM EMP A, CUSTOMER B
 WHERE A.ID(+) = B.SALES_REP_ID(+);
 SELECT A.LAST_NAME, A.ID, B.NAME
 FROM EMP A
 FULL OUTER JOIN CUSTOMER B
 ON A.ID = B.SALES_REP_ID;


'[ Developer ] > DB2' 카테고리의 다른 글

[DB2] DB2 SQLCODE SQLSTATE 목록  (0) 2017.11.24