database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Tutorials 9347 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 9347
Oracle9i XMLType의 이해
작성자
정재익(advance)
작성일
2002-01-07 19:05
조회수
6,553

Oracle9i XMLType의 이해

 

Mark Drake와 Mike Lehmann

 

XML과 SQL의 장벽을 허무는 XMLType은 SQL 및 XML 개발자들에게 강력한 기능과 함께 사용 편의성을 제공합니다.

 

Oracle9i는 XMLType이라는 새로운 시스템 정의 데이타 타입을 지원합니다. XMLType은 Oracle9i에 저장되는 XML 데이타를 작성, 추출 및 인덱스싱하는 강력한 메커니즘을 제공하는 자체 고유 함수를 가지고 있습니다. 새로운 데이타 형식으로서 XMLType은 테이블 및 뷰에서 열에 대한 데이타 형식으로 사용되고, PL/SQL 내장 프로시저에서도 매개변수, 반환 값 및 변수로 사용될 수 있습니다.

 

XMLType 및 이러한 기능을 활용하면 SQL 개발자들은 강력한 관계형 데이타베이스를 활용하면서 XML 컨텍스트에서 작업할 수 있으며, 동시에 XML 개발자들은 강력한 XML 표준을 활용하면서 관계형 데이타베이스의 컨텍스트에서 작업할 수 있게 됩니다.

 

이 글에서는 XMLType에 대한 XML 구매 주문 예제를 통해 XMLType 및 이러한 기능에 대해 살펴봅니다.

 

요구 사항

 

이 글에 나온 XMLType 코드는 Oracle Technology Network의 (otn.oracle.co.kr/tech/xml/) Samples 섹션에서 다운로드할 수 있습니다.

 

이 글의 온라인 버전(www.oracle.com/oramag/oracle/01-nov/)에는 이 글에 설명된 프로세스를 실행하기 위해 필요한 추가 스크립트 및 데이타베이스 구성 옵션에 대한 설명도 포함되어 있습니다. 이 글에서는 기본적으로 Oracle9i Database가 설치되어 있고, SYSTEM 계정 및 SYS 계정에 대해 기본 암호가 설정되어 있다고 가정합니다. 설치 환경에 맞게 암호를 변경하십시오.

 

XMLType으로 테이블 만들기

 

먼저, XMLType 열로 테이블을 만듭니다. 모든 SQL 개발자가 알고 있는 표준 SQL 구문을 사용하여 Oracle 데이타베이스에 일반 테이블을 만드는 것처럼 간단하게 만들 수 있습니다. Listing 1에는 테이블 작성 및 이 글의 예제에서 계속 사용되는 테이블 데이타가 나와 있습니다.

 

PURCHASEORDER 테이블에는 XMLType 데이타 형식(sys.XMLTYPE)을 가진 하나의 열 PODOCUMENT가 포함되어 있습니다. 스크립트가 정적 함수 sys.XMLTYPE.createXML로 작성된 하나의 구매 주문을 삽입합니다. 개발자들은 Oracle9i 첫 번째 릴리스의 경우 XMLType 저장 메커니즘이 내부적으로 CLOB이라는 사실을 알고 있어야 합니다. 저장 특성을 제어하려는 개발자의 경우, 표준 대형 오브젝트인 STORAGE 절이 테이블 스페이스 및 청크(chunk) 크기 사양을 지원합니다.

 

XPath로 XMLType 질의

 

테이블을 만든 후, SQL 개발자가 일반적으로 수행하는 작업은 테이블을 질의하는 것입니다. 질의를 수행하는 간단한 방법은 단순하게 SELECT 질의를 실행하는 것입니다. 질의를 실행하면 다음과 같이 나타납니다.

SQL> select * from purchaseorder;

PODOCUMENT()
---------------------------------
XMLTYPE()

결과를 보면 PODOCUMENT 열에 하나의 행이 있음을 알 수 있지만, 내용은 표시되지 않습니다. 이것은 PODOCUMENT가 오브젝트 타입이기 때문이며, 내용을 표시하기 위해서는 PODOCUMENT를 적절히 질의해야 합니다.

 

