DBMS 2
DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!
아래 그림은 DB2와 오라클의 아키텍처 구성도입니다. DBMS의 역할을 수행하기 위해 다양한 프로세서로 구성됩니다. DB2와 오라클의 사용 용어에 차이가 있습니다. 오라클과 DB2에서 유사한 기능을 수행하는 명령문입니다 오라클과 DB2에서 유사한 기능을 수행하는 명령문입니다 파라미터 변수 중 오라클과 유사한 DB2 파라미터 수치를 비교합니다. 오라클과 공통으로 사용되는 호환성 기능입니다 DB2 9.7에서 오라클 호환성 지원을 위한 데이터 유형 DB2 9.7에서 오라클 호환성 기능을 전부 설정하는 경우 DB2 9.7에서 오라클 호환성 지원중 일부 기능만 설정하는 경우 (varchar2 지원 설정 예시) CLPPlus 명령어 수행 방법 CLPPlus에서는 오라클의 SQL*plus 명령어를 그대로 수행합니다. CLPPlus에서 입력 화일명에 있는 명령어 수행결과를 화일로 저장할 수 있습니다. 사용 가능한 오라클의 데이터 타입입니다 오라클과 데이터 타입 사용 예시입니다. 샘플 테이블을 생성 합니다. 생성한 테이블 결과입니다. 오라클과 유사한 Syntax을 사용하는 DB2 9.7 데이터 타입을 살펴봅니다. 오라클과 유사한 Cursor data type 에 대하여 살펴봅니다. DB2 9.7에서는 다른 데이터 타입 비교시 느슨한 묵시적 형 변환을 적용합니다. DB2 9.7에서 추가 지원되는 Built-in 함수 목록입니다 오라클의 SQL문 지원 항목을 살펴봅니다. 오라클의 sysdate를 사용하는 예시 (DB2:current date) 오라클의 to_char를 사용하는 경우(DB2: char) current date 함수 실행 시 DB2 9.7과 DB2 9.1에서 다른 결과를 보여주는 경우입니다 오라클의 nvl 함수를 사용하는 예시 (DB2: coalesce) 오라클의 decode 함수를 사용하는 예시 (DB2: case문) 오라클의 rownum 함수를 사용하는 예시 (DB2: fetch first n rows only) 오라클의 last_day,add_months,dayofyear 함수를 사용하는 예시 오라클의 lower 함수를 사용하는 예시 (DB2: lcase) 조회데이타를 기준으로 이후 데이터를 가져오는 Lead 함수, 조회데이타를 기준으로 이전 데이터를 가져오는 lag함수를 사용하는 예시 오라클의 connect by 함수를 사용하는 예시 오라클의 lpad 함수를 사용하는 예시 DB2 9.7에서 오라클 PL/SQL 코드는 DB2 엔진의 전용 컴파일러를 사용합니다. DB2 오브젝트에서 or replace 옵션을 사용할 수 있습니다. 세센에서 ‘PL/SQL의 ‘/’ 종결문자를 사용할 수 있습니다. 오라클의 PL/SQL의 데이터 타입 선언과 DB2 9.7에서 새로 추가된 anchor문 비교 예시 커서 처리 조건 처리 예시 오라클의 커서 조건 문입니다 현재 DB2 9.7에서 사용 가능한 오라클 내장 패키지 입니다. 현재 DB2 9.7에서 사용 가능한 오라클 패키지를 쿼리문으로 확인합니다 오라클 패키지 형식으로 컴파일 했는지, DB2 모듈로 컴파일 되었는지 확인이 가능합니다. 오라클 패키지(DB2 모듈)에 어떤 오브젝트가 포함되어 있는지 확인이 가능합니다. DBMS_OUTPUT 패키지(DB2 모듈) 사용 예시 DBMS_OUTPUT 패키지 수행 결과 오라클 관리자 뷰에 대한 주석을 보려면 sysibmadm.dictionary를 참조하세요 오라클에서 자주 사용하는 테이블 리스트 현황 보기 예시 쿼리오라클 호완성 지원
오라클 호완성 지원
아키텍처 비교
아키텍처 비교
아키텍처 비교
오라클에 대한 호환성 지원
오라클에 대한 호환성 지원
--FFF 값도 동일한 기능 수행
$ db2stop
$ db2start
CLPPlus 유틸리티
오라클 데이터 타입 사용
empno NUMBER,
ename VARCHAR2(10),
hiredate DATE,
sal NUMBER(7,2))
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
오라클 데이터 타입 사용
비교: where salary > ‘52000’
이어 붙히기(concat): ‘salary:’|| 52000
오라클 함수 사용
오라클 함수 사용
dual
ORA_COMPA DB2_ORIGIN
---------------------- ----------------------
2009. 8. 10 오후 8:42:29 2009. 8. 10 오후 8:42:29
char(current date) as db2_origin from dual
ORA_COMPA DB2_ORIGIN
------------------- -------------------
2009-08-10.10.08.19 2009-08-10-22.08.19
values (CHAR(current date))
1
-------------------
2009-08-10-22.05.16
-- 9.1에서의 SQL문
values (CHAR(current date))
1
----------
2009-06-09
오라클 함수 사용
COALESCE(MGRNO, 'ABSENT') as db2_origin
FROM DEPARTMENT
DEPTNO MGRNO ORA_COMPA DB2_ORIGIN
--------- -------- ------------ -------------
A00 000010 000010 000010
…D
01 (null) ABSENT ABSENT
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
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
오라클 함수 사용
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
db2_origin from dept
DEPTNO ORA_COMPA DB2_ORIGIN
--------- ------------ -------------
A00 a00 a00
B01 b01 b01
C01 c01 c01
D01 d01 d01
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
오라클 함수 사용
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
db2_origin from dept
DEPTNO ORA_COMPA DB2_ORIGIN
--------- ------------ -------------
A00 a00 a00
B01 b01 b01
C01 c01 c01
D01 d01 d01
오라클 PL/SQL 사용
CREATE [OR REPLACE] PROCEDURE
CREATE [OR REPLACE] PACKAGE
CREATE [OR REPLACE] TRIGGER
CREATE [OR REPLACE] VIEW
오라클 PL/SQL 사용
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; /
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
오라클 패키지 사용
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
오라클 패키지 사용
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)
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
오라클 패키지 사용
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
? 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
…
)
오라클 관리자 뷰
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 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