Oracle XQuery 조회, 구축 및 변환 XML

7706 단어 Oacle
Oracle 데이터베이스 10g 2 판 에서 Oracle 은 이 데이터베이스 와 통합 되 는 모든 기능 의 자체 XQuery 엔진 을 도입 했다. 이 엔진 은 XML 을 지원 하 는 응용 프로그램 개발 과 관련 된 각종 임 무 를 수행 할 수 있다.XQuery 는 XML 데이터 모델 을 처리 하 는 데 사용 되 는 검색 언어 로 실제 XML 로 표현 할 수 있 는 모든 종류의 데 이 터 를 조작 할 수 있 습 니 다.Oracle XQuery 는 데이터베이스 데이터 와 외부 데이터 원본 을 사용 할 수 있 도록 실 시 했 지만 데이터베이스 에 저 장 된 구조 화 된 데 이 터 를 처리 하 는 데 있어 Oracle XML DB 는 성능 을 현저히 향상 시 킬 수 있 습 니 다.
본 논문 에서 제공 하 는 예 는 어떤 상황 에서 XQuery 조회, 구축 과 XML 전환 을 어떻게 사용 하 는 지 보 여 주 었 을 뿐만 아니 라 XQuery 표현 식 의 성능 집행 을 어떻게 감시 하고 분석 하 는 지 보 여 주 었 을 뿐만 아니 라 같은 작업 부하 처리 에 더욱 효율 적 인 방법 을 찾 았 다.
관계 데이터 기반 XML 구축
필요 한 경우 (예 를 들 어 웹 서비스 에 결 과 를 보 내 는 것) 관계 데 이 터 를 기반 으로 XML 을 구축 할 수 있 습 니 다.Oracle 데이터베이스 10g 2 판 이전 버 전에 서 이 작업 을 수행 하려 면 XMLelement, XMLforest, XMLlagg () 와 같은 SQL / XML 생 성 함 수 를 사용 해 야 합 니 다.Oracle 데이터베이스 10g 2 판 에서 XQuery 는 이러한 함수 보다 더욱 효율 적일 것 이다.구체 적 으로 말하자면, XQuery 표현 식 내부 에서 ora: view XQuery 함 수 를 사용 하면 기 존의 관계 표 나 보기, 그리고 XML 을 즉시 구축 할 수 있 으 며, 관계 데이터 현식 을 통 해 XML 보 기 를 만 들 필요 가 없습니다.목록 1 의 PL / SQL 코드 는 ora: view 예제 데이터베이스 모드 HR 기반 기본 직원 관계 표 에 저 장 된 데 이 터 를 사용 하여 XML 문 서 를 구축 하 는 방법 을 보 여 줍 니 다.
목록 1: ora: view 를 사용 하여 관계 데이터 기반 XML 만 들 기
BEGIN

IF(DBMS_XDB.CREATEFOLDER('/public/employees')) THEN

DBMS_OUTPUT.PUT_LINE('Folder is created');

ELSE

DBMS_OUTPUT.PUT_LINE('Cannot create folder');

END IF;

COMMIT;

END;

/
DECLARE

XMLdoc XMLType;

BEGIN

SELECT XMLQuery(

'for $j in 1

return (

{

for $i in ora:view("HR", "employees")/ROW

where $i/EMPLOYEE_ID <= 102

return (

{xs:string($i/EMPLOYEE_ID)}

{xs:string($i/LAST_NAME)}

{xs:integer($i/SALARY)}

)} )'

RETURNING CONTENT) INTO XMLdoc FROM DUAL;

IF(DBMS_XDB.CREATERESOURCE('/public/employees/employees.xml', XMLdoc)) THEN

DBMS_OUTPUT.PUT_LINE('Resource is created');

ELSE

DBMS_OUTPUT.PUT_LINE('Cannot create resource');

END IF;

COMMIT;

END;

/