XMLType 열에서 내용을 추출하는 방법에는 여러 가지가 있습니다. 우선, XMLType에 대해 함수 getClobVal을 사용하여 PODOCUMENT 열의 전체 내용을 얻습니다. Listing 2 는 getClobVal 함수를 사용한 질의 결과를 나타냅니다.

 

XML에 친숙한 개발자들은 XML 문서를 참조하는 일반적인 방법이 XPath 문을 통해 이루어진다는 사실을 알고 있습니다. XPath는 XML 문서의 일부를 쉽게 표시할 수 있는 W3C 표준입니다. Oracle9i XMLType은 XPath 매개변수 값을 취하는 extract 함수를 통해 XML 문서 컬렉션을 질의할 수 있도록 합니다. Listing 3 은 XPath 문을 사용하는 extract 함수의 예제로서 구매 주문이 특정 참조 번호와 일치하는 모든 배송 지시를 반환합니다.

 

XML 개발자들은 extract 함수가 Oracle9i Database를 열어 대용량 XML 문서를 처리 및 질의할 수 있다는 사실을 쉽게 알 수 있을 것입니다. 파일 시스템에서 알 수 없는 수의 XML 문서를 모두 뒤져서 찾는 extract 함수에 해당하는 질의를 작성한다는 것은 매우 까다로운 작업입니다. Oracle9i에서 질의는 간단한 SQL 문입니다.

 

XMLType 인덱싱

 

Listing 3의 extract 함수 예제를 확인한 DBA는 이러한 유형의 질의에 대한 성능 특성을 조정할 수 있다면 매우 유용할 것이라는 사실을 알게 될 것입니다. 다행히도, 함수 인덱스라는 기능을 통해 DBA는 일반 SQL 질의를 조정하는 방식과 동일하게 extract 함수를 사용하는 질의를 조정할 수 있습니다. 즉, 인덱스를 만들면 가능합니다.

 

Listing 4 는 PURCHASEORDER 문서의 Reference 및 User 노드 모두 인덱싱되는 예제를 나타냅니다. 애플리케이션을 만드는 개발자들에 의해 자주 질의 되는 공통 필드를 인덱싱하는 관계형 방법도 나와 있습니다.

 

CREATE UNIQUE INDEX문은 구매 주문 문서의 Reference 노드에 대한 질의 성능 향상을 가져올 뿐만 아니라, 데이타베이스에서 중복되는 참조 번호를 가진 XML 구매 주문을 거부하도록 합니다. XMLType extract 함수를 사용하는 이 간단한 Oracle9i 작업은 데이타베이스 인프라 외부에서 관리되는 XML에 대해 재현하기는 어렵습니다.

 

SQL로 XMLType 질의

 

XMLType extract 함수에서 XPath를 사용함으로써 일반적인 XML 개발자가 데이타베이스에서 XML을 쉽게 사용할 수 있게 됩니다. 하지만, SQL 개발자에게는 새로운 구문이 될 수 있습니다. SQL 개발자가 이러한 구문에 쉽게 적응할 수 있는 한 가지 방법은 XML 문서에 포함된 요소를 SQL 문에서 XML 함수를 필요로 하지 않는 구조로 전환하는 하나 이상의 관계형 뷰를 만드는 것입니다.

 

Listing 5는 PURCHASEORDER 테이블에 포함된 XML 문서에 대해 관계형 뷰를 만드는 예제를 나타냅니다. 하지만, 전통적인 기존의 뷰를 만드는 것과 달리 CREATE VIEW 문은 기본 테이블에서 열 값을 가져오지 않습니다. 열은 각 XML 구매 주문의 User 및 Reference 노드에 대한 XMLType extract 함수에서 나옵니다. SQL 개발자들은 이러한 뷰가 XML 문서 리포지토리에서 나왔다는 사실을 인식하지 못한 채 Users 및 Reference 번호로 이루어진 관계형 뷰에 액세스할 수 있습니다.

 

