여러 번 반복되는 EMPLOYEE 노드를 쿼리 / 출력해야합니다. 내 쿼리는 다중 항목 시퀀스를 기대하지 않는다는 오류를 제공합니다. 결국 PLSQL에서 반복되는 EMPLOYEE 데이터를 반복해야합니다. 그러나 먼저 최소한 SQL을 실행하여 원하는 결과를 얻을 수 있기를 바랍니다. 아이디어가 떨어졌습니다.
아래 내 쿼리 및 XML을 참조하십시오.
select
xmlt.recordid,
xmlt.mfirstname,
xmlt.mlastname,
xmlt.efirstname,
xmlt.elastname,
FROM
test_xml x,
xmltable(xmlnamespaces('http:testxml.com' AS "ns"), '//ns:abccomp'
passing xmltype(x.xml)
columns
recordid varchar2(200) path '//ns:recordid/ns:identification',
mfirstname varchar2(200) path '//ns:accounting/ns:manager/ns:personname/ns:firstname',
mlastname varchar2(200) path '//ns:accounting/ns:manager/ns:personname/ns:lastname',
efirstname varchar2(200) path '//ns:accounting/ns:employee/ns:personname/ns:firstname',
elastname varchar2(200) path '//ns:accounting/ns:employee/ns:personname/ns:lastname'
)Xmlt;
<ns:wrap
xmlns:ns="http:testxml.com">
<ns:body>
<ns:abccomp>
<ns:recordid>
<ns:identification>955613218915</ns:identification>
</ns:recordid>
<ns:accounting>
<ns:manager>
<ns:personname>
<ns:firstname>frank</ns:firstname>
<ns:lastname>phillips</ns:lastname>
</ns:personname>
</ns:manager>
<ns:employee>
<ns:personname>
<ns:firstname>jimmy</ns:firstname>
<ns:lastname>smith</ns:lastname>
</ns:personname>
</ns:employee>
<ns:employee>
<ns:personname>
<ns:firstname>yuri</ns:firstname>
<ns:lastname>oga</ns:lastname>
</ns:personname>
</ns:employee>
<ns:personname>
<ns:firstname>amanda</ns:firstname>
<ns:lastname>hicks</ns:lastname>
</ns:personname>
</ns:employee>
</ns:accounting>
</ns:abccomp>
</ns:body>
</ ns : wrap>
여러 XMLTABLE
s 를 사용할 수 있습니다 .
SELECT x.recordid,
x.mfirstname,
x.mlastname,
e.*
FROM test_xml t
CROSS APPLY XMLTABLE(
xmlnamespaces('http:testxml.com' AS "ns"),
'//ns:wrap/ns:body/ns:abccomp'
PASSING xmltype(t.xml)
COLUMNS
recordid varchar2(200) path '//ns:recordid/ns:identification',
mfirstname varchar2(200) path '//ns:accounting/ns:manager/ns:personname/ns:firstname',
mlastname varchar2(200) path '//ns:accounting/ns:manager/ns:personname/ns:lastname',
accounting XMLTYPE path '//ns:accounting'
) x
CROSS APPLY XMLTABLE(
xmlnamespaces('http:testxml.com' AS "ns"),
'//ns:accounting/ns:employee'
PASSING x.accounting
COLUMNS
efirstname varchar2(200) path '//ns:personname/ns:firstname',
elastname varchar2(200) path '//ns:personname/ns:lastname'
) e;
출력되는 내용 :
RECORDID | MFIRSTNAME | MLASTNAME | EFIRSTNAME | ELASTNAME : ----------- | : --------- | : -------- | : --------- | : -------- 955613218915 | 솔직한 | 필립스 | 지미 | 스미스 955613218915 | 솔직한 | 필립스 | 유리 | oga 955613218915 | 솔직한 | 필립스 | 아만다 | 힉스
테스트 데이터 (여는 태그 <ns:employee>
와 닫는 </ns:wrap>
태그가 없음) :
INSERT INTO test_xml ( xml ) VALUES ( '<ns:wrap xmlns:ns="http:testxml.com">
<ns:body>
<ns:abccomp>
<ns:recordid>
<ns:identification>955613218915</ns:identification>
</ns:recordid>
<ns:accounting>
<ns:manager>
<ns:personname>
<ns:firstname>frank</ns:firstname>
<ns:lastname>phillips</ns:lastname>
</ns:personname>
</ns:manager>
<ns:employee>
<ns:personname>
<ns:firstname>jimmy</ns:firstname>
<ns:lastname>smith</ns:lastname>
</ns:personname>
</ns:employee>
<ns:employee>
<ns:personname>
<ns:firstname>yuri</ns:firstname>
<ns:lastname>oga</ns:lastname>
</ns:personname>
</ns:employee>
<ns:employee>
<ns:personname>
<ns:firstname>amanda</ns:firstname>
<ns:lastname>hicks</ns:lastname>
</ns:personname>
</ns:employee>
</ns:accounting>
</ns:abccomp>
</ns:body>
</ns:wrap>' );
db <> 여기에 바이올린
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다