목록 1 의 첫 번 째 PL / SQL 과정 에서 XML 정보 라 이브 러 리 에 새 폴 더 를 만 들 었 을 뿐 입 니 다.이 정보 라 이브 러 리 폴 더 에 서 는 두 번 째 PL / SQL 과정 에서 만 든 XML 문 서 를 저장 합 니 다.두 번 째 PL / SQL 과정 에서 먼저 SELECT 문 구 를 보 냅 니 다. 이 문 구 는 XML Query SQL 함수 로 관계 데이터 기반 XML 을 구축 합 니 다.XQuery 표현 식 (XML Query 는 여기 서 매개 변수 로 사용 합 니 다) 에 대해 서 는 포 함 된 FLWOR 표현 식 에 사용 되 는 ora: view XQuery 함 수 를 주의 하 십시오.이 예제 에서 ora: view 는 두 개의 입력 매개 변 수 를 가 져 옵 니 다. 즉, 'HR' 과 'employees' 는 이 함수 에 HR 데이터베이스 모델 에 속 하 는 직원 표를 조회 하 라 고 지시 합 니 다.따라서 ora: view 는 HR. employees 표 행 을 나타 내 는 직원 XML 문서 순 서 를 되 돌려 줍 니 다.그러나 결과 문서 의 공간 을 절약 하기 위해 세 명의 직원 기록 만 결과 서열 에 전달한다.FLWOR 표현 식 where 자구 에 $i / EMPLOYEE 를 지정 합 니 다.ID < = 102 로 이 루어 진.FLWOR 표현 식 의 return 자구 에 사용 되 는 xs: string () 과 xs: integer () XQuery 형식 표현 식 을 주의 하 십시오.실제로 이 두 개의 XQuery 표현 식 은 XML 노드 값 을 해당 하 는 형식 으로 변환 할 뿐만 아니 라 이 노드 값 도 추출 합 니 다.그 다음 에 생 성 된 직원 XML 문 서 는 employees. xml 로 목록 1 의 다른 PL / SQL 과정 에서 만 든 / public / employees XML 정보 라 이브 러 리 폴 더 에 저 장 됩 니 다.이 작업 이 완료 되 었 는 지 확인 하려 면 다음 조 회 를 실행 할 수 있 습 니 다.
SELECT XMLQuery('for $i in fn:doc("/public/employees/employees.xml")

return;

$i'

RETURNING CONTENT) AS RESULT FROM DUAL;

이 조 회 는 다음 출력 을 생 성 해 야 합 니 다:
<employees></employees>

<employee></employee>

<empno></empno>100

<ename></ename>King

<sal></sal>24000



<employee></employee>

<empno></empno>101

<ename></ename>Kochhar

<sal></sal>17000



<employee></employee>

<empno></empno>102

<ename></ename>De Haan

<sal></sal>17000




위의 XQuery 에서 fn: doc XQuery 함 수 는 Oracle XML DB 정보 라 이브 러 리 에 저 장 된 단일 XML 문 서 를 방문 하 는 데 사 용 됩 니 다.그러나 같 거나 비슷 한 구 조 를 가 진 XML 문서 (같은 XML 정보 라 이브 러 리 폴 더 에 저장) 를 처리 하려 면 어떻게 해 야 합 니까?이 경우 XML 정보 라 이브 러 리 자원 을 처리 하 는 또 다른 XQuery 함수 (즉 fn: collection) 가 도움 이 될 수 있 습 니 다.본 고 는 잠시 후에 fn: collection XQuery 함 수 를 어떻게 사용 하 는 지 에 관 한 예 시 를 소개 할 것 이다.
XMLtype 데이터 조회
XQuery 는 XML 모드 와 비 모드 에 기반 한 데 이 터 를 조작 할 수 있 습 니 다.다음은 XMLtable 함 수 를 OE 프레젠테이션 데이터베이스 모드 에서 PurchaseOrder XML 모드 를 기반 으로 한 XMLtype 표를 조회 하 는 방법 을 보 여 줍 니 다.
SELECT ttab.COLUMN_VALUE AS OrderTotal FROM purchaseorder,