REFERENCE 및 USERID 열을 만들기 위해 extract 함수에 전달된 인수는 Listing 4의 extract IPURCHASEORDERREFERENCE 및 IPURCHASEORDERUSER 인덱스를 만들기 위해 사용된 인수와 동일하다는 사실을 눈 여겨 볼 필요가 있습니다. 이러한 방식은 REFERENCE 또는 USERID를 기준으로 질의를 수행할 때 최적화 프로그램이 이러한 인덱스를 사용하도록 합니다.

 

결국, PURCHASEORDER XML 문서에서 반복되는 줄 항목 노드를 별도의 디테일 뷰로 펼치기 위한 간단한 단계이며, 결과적으로 모든 SQL 개발자들이 쉽게 구축할 수 있는 전형적인 마스터-디테일 관계가 만들어집니다. 그리고, 함수 인덱싱을 사용하는 이러한 뷰는 관계형 테이블 처럼 수행되지만, 내부적으로는 원래의 XML 문서를 포함하는 테이블이 존재합니다.

 

트리거를 사용하여 XMLType 문서 제약

 

이 구매 주문 예제와 같이, 기업간 거래를 다룰 때 기업들은 들어오는 비즈니스 문서를 처리하기 전에 이러한 문서가 표준 정의에 부합하는지 확인해야 할 필요가 있습니다. XML에서 이러한 표준은 DTD(Document Type Definitions) 또는 최근에는 XML 스키마 문서에 의해 정의됩니다.

 

XMLType은 모든 표준 Oracle 데이타베이스 기능을 활용할 수 있기 때문에 논리적인 다음 단계는 PURCHASEORDER 테이블에 삽입되는 문서를 DTD 또는 XML 스키마에 대해 검증하는 트리거를 만드는 것입니다.

 

Listing 8 은 DTD 파일을 포함하는 테이블 DTDSTORE를 만들기 위한 예제 코드를 나타냅니다. 이 테이블에는 varchar 타입의 DOCTYPE이라는 열이 있으며 이 열은 빠른 SQL 질의를 위한 DTD 설명을 포함하고 있습니다. DTD 자체는 CLOB으로 저장되어 내장된 Oracle9i Database XML 구문 분석기에 의한 검증 구문 분석을 용이하게 합니다. 실제 구현 환경에서 이러한 테이블은 특정 비즈니스 상황에서 사용되는 모든 XML 문서 정의를 포함합니다.

 

PURCHASEORDER 테이블에 삽입되는 모든 문서를 검증하기 위해 Listing 6에서 제공되는 트리거를 사용합니다. 이 코드에 나타난 프로세스는 테이블에서 일치하는 DTD를 읽은 다음, 내장된 Oracle XML 구문 분석기를 사용하여 문서를 검증하는 것입니다.

 

Listing 6의 스크립트는 select 문을 사용하여 DTDSTORE 테이블에서 특정 문서 형식 정의를 추출하여 로컬 변수 DTD_SOURCE로 보냅니다. XML 구문 분석기로 DTD를 등록하기 위해 구문 분석 메서드 parseDTD가 실행된 다음, 결과로 나타나는 DTD_DOCUMENT가 구문 분석기 setdoctype 메서드를 사용하여 구성됩니다. 마지막으로, 문서를 검증하기 위해 검증 모드가 true로 설정된 구문 분석기 메서드 parseCLOB을 통해 삽입된 구매 주문 인스턴스가 구문 분석됩니다.

 

PURCHASEORDERVALIDATION 트리거가 적은 수의 줄로 이루어진 것을 보면, XML 구문 분석기를 Oracle 데이타베이스에 직접 내장 시키는 것이 좋은 이유를 알 수 있습니다.

 

Listing 6 의 예제는 트리거를 XML 문서와 함께 사용할 수 있는 방법을 보여 주는 매우 작은 부분에 불과합니다. 다른 검증 방법은 XMLType extract 함수를 사용하여 XML 문서 일부를 검증하는 것입니다.

 

