Oracle XQuery 조회, 구축 및 변환 XML
7706 단어 Oacle
본 논문 에서 제공 하 는 예 는 어떤 상황 에서 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 예제 와 같은 출력 을 생 성 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 작업 은 Clob 또는 NClob 데이터 형식의 저장 프로 세 스 인 스 턴 스 를 포함 합 니 다.텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.