< 그림 1> 타입상속의예제 Person_T 이아닐경우에는첫번째입력인자를반환하고, 나의상위타입에서하나이상의하위타입은정의할수있다. 이들 해당함수에맞지않는경우에는두번째표현식에대해평가를계속하게된다. 즉, NULL이면 타입사이의상 / 하위관계를타입계층구조 (type hiera

Similar documents
목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

Spring Boot/JDBC JdbcTemplate/CRUD 예제

DBMS & SQL Server Installation Database Laboratory

JAVA PROGRAMMING 실습 08.다형성

PowerPoint Presentation

MySQL-.. 1

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

10.ppt

C++ Programming

Microsoft PowerPoint - additional08.ppt [호환 모드]

강의 개요

Spring Data JPA Many To Many 양방향 관계 예제

PowerPoint 프레젠테이션

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

´ÙÁß Row °á°ú¸¦ ´ÜÀÏÇàÀ¸·Î Äĸ¶·Î ºÐ¸®ÇØ Ãâ·ÂÇÏ´Â ¹æ¹ý

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - 10Àå.ppt

윈도우시스템프로그래밍

쉽게 풀어쓴 C 프로그래밊

PowerPoint Template

13주-14주proc.PDF

문서 템플릿

C# Programming Guide - Types

PowerPoint Presentation

Microsoft PowerPoint - 27.pptx

Design Issues

JVM 메모리구조

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O

gnu-lee-oop-kor-lec06-3-chap7

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

(Microsoft PowerPoint - java2-lecture3.ppt [\310\243\310\257 \270\360\265\345])

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

<C1A62038B0AD20B0ADC0C7B3EBC6AE2E687770>

JAVA PROGRAMMING 실습 05. 객체의 활용

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft Word - SQL튜닝_실습교재_.doc

TITLE

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

PowerPoint Presentation

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - Chapter 6.ppt

PowerPoint 프레젠테이션

다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL

17장 클래스와 메소드

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

Microsoft PowerPoint - 3장-MS SQL Server.ppt [호환 모드]

Microsoft Word - PLSQL.doc

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Microsoft PowerPoint - additional06.ppt [호환 모드]

컴파일러

Microsoft Word - 05_SUBPROGRAM.doc

설계란 무엇인가?

Slide 1

JDBC 소개및설치 Database Laboratory

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

5장 SQL 언어 Part II

ALTIBASE HDB Patch Notes

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint - additional01.ppt [호환 모드]

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - 2강

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

歯PLSQL10.PDF

PowerPoint 프레젠테이션

PowerPoint Presentation

C++ Programming

JUNIT 실습및발표

JAVA PROGRAMMING 실습 07. 상속

윈도우시스템프로그래밍

예제소스는 에서다운로드하여사용하거나툴바의 [ 새쿼리 ]( 에아래의소스를입력한다. 입력후에는앞으로실습을위해서저장해둔다. -- 실습에필요한 Madang DB 와 COMPANY DB 를모두생성한다. -- 데이터베이스생성 US

PowerPoint 프레젠테이션

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

슬라이드 제목 없음

PowerPoint 프레젠테이션

Microsoft PowerPoint - Java7.pptx

강의계획서 1. 강의개요 학습과목명 객체지향프로그래밍 Ⅰ 학점 3 학점교 강사명교 강사전화번호 강의시간 4시간강의실수강대상 2. 교과목학습목표 4차산업혁명시대의도래로컴퓨터와프로그래밍에대한관심이커지고있으며, 여러분야에서소프트웨어의중요성을강조하며, 새시대를이끌

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

Microsoft Word - [Unioneinc] 특정컬럼의 통계정보 갱신_ _ldh.doc

Microsoft PowerPoint - C++ 5 .pptx

I T C o t e n s P r o v i d e r h t t p : / / w w w. h a n b i t b o o k. c o. k r

슬라이드 1

Microsoft PowerPoint - chap11

Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터

5장. JSP와 Servlet 프로그래밍을 위한 기본 문법(완성-0421).hwp

PowerPoint Template

PowerPoint Presentation

ThisJava ..

11장 포인터

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

제8장 자바 GUI 프로그래밍 II

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint Python-DB

Transcription:

오라클9i에서는객체지향개념과관련해한걸음더나아가상속 (Inheritance), 타입진화 (Evolution), 멀티레벨컬렉션등의기능을지원한다. 특히상속개념은오라클9i를진정한의미의객체관계형 DBMS로자리잡게만들었다. 이글에서는개발자가오라클9i를기반으로새롭게개발할경우프로그램내부에추가로코딩할필요가없어진기능에대해알아본다. 장세국한국오라클 DB 기술팀장 sekook.jang@oracle.com 개발자를위한오라클 9i 의새로운기능 2 XML 과객체지향으로 날개단오라클 9i 개발환경 오 라클8i를인터넷데이터베이스라할수있었던이유는 ( 운영체제의 JVM과별도의 ) JVM을 DB에내장, EJB를이 용해애플리케이션의프리젠테이션과비즈니스로직을분리해보다효율적인 e비즈니스애플리케이션을구축할수있었기때문이다. 오라클9i에는여기서한단계더나아가 XML, 객체지향개념, 데이트타임 (datetime) 을강화해한층융통성있는 e 비즈니스애플리케이션을개발할수있도록지원한다. 기업의비즈니스가단지고객만을대상으로하는데에서벗어나 B2B, 국내시장에서벗어나일본과중국시장, 더나아가전세계로확대하기에이르렀다. 오라클9i에는이러한고객의요구를충족시킬수있는여러기능이새롭게추가돼개발자가보다쉽게애플리케이션을개발할수있게됐다. 시장확대를위해이중으로데이터베이스를구축할필요가없도록하나의데이터베이스에서지역적으로또는시간적으로떨어진고객에게도 24시간서비스할수있는기능이추가됐다. 일례로서 XML 문서자체를데이터베이스의한컬럼으로저장시켜 XPATH를이용해다양하게검색할수있는방법을들수있다. 또는전세계 57개언어, 88 지역, 200여개의문자셋을하나의필드에저장해통합지원, 개발을가능케했다. ANSI/ISO SQL 오라클9i는 ANSI/ISO SQL:1999 표준을수용한기능을제공한다. 가장대표적인것으로조인, CASE 표현식, 문장, 스칼라서브쿼리, 명시적디폴트등을들수있다. 이에따라기존코드를수정하지않고응용프로그램을이전할수있다. 또한 ANSI/ISO 표준을지원하기때문에다른데이터베이스로부터마이그레이션이쉽다. SQL문에서 CASE 표현방법은네가지가있다. 간단한 CASE 표현식, 검색 CASE 표현식, COALESCE 함수, NULLIF 함수가그것이다. 이가운데간단한 CASE 표현식은오라클 8.1.7부터제공했으며, 나머지는오라클9i에새로추가된것이다. 또한 CASE 표현식은 PL/SQL에서도지원하며표현식과문장으로분류된다. 간단한 CASE 표현식이것은오라클9i 이전의서버에서제공하던 DECODE 문장과유사하며, 주어진표현식에서검색하거나값을치환하는데사용할수있다. 또각각의검색값에대해반환되는값을명시할수있으나비교연산자는허용되지않는다. EMP 테이블에서각사원의근속년수를구하고이를화면에출력하는 SQL문과출력결과는다음과같다. SQL> SELECT ename, 2 (CASE EXTRACT(YEAR FROM hiredate) 3 WHEN 1982 THEN 3 years service 4 WHEN 1981 THEN 5 WHEN 1980 THEN 5 years service 6 END) AS Award for 2000 7 FROM emp 8 WHERE EXTRACT(YEAR FROM hiredate) IN (1982,1981,1980) 9 ORDER BY hiredate; 앞의간단한 CASE 표현식에대한출력결과는다음과같다. E Award for 2000 ---- --- SMITH 5 years service ALLEN WARD JONES BLAKE CLARK TURNER MARTIN KING JAMES FORD MILLER 3 years service 12 rows selected. 검색 CASE 표현식검색 CASE 표현식은 IFTHEN ELSE 구조와유사하며, 표현식내에서조건에따른검색과값을치환하는데사용할수있다. 각 WHEN 조건은논리적연산자 (AND, OR 등 ) 와결합돼사용할수있으며, 조건표현식에서비교연산자를사용할수있다. 따라서간단한 CASE 표현식보다는유연하다. 예를들어 EMP 테이블에서 Sal 컬럼의범위에따른영역을표현하는 SQL문과결과는다음과같다. SQL> SELECT empno, ename,(case 2 WHEN sal >= 5000 THEN High Sal 3 WHEN sal >= 3000 AND sal < 5000 THEN Middle Sal 4 WHEN sal >= 1000 AND sal < 3000 THEN Average Sal 5 WHEN sal < 1000 THEN Low Sal 6 END) AS Sal_Category 7 FROM emp; EMPNO E SAL_CATEGORY ---- - ----- 7369 SMITH Low Sal 7499 ALLEN Average Sal 7521 WARD Average Sal 7566 JONES Average Sal 7654 MARTIN Average Sal 7698 BLAKE Average Sal 7782 CLARK Average Sal 7788 SCOTT Middle Sal 7839 KING High Sal 7844 TURNER Average Sal 7876 ADAMS Average Sal 7900 JAMES Low Sal 7902 FORD Middle Sal 7934 MILLER Average Sal COALESCE 함수 COALESCE 함수는오라클의 NVL 함수를일반화한것이다. CASE문이포함된 SQL문에서 COALESCE 함수를사용할때해당함수의작업처리방법을보면첫번째입력인자가 NULL 210 m i c r o s o f t w a r e 2001.8 211

< 그림 1> 타입상속의예제 Person_T 이아닐경우에는첫번째입력인자를반환하고, 나의상위타입에서하나이상의하위타입은정의할수있다. 이들 해당함수에맞지않는경우에는두번째표현식에대해평가를계속하게된다. 즉, NULL이면 타입사이의상 / 하위관계를타입계층구조 (type hierarchy) 라한다. 단일상속모델에서는타입계층구조는트리구조가된다. 타입 Student_T Emp_T 해당함수의첫번째정의된입력인자를반환 계층구조의최상위타입을루트타입 (root type) 이라한다. 다음의 ( 여기서반환은검색이나정의된값으로지정돼 < 그림 1> 은 Person_T 를루트타입으로하는타입계층구조예를보 Prof_T 조회 ) 한다. 예를들어, EMP 테이블에서 여주고있다. COMM 컬럼의값이 NULL 인지검사하는 SQL 문은다음과같다. SQL> SELECT ename, COALESCE(comm, NULL ) 2 FROM emp; CASE WHEN expression1 = expression2 THEN NULL ELSE expression1 END CASE ; FINAL vs. NOT FINAL 특정타입을 NOT FINAL로선언하면이타입에서상속을통해하위타입을생성할수있다. 그러나, 특정타입을 FINAL로선언하면이타입으로부터는상속이불가능하다. < 그림 1> 에서타입 Person_T + 연산자의경우피연산자가정수인경우와실수인경우계산방식이다른데, 이는 + 연산자의의미가오버로딩된것이다. 객체관계형 DB 의완성을위한상속 는 NOT FINAL 로선언됐기때문에하위타입을생성할수있어 다이내믹메쏘드디스패치 NULLIF 함수와유사하게 CASE 표현식으 관계형 DBMS 를사용하는애플리케이션의범위가기존의정형화 Student_T 타입을정의할때 FINAL 로선언했다면 Student_T 에 다음과같은 Person_T 타입변수가있다고가정 로나타내면다음과같다. 된데이터에서점점더다양하고복잡한데이터를필요로하는영 서는하위타입을생성할수없다. 타입선언은디폴트로 FINAL 로 하다. 역으로확장되고있다. 이에따라 DBMS 는멀티미디어데이터인 지정된다. CASE WHEN expression1 IS NOT NULL THEN expression1 ELSE expression2 텍스트, 이미지, 오디오, 비디오등과같은멀티미디어데이터에대한처리부터 CAD, CAM, CASE 등의복합객체, 그리고반구조 NOT INSTANTIABLE 타입과메쏘드 person Person_T; END CASE; 적데이터인 XML, 메시지, 다양한도큐먼트포맷등을처리해야 일반적으로타입을정의하고이타입에서객체를생성할수있다. 상속의개념에따르면, 이변수에는다음과같 한다. 그런데타입선언시에 NOT INSTANTIABLE 로지정하면해당타 이, Person_T 의객체뿐만아니라, 하위타입인 NVL 함수에비해 COALESCE 함수의장점 이와같이복잡한데이터를 DB 에저장, 관리할수있는기능을 입의객체를생성할수없다 (C++ 언어의추상클래스와개념이 Student_T 의객체도할당 (assign) 될수있다. 은여러대체값을취할수있다는것이다. 예를 효과적으로지원하기위한해답으로서많은 DBMS 업체는객체지 동일하다 ). NOT INSTANTIABLE 타입의목적은하위타입에공 들어, 첫번째입력인자가 NULL일경우에는나머지표현식에대해 COALESCE를계속적 향개념을도입했다. 오라클도오라클 8.0부터객체, 객체뷰, 메쏘드, 복합객체, 컬렉션등객체지향관련개념을지원해오고있다. 통으로필요한멤버와메쏘드를정의해두고, 하위타입에서는이들멤버와멤버함수를상속받아사용하는데있다. 타입선언은디폴트 person := Person_T(); /* Person_T 객체 */ person.print(); person := Student_T(); /* Student_T 객체 */ 용할수있다. 객체지향개념을지원함으로써오라클데이터베이스에서객체개 로 INSTANTIABLE 이다. 이와유사하게특정메쏘드의경우에각 person.print(); 념을모델링할수있고, 멀티미디어와 XML 등의데이터를지원할 각의하위타입에서구현이제각각다른경우에는해당멤버함수를 NULLIF 함수 수있다. 특히확장프레임워크를통해새로운타입의데이터와이 NOT INSTANTIABLE 하게선언해두고, 각각의하위타입에서자 그런데앞에서설명한메쏘드오버라이딩의 NULLIF 함수의경우첫번째입력인자와두 에대한연산을추가할수있다. 신에맞는메쏘드를구현해야한다. 결과로처음 print() 메쏘드는 Person_T 의메쏘 번째입력인자가같은경우에는 NULL 을반환 드가수행돼야하고, 두번째 print() 메쏘드는 하고, 그렇지않을경우에는첫번째입력인자의 타입, 서브타입, 타입계층구조에대한상속 메쏘드오버라이딩과메쏘드오버로딩 Studnet_T 에서재정의한메쏘드가수행되어야 값을반환한다. 예를들어, EMP 테이블의사원 타입은자신의멤버와메쏘드 (member function 과 member 사용자는상위타입에서상속받은메쏘드를자신의타입에맞도록 한다. 즉, person 변수에할당되는객체의타입 중 Sal 컬럼값이 5000 인사람에대해 NULLIF procedure) 를갖는다. 하나의타입 T1 에서상속을통해새로운타 재정의할수있는데, 이를 메쏘드오버라이딩 이라한다. < 그림 1> 에따라실행할때동적으로수행할메쏘드를결 함수를적용하는 SQL 문과결과는다음과같다. 입 T2 를정의할수있다. 이때 T1 을 T2 의상위타입 (supertype), 에서 Person_T 에 print() 라는메쏘드가정의돼있는데, Student_T 정해야한다. 이과정을다이내믹메쏘드디스패 T2 를 T1 의하위타입 (subtype) 이라한다. 하위타입은상위타입의 에서는이 print() 메쏘드에 Student_T 에서정의된멤버의정보를 치 (dynamic method dispatch) 라한다. 이는 SQL> SELECT ename, sal 2 FROM emp 3 WHERE NULLIF(sal, 5000) IS NULL; 모든멤버와메쏘드를상속받는다. 또한, 하위타입에서추가로자신의멤버와메쏘드를정의할수있다. 추가적으로출력할필요가있다. 이때는 print() 메쏘드를자신의타입에맞도록재정의해야한다. 반면, 상위타입에서상속받은메쏘 C++ 언어의가상함수 (virtual function) 와비슷한개념으로, 프로그래밍언어분야에서는이 오라클 9i 는하나의상위타입에서상속받은단일상속 (single 드와이름은같지만인자의타입이다른메쏘드를정의할수있다. 과정을다이내믹메쏘드바인딩 (Dynamic 만약 NULLIF 함수를 CASE 표현식으로나 inheritance) 만을가질수있다. 즉, 둘이상의상위타입에서상속하 이를 메쏘드오버로딩 이라한다. 즉, 하나의메쏘드이름에대해 Method Binding) 이라고한다. 타내면다음과같다. 는다중상속 (multiple inheritance) 은지원하지않는다. 그러나하 인자의타입에따라서로다른메쏘드가불려지게된다. 예를들어, 212 m i c r o s o f t w a r e 2001.8 213

< 그림 2> 타입진화를위한샘플스키마 타입계층구조 하위타입생성 < 리스트 1> 은 < 그림 1> 의 Person_T 타입과 Student_T 타입의상속을통해생성한예다. < 리스트 1> 은앞에서설명한상속과관련한개념을표현하고있다. < 리스트 2> 의 CREATE TYPE Student_T 부분을살펴보면 Student_T 언됐다. 또한 Student_T의메쏘드 foo() 는 Person_T에서상속받은 foo() 의오버라이딩이며, Student_T의메쏘드 foo(x, y ) 는상속받은 fod(x ) 에대한오버로딩이다. 두타입에정의된메쏘드의역할은다음과같다. age() 는출생년도부터나이를계산해리턴하며, Person_T::foo(x NUM BER) 는 (x+1) 을리턴하고, Student_T::foo(x ) 는 (x-1) 을리턴, 와메쏘드 AGE를상속하고, Student_t의 FOO(x) 는오버라이딩, FOO(x,y) 는오버로딩이다. 메쏘드오버로딩이제메쏘드오버로딩에대해알아보자. Student_T에는 foo라는같은이름을가진두개의메쏘드가정의돼있다. 이제다음과같은 Person_T Student_T Type Inheritance View of 객체테이블 Person 뷰계층구조 Person_V Student_V 는 Person_T 의하위타입이며 Person_T 는 NOT 그리고 Student_ T::foo(x, y ) 는 (x+y) 를 PL/SQL 문을수행하면각각 2, 3 의결과를수행해야한다. 즉, 인 View Inheritance Student FINAL 로선언됐고, Student_T 는 FINAL 로선 리턴한다. 자의개수와타입에따라서로다른 foo 메쏘드가호출돼야한다. < 리스트 1> Subtype 생성 CREATE TYPE Person_T AS OBJECT ( name, address, birth_year, FINAL MEMBER FUNCTION age RETURN, MEMBER FUNCTION foo(x ) RETURN 멤버와메쏘드상속이와같이 Person_T와 Student_T를생성하고 desc Student_T 명령을이용해서 Student_T에대한정보를조회하면 < 리스트 2> 를볼수있다. 이와결과에서다음과같은사실을알수있다. Student_t는 Person_t의하위타입이며, Person_t의멤버,, DECLARE student Student_T; student := student_t( Carey, Proper Street 3, 1982, 500, Chemistry ); dbms_output.put_line( Foo(x ).: student.foo(1). ); dbms_output.put_line( Foo(x, y ). : student.foo(1,2). ); < 리스트 3> 타입변경을위한스키마생성 /* Type Hierarchy */ SQL> CREATE TYPE Person_T AS OBJECT 2 ( name, 3 address, 4 birth_year, 5 FINAL MEMBER FUNCTION age RETURN, ) NOT FINAL; 6 MEMBER FUNCTION foo(x ) RETURN CREATE OR REPLACE TYPE BODY Person_T IS < 리스트 2> 멤버와메쏘드조회결과 이때결과는다음과같다. 7 ) NOT FINAL; FINAL MEMBER FUNCTION age RETURN IS RETURN 2001 - birth_year; student_t extends SCOTT.PERSON_T ----- Foo(x ). :0. Foo(x, y ). :3. SQL> CREATE OR REPLACE TYPE BODY Person_T IS SQL> CREATE TYPE Student_T UNDER Person_T 2 ( deptid, MEMBER FUNCTION foo(x ) RETURN IS RETURN (x + 1); 지금까지오라클9i에서새로제공하는상속의개념과사용법에대해알아봤다. 3 major, 4 OVERRIDING MEMBER FUNCTION foo(x ) RETURN ); SQL> CREATE OR REPLACE TYPE BODY Student_T IS CREATE TYPE Student_T UNDER Person_T ( deptid, FINAL MEMBER FUNCTION AGE RETURNS 객체관계형 DB 지원을위한타입진화타입진화 (Type Evolution) 는객체타입에변경하는작업을일컫는다. 오라클9i 이전에는타입에새로운메쏘드를추가하는연산을 /* Object Tables */ SQL> CREATE TABLE Person of Person_T (name PRIMARY KEY); SQL> CREATE TABLE Student of Student_T; major, OVERRIDING FINAL MEMBER FUNCTION foo(x ) RETURN, MEMBER FUNCTION foo(x, y ) RETURN ); MEMBER FUNCTION FOO RETURNS 허용했다. 오라클9i에서는타입상속개념을지원하면서, 이타입계층구조의타입에대한다양한변경작업을지원한다. 즉, 타입진화기능을제공한다. 타입상속은순수객체지향 DBMS에서도이 SQL> INSERT INTO Person VALUES( Andy, Alington Street 1, 1980); SQL> INSERT INTO Student VALUES( Bob, Berkeley Street 2, 1978, 1000, Comp. Science ); CREATE OR REPLACE TYPE BODY Student_T IS OVERRIDING FINAL MEMBER FUNCTION foo(x ) RETURN IS RETURN (x - 1); Argument Name Type In/Out Default? ---- ----- -- X IN 와유사한기능을제공하는데주로스키마진화 (Schema Evolution) 라는용어를사용하고있다. 이타입진화기능은특히 ERP, 공간데이터 (Spatial Data), 멀티미디어응용분야에서많이요구되고 /* Object View Hierarchy */ SQL> CREATE VIEW Person_V of Person_T WITH OBJECT ID (name) 2 AS MEMBER FUNCTION foo(x, y ) RETURN IS RETURN (x + y) MEMBER FUNCTION FOO RETURNS Argument Name Type In/Out Default? ---- ----- -- X IN Y IN 있다오라클9i부터지원하는타입변경오퍼레이션은애트리뷰트추가 / 삭제, 메쏘드추가 / 삭제, Built-in 타입애트리뷰트속성 ( 길이, 자리수등 ) 변경, 타입 FINAL/INSTANTIABLE 속성변경, 타입변경과의존스키마객체 (Dependent Schema Objects) 등을들수 3 SELECT name, address, birth_year 4 FROM Person; SQL> CREATE VIEW Student_V of Student_T UNDER Person_V 2 AS 3 SELECT * 4 FROM Student; 214 m i c r o s o f t w a r e 2001.8 215

있다. 특정타입을직간접으로참조하고, 해당 하겠다. 이샘플스키마는 Type Hiearchy, Object Tables, View XML 타입 time with time zone, 타임스탬프, 타임스탬프 타입변경에영향을받는모든스키마객체를 Hiearchy 를보여준다. 오라클 9i 에서 XML 타입이라는새로운데이터타입을제공한다. with time zone 등 5 개의타입으로, 이들중에 dependent 객체 라한다. 여기에서는다음샘 다음의 < 리스트 3> 은앞의 < 그림 2> 에해당하는스키마생성스크 XML 타입은 XML 문서를 CLOB 처럼저장하며, 컨테인오퍼레이 서 time, time with time zone 을제외한타입을 플스키마를대상으로타입변경의내용을설명 립트다. 앞의샘플스키마의 Person_T 에예를들어다음과같이주 터 (Contains operator) 와 XPath-like syntax 를사용해오라클 9i 지원하며오라클만의데이트타임타입으로 time < 리스트 4> 타입변경결과확인 민등록번호를추가하는타입변경을가정해보자. Text(interMedia Text) 인덱스를사용할수있다. 현재버전에서는서버에서만 PL/SQL, SQL을사용해 XML타입을이용할수있으 stamp with local time zone이있다. 인터벌타입에는 13개가있으나그중에서오라클은 inter SQL> desc Person_T person_t is NOT FINAL ALTER TYPE Person_T ADD ATTRIBUTE(ssn ) CASCADE; 앞에서옵션 CASCADE 는현재의타입변경의효과를 depen 며아직은 CLOB로만저장되지만, 추후에는 BLOBs, NCLOBs 등으로확장될것이다. < 리스트 5> 는 XML타입컬럼을가진테이블에 XML 문서를삽입하고, extract(), existsnode(), getclobval(), getstringval() 과같 val year to month, interval day to second 타입만지원한다.. dent 객체 에바로적용하라는의미다. 앞의타입변경결과로 Per son_t, Student_T 타입객체, Person, Student 테이블에 ssn 항목이추가됐음을 < 리스트 4> 에서확인할수있다. 은기능을사용해 XML 문서를읽는예제이다. < 리스트 5> 와같이데이터베이스테이블의특정컬럼을 XML타입으로선언해놓고이필드에 XML 문서전체를그대로저장할수 < 리스트 5> 테이블에 XML 문서저장및읽기 SQL> CREATE TABLE po_tab ( 2 pono number primary key, SQL> desc Student_T Student_T extends SCOTT.PERSON_T 그리고다음에서처럼 Person 테이블을검색해보면로우객체단위에서도 ssn 애트리뷰트가추가됐음을알수있다 (Student 테이블도마찬가지임 ). 있으며, 추후 XPATH를이용해문서의전체나일부의하위구조만을검색할수있다. 그러므로 XML을이용한애플리케이션을개발할경우개발자는더이상애플리케이션내부에 XML을분석할필요가없어졌다. 단순한 SQL만을이용해쉽게 XML 문서를저장하 3 orderdate date, 4 poxml sys.xmltype); (100, TO_DATE( February 07, 2001, Month dd, YYYY ), sys.xmltype.createxml SQL> select * from person; ---- -- ---- - Andy Alington Street 1 1980 (NULL) 거나쿼리할수있다. 데이트타임과인터벌 ( <?xml version= 1.0?><PO pono= 100 > <PO>PO_1</PO> </PO> )); XML 지원강화인터넷에서일어나는모든정보교환의표준으로서, XML의역할 오라클9i의모든데이트타임데이터타입 (datetime datatype) 과인터벌데이터타입 (interval datetype) 은 ANSI SQL 99 표준과순응한다. 이를위해데이트타임데이터타입으로는타임스탬프, timest (200, TO_DATE( February 07, 2001, Month dd, YYYY ), sys.xmltype.createxml ( <?xml version= 1.0?><PO pono= 200 ><PO>PO_2</PO></PO> )); SQL> desc Person NOT NULL 이점점더커지고있다. XML은옵션이아니라대세 란말을쉽게들을수있다. 따라서데이터베이스에서 XML을읽고쓰고기존애플리케이션에 XML 데이터를통합할수있는기능은필수적이다. 이러한 XML을다른데이터타입처럼쉽게다룰수있게도와주는 amp with time zone, timestamp with local time zone 타입이, 인터벌데이터타입으로는 interval year to month, interval day to seco nd 타입이추가됐다. 이글에서는새롭게추가된데이터타입의사용예와오라클9i에추가된데이트관련기능의사용예를알아보자. (300, TO_DATE( February 07, 2001, Month dd, YYYY ), sys.xmltype.createxml ( <?xml version= 1.0?><PO pono= 300 ><PO> 한글 </PO></PO> )); SQL> select e.poxml.getclobval() from po_tab e; 것이 XML 디벨로퍼킷이다. 오라클9i 또한몇개의컴포넌트가추가됐으며기존의컴포넌트기능도향상됐다. 가장큰변화는 XML 스키마 1.0을지원하는것인데새로운컴포넌트는 XML 스키마프 ANSI SQL:99는데이트타임과인터벌에대한타입으로총 18 개의타입을제시했다. 데이트타임데이터타입으로는 date, time, E.POXML.GETCLOBVAL() <?xml version= 1.0?><PO pono= 100 ><PO>PO_1</PO></PO> <?xml version= 1.0?><PO pono= 200 ><PO>PO_2</PO></PO> SQL> desc Student 로세서와 XDK 자바빈즈 (DBAccess Class, DBViewer Bean) 다. 또한오라클9i에서가장눈에띄는기능으로새롭게추가된데이터타입으로 XML타입을들수있다. XDK는현재웹사이트 (http: //otn.oracle.co.kr) 에서무료로다운받을수있으며, 여러샘플을해당사이트에서접할수있을것이다. 여기에서는오라클9i에 XML을특정데이터타입으로저장할수있는기능인 XML타입 (XMLTYPE) 에대해알아보자. < 표 1> 데이트타임필드와값 Datetime Field 올바른값 Year -47129999(0의값은가질수없다 ) Month 01 to 12 Day 01 to 31 Hour 00 to 23 Minute 00 to 59 Second 00 to 59.9(N), 소수점아래 9자리까지가능 Timezone_Hour( 시간대를 GMT와의 -12 to 13 차이시간으로나타낼때쓰이는값 ) Timezone_Minute 00 to 59 <?xml version= 1.0?><PO pono= 300 ><PO> 한글 </PO></PO> SQL> select e.poxml.extract( /PO/PO ).getclobval() 2 from po_tab e 3 where e.poxml.existsnode( /PO/@pono ) = 1 and 4 e.poxml.extract( /PO/@pono ).getstringval() = 100 and 5 e.poxml.extract( /PO/PO ).getstringval() like %PO% ; E.POXML.EXTRACT( /PO/PO ).GETCLOBVAL() <PO>PO_1</PO> 216 m i c r o s o f t w a r e 2001.8 217

데이트타임데이터타입 타임스탬프 타임존과같이사용한타임스탬프 사용될수있는 alter session set time_zone = 타임스탬프, timestamp with time zone, 타임스탬프 (timestamp) 타입은테이트타입의확장형이다. 이는 이타입은해당데이트타임이어느시간대에속하는지에대한정보 local 에서 local 도이값이사용된다. ORA_SDTZ timestamp with local time zone 이세가지데 연, 월, 날짜에덧붙여시간, 분, 초의정보를갖고있다. 초밑에소 가있다는것을제외하면타임스탬프타입과같다. 시간대정보는 에이용될수있는값은 OS 의로컬타임존을나 이터타임타입모두연, 월, 날짜, 시간, 분, 소수 수점아래몇자리까지나타낼것인지는선언할때정의해준다. 다 +09:00 과같이 GMT 와의시간차로나타내거나 US/Pacific 처럼 타내는 OS_TZ, 데이터베이스의시간대를나타 점아래초와같은시간정보를갖고있다. 이러 음예제에서는소수점아래 5 자리까지나타낸다. 이값을명시하지 시간대의이름으로나타낸다. 또한 PST 와같이약어를사용할수 내는 DB_TZ, 그리고예제에서와같이 offset 으 한정보는의미있는값을가져야하며이각각의 않으면기본으로 6 자리까지나타낸다. 있다. 우리가사용하고있는시간대의경우그이름은 Asia /Seoul 로나타내는방법세가지가있다. 이는항상명 정보가가질수있는값은 < 표 1> 과같다. 이며시간대의이름으로가능한값은 v$timezone_names 의 시적으로세션의시간대정보를설정하기위해 이각각의데이트타임타입은모두 < 표 1> 의 SQL> create table 타임스탬프 _test( 타임스탬프 _a 타임스탬프 (5)) ; tzname 의값을참조하면된다. 사용될수있으며이환경변수가설정돼있지 필드값을갖으나그차이점은타임존 (time 않으면시스템의시간대정보를그대로이용한 zone) 정보를갖고있느냐이다. 즉, 갖고있다면 타임스탬프타입과데이트타입의차이는먼저단순한디스플레 SQL> select sys 타임스탬프 from dual ; 다. local 도시스템의시간대정보값을가진다. 어떠한형태로갖고있느냐의차이다. 이에서난다. 데이트타입은데이트포맷을 to_char 함수를사용해 SYS 타임스탬프 변환시켜사용하지않는경우는단순히연, 월, 날짜에대한정보만나타낼수있다. 그리고가장큰차이점은데이트타입은 -- 01/04/10 17:09:51.732152 +09:00 타임존과타임스탬프의활용분야세계가하나의커다란네트워크로묶여나감에 < 리스트 6> 로컬타임존의예 to_char 함수를이용해도초정보서소수점아래 0부터 60 까지의값만나타낼수있는데반해타임스탬프타입은소수점아래정보 이결과는 GMT(UTC) + 9 시간대임을의미한다. 따라여러언어의고객을지원하는것은매우중요한일이되고있다. 이는시간정보를저장하 SQL> desc date_test2 까지나타낼수있다. 그럼다음의예제에서기존에제공하던데이 는데있어서도매한가지이다. 새롭게추가된데 -- - ---- TIMESTAMP(6) WITH LOCAL TIME ZONE 트데이터타입과오라클9i에새롭게추가된타임스탬프의차이를비교해보자. 다음은기존에제공하던데이트데이터타입을사용한예제다. 로컬타임존의타임스탬프이타입은타임스탬프의하나의변형으로내부적으로타임존 (timezone) 정보를갖고있다. 이타입이 timestamp with time 이트타임타입은좀더유용한시간관련연산을할수있도록하고있다. 시간대정보를저장하고시간차정보를저장할수있게된것이다. 오 SQL> select * from date_test2 ; zone 과차이가있다면타임존정보를직접적으로컬럼의일부로저 라클 9i 를사용하면전세계를지원하는사이트의 -- 01/04/09 16:54:56.000000 99/04/16 00:00:00.000000 SQL> select sessiontimezone from dual ; SESSIONTIMEZONE - +09:00 SQL> select sysdate from dual ; SYSDATE -- 01/04/10 SQL> select to_char(sysdate, YY-MM-DD HH:MM:SS AM ) from dual TO_CHAR(SYSDATE, YY-MM ---- 01-04-10 04:04:45 오후 장하는것이아니라데이터베이스세션정보를이용한다. 그래서데이터베이스세션정보의타임존정보를수정하면전체데이터또한같이수정된다. 그럼 < 리스트 6> 을통해직접확인해보자. 앞의예제에서보면 +09:00 시간대에서는 01/04/09 16:54: 56.000000 값을가진데이터가 US/Pacific(-08:00) 시간대에서는 01/04/09 00:54:56.000000으로변한다. 참고로 sessiontimezone 은세션의시간대정보를리턴하는값이다. 세션의시간대정보를바꾸기위해서는 alter session set time_zone = <time zone 명시 > 구축이훨씬쉬워질것이다. 또한이전버전에서는데이트타입의차가항상일단위로나와서실제로몇시간몇분이됐는지계산해구했다. 그러나이제타임스탬프타입의차가인터벌타입이라는것을이용하면계산이매우쉬워져유용하게사용할수있다. 정리 : 조규형 jokyu@sbmedia.co.kr m a s o SQL> alter session set time_zone = US/Pacific ; Session altered. 그리고다음은오라클9i에서새롭게추가된타임스탬프데이터타입의예제다. 명령을이용한다. 이때타임존에명시될수있는값은앞의타임스탬프에서사용하는값과 local, dbtimezone이다. local은기본로컬 SQL> select sessiontimezone from dual ; SESSIONTIMEZONE - US/Pacific SQL> select * from date_test2 ; --- 01/04/09 00:54:56.000000 99/04/15 08:00:00.000000 SQL> create table date_test ( 2 today_date 타임스탬프 ) ; Table created SQL> select today_date from date_test ; _DATE ----- 01/04/09 15:53:40.081711 -- 2001년 4월 9일 15시 53분 40.081711 타임존정보로 ORA_SDTZ 환경변수에설정된값을가진다. ORA_SDTZ 값이 -08:00으로설정돼있으면새로운세션연결시세션시간대정보는해당값으로설정된다. dbtime zone은데이터베이스생성시지정한시간대정보이며아무런값도주지않으면 - 08:00으로돼있다. 이값은 Alter Database 명령에의해바뀔수있다. 앞의환경변수를설정하면세션의시간대정보는항상 -08:00 즉, US/Pacific 시간대로설정되며세션의시간대정보변경할때 218 m i c r o s o f t w a r e 2001.8 219