행위

DB2 오라클 비교

DB CAFE

출처: 디비가이드넷 http://www.dbguide.net/db.db?cmd=view&boardUid=153428&boardConfigUid=9&categoryUid=216&boardIdx=150&boardStep=1

1 DB2 의 오라클과의 호완성 지원

1.1 아키텍처 비교

아래 그림은 DB2와 오라클의 아키텍처 구성도입니다.

111124_pro_thumb368.jpg

DBMS의 역할을 수행하기 위해 다양한 프로세서로 구성됩니다.

111124_pro_thumb369.jpg

1.2 아키텍처 비교

DB2와 오라클의 사용 용어에 차이가 있습니다.

111124_pro_thumb370.jpg

오라클과 DB2에서 유사한 기능을 수행하는 명령문입니다

111124_pro_thumb371.jpg

1.3 아키텍처 비교

오라클과 DB2에서 유사한 기능을 수행하는 명령문입니다

111124_pro_thumb372.jpg

파라미터 변수 중 오라클과 유사한 DB2 파라미터 수치를 비교합니다.

111124_pro_thumb373.jpg

1.4 오라클에 대한 호환성 지원

오라클과 공통으로 사용되는 호환성 기능입니다

111124_pro_thumb374.jpg

DB2 9.7에서 오라클 호환성 지원을 위한 데이터 유형

111124_pro_thumb375.jpg

1.5 오라클에 대한 호환성 지원

DB2 9.7에서 오라클 호환성 기능을 전부 설정하는 경우

$ db2set DB2_COMPATIBILITY_VECTOR=ORA
--FFF 값도 동일한 기능 수행
$ db2stop
$ db2start

DB2 9.7에서 오라클 호환성 지원중 일부 기능만 설정하는 경우 (varchar2 지원 설정 예시)

111124_pro_thumb376.jpg

1.6 CLPPlus 유틸리티

CLPPlus 명령어 수행 방법

$ clpplus id/password

CLPPlus에서는 오라클의 SQL*plus 명령어를 그대로 수행합니다.

111124_pro_thumb377.jpg

db2

CLPPlus에서 입력 화일명에 있는 명령어 수행결과를 화일로 저장할 수 있습니다.

$ db2 -x -td@ -f 입력화일명 -z 출력화일명

1.7 오라클 데이터 타입 사용

사용 가능한 오라클의 데이터 타입입니다

111124_pro_thumb378.jpg


오라클과 데이터 타입 사용 예시입니다. 샘플 테이블을 생성 합니다.

CREATE TABLE emp_test (
empno NUMBER,
ename VARCHAR2(10),
hiredate DATE,
sal NUMBER(7,2))

생성한 테이블 결과입니다.

SELECT COLNAME,TYPENAME,LENGTH,SCALE
FROM SYSCAT.COLUMNS where TABNAME ='EMP_TEST'
ORDER BY COLNO
COLNAME TYPENAME LENGTH SCALE
---------- ----------- --------- --------
EMPNO DECFLOAT 8 0
ENAME VARCHAR 10 0
HIREDATE TIMESTAMP 7 0
SAL DECIMAL 7 2
</sql>
=== 오라클 데이터 타입 사용 === 

오라클과 유사한 Syntax을 사용하는 DB2 9.7 데이터 타입을 살펴봅니다.

http://www.dbguide.net/publishing/img/dbguide/db2_operation_guide/111124_pro_thumb379.jpg

오라클과 유사한 Cursor data type 에 대하여 살펴봅니다.

http://www.dbguide.net/publishing/img/dbguide/db2_operation_guide/111124_pro_thumb380.jpg

DB2 9.7에서는 다른 데이터 타입 비교시 느슨한 묵시적 형 변환을 적용합니다.

대입 : set salary := ‘52000’
비교: where salary > ‘52000’
이어 붙히기(concat): ‘salary:’|| 52000

=== 오라클 함수 사용 ===
DB2 9.7에서 추가 지원되는 Built-in 함수 목록입니다

http://www.dbguide.net/publishing/img/dbguide/db2_operation_guide/111124_pro_thumb381.jpg

오라클의 SQL문 지원 항목을 살펴봅니다.

