행위

DB2 오라클 비교

DB CAFE

DBCAFE (토론 | 기여)님의 2018년 11월 1일 (목) 12:28 판 (새 문서: 출처: 디비가이드넷 http://www.dbguide.net/db.db?cmd=view&boardUid=153428&boardConfigUid=9&categoryUid=216&boardIdx=150&boardStep=1 == 오라클 호완성 지원 == === 아...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)
thumb_up 추천메뉴 바로가기


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

1 오라클 호완성 지원[편집]

1.1 아키텍처 비교[편집]

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

db2

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

db2

1.2 아키텍처 비교[편집]

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

db2

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

db2

1.3 아키텍처 비교[편집]

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

db2

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

db2

1.4 오라클에 대한 호환성 지원[편집]

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

db2

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

db2

1.5 오라클에 대한 호환성 지원[편집]

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

$ db2set DB2_COMPATIBILITY_VECTOR=ORA --FFF 값도 동일한 기능 수행 $ db2stop $ db2start DB2 9.7에서 오라클 호환성 지원중 일부 기능만 설정하는 경우 (varchar2 지원 설정 예시)

db2

1.6 CLPPlus 유틸리티[편집]

CLPPlus 명령어 수행 방법

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

db2

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

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


1.7 오라클 데이터 타입 사용[편집]

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

db2

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

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

1.8 오라클 데이터 타입 사용[편집]

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

db2

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

db2

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

대입 : set salary := ‘52000’ 비교: where salary > ‘52000’ 이어 붙히기(concat): ‘salary:’|| 52000 오라클 함수 사용 DB2 9.7에서 추가 지원되는 Built-in 함수 목록입니다

db2

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

db2

1.9 오라클 함수 사용[편집]

오라클의 sysdate를 사용하는 예시 (DB2:current date)

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.10 오라클 함수 사용[편집]

오라클의 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.11 오라클 함수 사용[편집]

오라클의 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.12 오라클 함수 사용[편집]

오라클의 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.13 오라클의 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.14 오라클 PL/SQL 사용[편집]

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

db2

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의 ‘/’ 종결문자를 사용할 수 있습니다.

db2

1.15 오라클 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.16 커서 처리 조건 처리 예시[편집]

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.17 오라클의 커서 조건 문입니다[편집]

db2

1.18 오라클 패키지 사용[편집]

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

db2

현재 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.19 오라클 패키지 사용[편집]

오라클 패키지 형식으로 컴파일 했는지, 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.20 오라클 패키지 사용[편집]

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.21 오라클 관리자 뷰[편집]

오라클 관리자 뷰에 대한 주석을 보려면 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