완전한 XML 문서를 포함하는 XMLType 변수에서 PLSQL 프로 시저의 데이터를 다음 구조 (아래 단순화)로 추출해야합니다.
<?xml version="1.0" encoding="utf-8"?>
<AA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://my.domain/cat1/">
<Element>
<ID>2</ID>
<Value>46544</Value>
<Element>
</AA>
XMLTable 함수를 사용하고 있지만 /AA/Element
데이터가없는 간단한 XPath 표현식을 사용합니다.
SELECT C1, C2
INTO v_id, v_val
FROM XMLTable('/AA/Element'
passing v_MyXML columns
C1 number path 'ID',
C2 number path 'Value'
)
아래 표현식 중 어느 것도 사용하지 않습니다.
'/*.AA/Element'
'declare default element namespace "http://my.domain/cat1/"; /AA/Element'
'declare namespace xsi="http://www.w3.org/2001/XMLSchema-instance"; declare namespace xsd="http://www.w3.org/2001/XMLSchema"; declare default element namespace "http://jpk.mf.gov.pl/wzor/2016/03/09/03094/"; /AA/Element'
데이터를 추출 할 수있는 유일한 방법은 문서 / 변수를 수정하고
<AA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://my.domain/cat1/">
와
<AA>
문서를 수정하고 적절한 속성을 가진 초기 구조를 반환해야하므로 완벽한 솔루션은 아닙니다. 아무도 데이터를 가져올 수 있도록 XPath 표현식을 수정하는 방법을 제안 할 수 있습니까? 아니면 AA 요소의 네임 스페이스를 무시하는 다른 방법을 사용할 수 있습니까?
@JensErat는 이미 XML 배경을 제공 했으므로 그럴 필요가 없습니다. 대신 아래에서 Oracle PL / SQL에서 모든 것을 적용하는 방법에 대한 실제 예제를 찾을 수 있습니다.
당신은 사용할 필요가 XML 네임 스페이스 조항 의 XMLTABLE를 :
XMLNAMESPACES 절에는 XML 네임 스페이스 선언 집합이 포함됩니다. 이러한 선언은 행을 계산하는 XQuery 식 (평가 된 XQuery_string)과 전체 XMLTable 함수에 대한 열을 계산하는 XML_table_column의 PATH 절에있는 XPath 식에 의해 참조됩니다. COLUMNS 절의 PATH 표현식에서 규정 된 이름을 사용하려면 XMLNAMESPACES 절을 지정해야합니다.
기본 XML 네임 스페이스 절을 사용할 수도 있습니다 .
xmlnamespaces(default 'http://my.domain/cat1/')
그러면 네임 스페이스 접두사를 사용할 필요가 없습니다.
기본 네임 스페이스가없는 예
declare
v_xml constant xmltype := xmltype('<AA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://my.domain/cat1/">
<Element>
<ID>2</ID>
<Value>46544</Value>
</Element>
</AA>'
);
v_id number;
v_value number;
begin
select id, value_
into v_id, v_value
from xmltable(
xmlnamespaces('http://my.domain/cat1/' as "foo"),
'/foo:AA/foo:Element' passing v_xml
columns
id number path 'foo:ID',
value_ number path 'foo:Value'
);
dbms_output.put_line('(v_id = ' || v_id || ')(v_value = ' || v_value || ')');
end;
/
기본 네임 스페이스가있는 예
declare
v_xml constant xmltype := xmltype('<AA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://my.domain/cat1/">
<Element>
<ID>2</ID>
<Value>46544</Value>
</Element>
</AA>'
);
v_id number;
v_value number;
begin
select id, value_
into v_id, v_value
from xmltable(
xmlnamespaces(default 'http://my.domain/cat1/'),
'/AA/Element' passing v_xml
columns
id number path 'ID',
value_ number path 'Value'
);
dbms_output.put_line('(v_id = ' || v_id || ')(v_value = ' || v_value || ')');
end;
/
실행 예 :
SQL> @so58
(v_id = 2)(v_value = 46544)
PL/SQL procedure successfully completed.
SQL>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다