http://www.dbguide.net/publishing/img/dbguide/db2_operation_guide/111124_pro_thumb382.jpg

=== 오라클 함수 사용 === 

오라클의 sysdate를 사용하는 예시 (DB2:current date)
<source lang=sql>
select sysdate as ora_compa, CURRENT DATE as db2_origin from
dual
ORA_COMPA DB2_ORIGIN
---------------------- ---------------------- 
2009. 8. 10 오후 8:42:29 2009. 8. 10 오후 8:42:29

오라클의 to_char를 사용하는 경우(DB2: char)

select TO_CHAR(sysdate,'YYYY-MM-DD.hh.mm.ss') as ora_compa ,
char(current date) as db2_origin from dual
ORA_COMPA DB2_ORIGIN
------------------- -------------------
2009-08-10.10.08.19 2009-08-10-22.08.19

current date 함수 실행 시 DB2 9.7과 DB2 9.1에서 다른 결과를 보여주는 경우입니다

-- 9.7에서 oracle 호환모드 적용
values (CHAR(current date))
1
-------------------
2009-08-10-22.05.16
-- 9.1에서의 SQL문
values (CHAR(current date))
1
----------
2009-06-09

1.8 오라클 함수 사용

오라클의 nvl 함수를 사용하는 예시 (DB2: coalesce)

SELECT DEPTNO , MGRNO,NVL(MGRNO, 'ABSENT') as ora_compa,
COALESCE(MGRNO, 'ABSENT') as db2_origin
FROM DEPARTMENT
DEPTNO MGRNO ORA_COMPA DB2_ORIGIN
--------- -------- ------------ -------------
A00 000010 000010 000010
…D
01 (null) ABSENT ABSENT

오라클의 decode 함수를 사용하는 예시 (DB2: case문)

select deptno, decode (deptno,'B01','AAA','ZZZ' ) as ora_compa,
case when deptno = 'B01' then 'AAA' else 'ZZZ' end as db2_origin
from department
DEPTNO ORA_COMPA DB2_ORIGIN
--------- ------------ -------------
A00 ZZZ ZZZ
B01 AAA AAA
C01 ZZZ ZZZ

오라클의 rownum 함수를 사용하는 예시 (DB2: fetch first n rows only)

select a.empno, a.ora_compa, b.db2_origin
from
(select empno,firstnme as ora_compa from emp where rownum <=2) a ,
(select empno,firstnme as db2_origin from emp fetch first 2 row only) b
where a.empno=b.empno
EMPNO ORA_COMPA DB2_ORIGIN
-------- ------------ -------------
000010 CHRISTINE CHRISTINE
000020 MICHAEL MICHAEL

1.9 오라클 함수 사용

오라클의 last_day,add_months,dayofyear 함수를 사용하는 예시

select last_day(current date ) as last_day ,
add_months (current date , 1) as add_months ,
dayofyear(current date)
from dual
LAST_DAY ADD_MONTHS 3
----------------------- ----------------------- ----
2009. 8. 31 오후 11:28:48 2009. 9. 10 오후 11:28:48 222

오라클의 lower 함수를 사용하는 예시 (DB2: lcase)

select deptno, lower(deptno) as ora_compa , lcase(deptno) as
db2_origin from dept
DEPTNO ORA_COMPA DB2_ORIGIN
--------- ------------ -------------
A00 a00 a00
B01 b01 b01
C01 c01 c01
D01 d01 d01

조회데이타를 기준으로 이후 데이터를 가져오는 Lead 함수, 조회데이타를 기준으로 이전 데이터를 가져오는 lag함수를 사용하는 예시

SELECT empno, FIRSTNME,bonus,
LEAD(bonus,1) OVER (ORDER BY bonus) AS next_sal,
LAG(bonus,1) OVER (ORDER BY bonus) AS prev_sal
FROM emp
WHERE workdept='A00'
EMPNO FIRSTNME BONUS NEXT_SAL PREV_SAL
-------- ----------- -------- ----------- -----------
000120 SEAN 600 600 (null)
200120 GREG 600 900 600
000110 VINCENZO 900 1000 600
000010 CHRISTINE 1000 1000 900
200010 DIAN 1000 (null) 1000

1.10 오라클 함수 사용

오라클의 connect by 함수를 사용하는 예시