XMLTable(

'for $i in /PurchaseOrder

where $i/User = "EABEL"

return;

<ordertotal></ordertotal>

{$i/Reference}

<total></total>

{fn:sum(for $j in $i/LineItems/LineItem/Part

return ($j/@Quantity*$j/@UnitPrice))}



'

PASSING OBJECT_VALUE

) ttab;

위의 예제 에서 XMLtable 함수 의 PASSING 자구 에서 OBJECT 를 사용 합 니 다.VALUE 가상 열 은 Purchaseorder 표를 컨 텍스트 항목 으로 사용 하 는 XQuery 표현 식 에 전달 합 니 다.XQuery 표현 식 은 사용자 EABEL 이 요청 한 모든 구 매 주문 의 총 계 를 계산 하고 처리 하 는 모든 주문 에 OrderTotal XML 요 소 를 생 성 합 니 다.생 성 된 XML 에 접근 하려 면 SELECT 목록 의 COLUMN 을 사용 하 십시오.VALUE 가상 열.최종 출력 은 다음 과 같 아야 합 니 다.
ORDERTOTAL

-------------------------------------------------------------

<ordertotal></ordertotal>

<reference></reference>EABEL-20021009123338324PDT

<total></total>1328.05



<ordertotal></ordertotal>

<reference></reference>EABEL-20021009123335791PDT

<total></total>2067.15



<ordertotal></ordertotal>

<reference></reference>EABEL-20021009123336251PDT

<total></total>289.6



<ordertotal></ordertotal>

<reference></reference>EABEL-20021009123336382PDT

<total></total>928.92


같은 최종 결 과 를 얻 으 려 면 XML Query 함수 로 바 꿀 수 있 습 니 다.그러나 이전 예제 에서 사용 한 XQuery 표현 식 인 자 를 XML Query 에 전달 하면 (다음 과 같 음):
SELECT XMLQuery('for $i in /PurchaseOrder

where $i/User eq "EABEL"

return <ordertotal></ordertotal>

{$i/Reference}

<total></total>

{fn:sum(for $j in $i/LineItems/LineItem/Part

return ($j/@Quantity*$j/@UnitPrice))}



'

PASSING OBJECT_VALUE

RETURNING CONTENT)

FROM purchaseorder;

XQuery 표현 식 이 되 돌아 오 는 빈 시퀀스 는 Purchaseorder 표 와 연결 되 어 검색 결과 에 포 함 됩 니 다.실제로 이 는 출력 이 사용자 EABEL 이 요청 한 주문 서 를 위 한 OrderTotal 요 소 를 포함 할 뿐만 아니 라 Purchaseorder 표 에 저 장 된 모든 다른 주문 서 를 위 한 빈 줄 (기본 값 으로 Purchaseorder 표 는 132 줄 포함) 도 포함 한 다 는 뜻 이다.결과 에서 빈 줄 을 집중 적 으로 제거 하 는 방법 중 하 나 는 SELECT 문장의 WHERE 자구 에서 exists Node SQL 함 수 를 사용 하 는 것 이지 XQuery 표현 식 에서 WHERE 자 구 를 사용 하 는 것 이 아 닙 니 다. 다음 과 같 습 니 다.
SELECT XMLQuery('for $i in /PurchaseOrder

return <ordertotal></ordertotal>

{$i/Reference}

<total></total>

{fn:sum(for $j in $i/LineItems/LineItem/Part

return ($j/@Quantity*$j/@UnitPrice))}



'

PASSING OBJECT_VALUE

RETURNING CONTENT) AS ordertotal

FROM purchaseorder

WHERE existsNode(OBJECT_VALUE, '/PurchaseOrder[User = "EABEL"]') = 1;

이 조 회 는 이 부분 에서 시작 하 는 XMLtable 예제 와 같은 출력 을 생 성 합 니 다.

좋은 웹페이지 즐겨찾기