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 |
---|