FROM dept
WHERE DEPTNAME NOT LIKE 'BRANCH%'
START WITH DEPTNO= 'E01'
CONNECT BY PRIOR deptno= admrdept
LEVEL DEPTNO DEPTNAME ADMRDEPT
-------- --------- ---------------- -----------
1 E01 SUPPORT SERVICES A00
2 E11 OPERATIONS E01
2 E21 SOFTWARE SUPPORT E01

1.11 오라클의 lpad 함수를 사용하는 예시

select deptno, lower(deptno) as ora_compa , lcase(deptno) as
db2_origin from dept
DEPTNO ORA_COMPA DB2_ORIGIN
--------- ------------ -------------
A00 a00 a00
B01 b01 b01
C01 c01 c01
D01 d01 d01

1.12 오라클 PL/SQL 사용

DB2 9.7에서 오라클 PL/SQL 코드는 DB2 엔진의 전용 컴파일러를 사용합니다.

111124_pro_thumb383.jpg

DB2 오브젝트에서 or replace 옵션을 사용할 수 있습니다.

CREATE [OR REPLACE] FUNCTION
CREATE [OR REPLACE] PROCEDURE
CREATE [OR REPLACE] PACKAGE
CREATE [OR REPLACE] TRIGGER
CREATE [OR REPLACE] VIEW

세센에서 ‘PL/SQL의 ‘/’ 종결문자를 사용할 수 있습니다.

111124_pro_thumb384.jpg

1.13 오라클 PL/SQL 사용

오라클의 PL/SQL의 데이터 타입 선언과 DB2 9.7에서 새로 추가된 anchor문 비교 예시

create or replace procedure emp_output as
declare
v_empno emp.empno%TYPE; -- v_empno anchor emp.empno;
v_ename emp.FIRSTNME%TYPE; -- v_ename anchor emp.FIRSTNME;
v_deptno emp.workdept%TYPE; -- v_deptno anchor emp.workdept;
v_sal emp.salary%TYPE; -- v_sal anchor emp.salary;
v_answer varchar(20);
begin 
select empno, FIRSTNME, workdept, salary,
case WHEN salary < 2000 THEN 'BAD'
WHEN (salary > 2000 and salary < 3000) THEN 'GOOD'
ELSE 'VERYGOOD'
end
Into
v_empno, v_ename, v_deptno, v_sal, v_answer
from emp
where empno ='000010';
dbms_output.put_line(v_empno||' '|| v_ename||' '||v_deptno||'
'||to_char(v_sal)||' '|| v_answer);
end; /

1.14 커서 처리 조건 처리 예시

CREATE OR REPLACE PROCEDURE list_emp
IS
v_empno NUMBER(4);
v_ename VARCHAR2(10);
CURSOR emp_cur IS
SELECT empno, ename FROM emp ORDER BY empno;
BEGIN
OPEN emp_cur;
DBMS_OUTPUT.PUT_LINE('EMPNO ENAME');
DBMS_OUTPUT.PUT_LINE('----- -------');
LOOP
FETCH emp_cur INTO v_empno, v_ename;
EXIT WHEN emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_empno || ' ' || v_ename);
END LOOP;
CLOSE emp_cur;
END

1.15 오라클의 커서 조건 문입니다

111124_pro_thumb385.jpg

1.16 오라클 패키지 사용

현재 DB2 9.7에서 사용 가능한 오라클 내장 패키지 입니다.

111124_pro_thumb386.jpg

현재 DB2 9.7에서 사용 가능한 오라클 패키지를 쿼리문으로 확인합니다

select MODULEID , MODULENAME from SYSCAT.MODULES
MODULEID MODULENAME
----------- -------------
1 DBMS_OUTPUT
2 DBMS_ALERT
3 DBMS_PIPE
4 DBMS_JOB
5 DBMS_LOB
6 DBMS_SQL
7 DBMS_UTILITY
8 UTL_DIR
9 UTL_FILE
10 UTL_ENCODE
11 UTL_TCP
12 UTL_SMTP
13 UTL_MAIL
14 DBMS_STANDARD

1.17 오라클 패키지 사용

오라클 패키지 형식으로 컴파일 했는지, DB2 모듈로 컴파일 되었는지 확인이 가능합니다.