XML 문서와 관련된 복잡한 비즈니스 규칙을 가지고 있는 기업의 경우, 체크섬 또는 데이타 적합성 확인과 같은 보다 프로그래밍적인 분석이 더 적절할 수 있습니다. 이러한 규칙은 데이타베이스의 다른 곳에 저장된 데이타에 의존하기 때문에 DTD 또는 XML 스키마로 인코딩하기가 어렵습니다.

 

Listing 7은 이러한 종류의 비즈니스 규칙 검증 예제를 나타냅니다. PurchaseOrder 노드 및 User 노드의 존재 여부를 확인할 수 있는 첫 번째 두 단계는 Listing 6에서와 같이 DTD 또는 XML 스키마로 쉽게 처리할 수 있는 검증입니다. 이 경우, 다른 방법을 보여 주기 위해 이렇게 간단한 검증을 XMLType existsnode 메서드를 사용하여 프로그래밍 방식으로 수행합니다.

 

사용자를 포함하는 관계형 테이블에 대해 사용자를 검증하는 세 번째 단계는 Oracle9i에서 제공하는 SQL 및 XML의 통합으로 이루어집니다. 이 방법은 데이타 검증에 대해 사용되는 값 목록이 테이블에서 관리되지 않고 DTD 또는 스키마 문서 자체로 코딩되는 순수한 XML 방식과 대조됩니다.

 

Listing 7 의 스크립트는 이 방법에 대한 예제를 나타냅니다. 스크립트는 커서 validemployee를 만들어 직원 이름 enamee을 매개변수로 가지고 직원 테이블의 직원 존재 여부에 따라 true 또는 false를 반환합니다. 그러면, 사용자 노드가 삽입되는 각 문서에 대해 validemployee 커서가 실행되어 직원이 반드시 존재함을 확인합니다. 이것은 매우 간단한 예제이며, 이러한 방식으로 더욱 복잡한 비즈니스 규칙이 전개될 수 있습니다.

 

결론

 

XPath와 같은 XML 표준과 SQL의 데이타 조작 기능의 결합으로 관계형 및 XML 배경 지식을 가지고 있는 개발자들은 XML 애플리케이션을 위한 풍부한 개발 환경을 활용할 수 있게 됩니다. XML 문서를 위한 매우 확장성 높고 안정적인 데이타 저장을 원하는 개발자들은 XMLType이 Oracle9i에 완벽하게 통합됨으로써 풍부한 기능을 제공한다는 사실을 알 수 있을 것입니다. 고성능 SQL 질의를 위한 XML 리포지토리 인덱싱에서 XML 조작을 위한 복잡 미묘한 비즈니스 규칙 및 관계형 뷰에 이르기까지 개발자들은 XMLType 및 Oracle9i로 새로운 XML 애플리케이션 클래스를 만들 수 있습니다.

 

Mark Drake (mark.drake@oracle.com)는 Oracle9i Database XML 기능을 담당하고 있는 Oracle 제품 관리자입니다. Mike Lehmann (mike.lehmann@oracle.com) 는 XML 관련 Oracle 제품 마케팅 관리자입니다.

 

원본출처 : http://www.oracle.com/kr/magazine/webcolumns/2001/index.html?o61xml.html

[Top]
No.
제목
작성자
작성일
조회
9351Oracle 8 on Linux Enterprise Edition 설치와 Network 설정
정재익
2002-01-07
6572
9349Redhat 7.2 + Oracle 9i 설치하기
정재익
2002-01-07
6643
9348Oracle SQLJ and JPublisher: 새로운 모습
정재익
2002-01-07
6222
9347Oracle9i XMLType의 이해
정재익
2002-01-07
6553
9334오라클 9i 에서 추가된 timestamp 자료형
정재익
2002-01-07
9118
9333client-server환경에서 비정상 종료된 session정리 방법
정재익
2002-01-07
5545
9332View 테이블 만들기
정재익
2002-01-07
9893
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다