SQL> SELECT MODULENAME, DIALECT , MODULETYPE , REMARKS
FROM SYSCAT.MODULES WHERE MODULESCHEMA = 'SCOTT‘
MODULENAME DIALECT MODULETYPE REMARKS
------------- ---------- ------------- -------------------
EMP_ADMIN PL/SQL P PL/SQL Package Body
MOD_TEST1 DB2 SQL PL M (null)

오라클 패키지(DB2 모듈)에 어떤 오브젝트가 포함되어 있는지 확인이 가능합니다.

SELECT OBJECTMODULENAME , OBJECTNAME
FROM SYSCAT.MODULEOBJECTS
OBJECTMODULENAME OBJECTNAME
------------------- ---------------------------------------
DBMS_ALERT MAXWAIT
DBMS_PIPE MAXWAIT
DBMS_JOB ANY_INSTANCE
DBMS_LOB DEFAULT_CSID
DBMS_LOB DEFAULT_LANG_CTX
DBMS_LOB FILE_READONLY

1.18 오라클 패키지 사용

DBMS_OUTPUT 패키지(DB2 모듈) 사용 예시

CREATE OR REPLACE PROCEDURE list_emp
IS
v_empno NUMBER(4);
v_ename VARCHAR2(10);
CURSOR emp_cur IS
SELECT empno, ename FROM emp ORDER BY empno;
BEGIN
OPEN emp_cur;
DBMS_OUTPUT.PUT_LINE('EMPNO ENAME');
DBMS_OUTPUT.PUT_LINE('----- -------');
LOOP
FETCH emp_cur INTO v_empno, v_ename;
EXIT WHEN emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_empno || ' ' || v_ename);
END LOOP;
CLOSE emp_cur;
END
  • DBMS_OUTPUT 패키지 수행 결과
db2inst1@PROD:~> db2 "set serveroutput on"
? output 설정 on으로 아래 명령어가 수행됨
CALL DBMS_OUTPUT.ENABLE( 50000 )
db2inst1@PROD:~> db2 "call scott.list_emp“
Return Status = 0
EMPNO ENAME
----- -------
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
…
)

1.19 오라클 관리자 뷰

오라클 관리자 뷰에 대한 주석을 보려면 sysibmadm.dictionary를 참조하세요

$ db2 “select table_name, substr(comments,1,50) from
sysibmadm.dictionary”
--------------------- -----------------------------------------------
DBA_ARGUMENTS Arguments in all objects in the database
ALL_ARGUMENTS Arguments in objects accessible to the user
USER_ARGUMENTS Arguments in objects owned by the user
DBA_CATALOG All database tables, views and synonyms
ALL_CATALOG All accessible tables, views and synonyms
USER_CATALOG All user's own tables, views and synonyms
DBA_COL_COMMENTS Comments on columns of all tables and views
ALL_COL_COMMENTS Comments on columns of accessible tables and views
USER_COL_COMMENTS Comments on columns of user's tables and views
DBA_CONS_COLUMNS Information about all columns in constraint defini
ALL_CONS_COLUMNS Information about columns in constraint definition
USER_CONS_COLUMNS Information about columns in constraint definition
DBA_CONSTRAINTS Constraint definitions on all tables

오라클에서 자주 사용하는 테이블 리스트 현황 보기 예시 쿼리

$db2 “SELECT * FROM TAB” -- SYSIBMADM.TAB
$db2 ”SELECT * FROM TABS” -- SYSIBMADM.USER_TABLES
TSCHEMA TNAME TABTYPE
------------- ----------- ----------------------
ADMINISTRATOR CL_SCHED TABLE
ADMINISTRATOR DEPARTMENT TABLE
ADMINISTRATOR DEPT SYNONYM
ADMINISTRATOR EMPLOYEE TABLE
ADMINISTRATOR EMP SYNONYM
ADMINISTRATOR EMP_PHOTO TABLE
ADMINISTRATOR EMP_RESUME TABLE
ADMINISTRATOR PROJECT TABLE
ADMINISTRATOR PROJ SYNONYM
ADMINISTRATOR PROJACT TABLE
ADMINISTRATOR EMPPROJACT TABLE