В указанном вами пути для пространства имен ns0
отсутствует конец /types
, хотя вы использовали неправильный URL-адрес для ns0
, который действительно действует для узла Value
;ваш XPath имеет ns1:value
вместо ns0:Value
, но либо должен быть подстановочным, либо иметь полный путь;и предложение columns
может быть упрощено до '.'
:
select x.value
into l_parenttrenodeid
from xmltable(
xmlnamespaces('http://xmlns.oracle.com/adf/svc/types/' as "ns0"),
'//ns0:Value'
passing xmltype(p_response)
columns value varchar2(500) path '.'
) x;
или без ключа (объявление NS не требуется):
select x.value
into l_parenttrenodeid
from xmltable(
'//*:Value'
passing xmltype(p_response)
columns value varchar2(500) path '.'
) x;
или с полным XPath для этого узла (разделить здесь, так что часть переходит в предложение columns
, для развлечения и для уменьшения прокрутки), и все пространства имен в этом пути объявлены - что сбивает с толку, так как по крайней мере один URL используется для нескольких имен, и по крайней мере одно имя используется длянесколько URL.К счастью, имена не должны совпадать, они просто должны найти правильный путь:
select x.value
into l_parenttrenodeid
from xmltable(
xmlnamespaces(
'http://schemas.xmlsoap.org/soap/envelope/' as "env",
'http://xmlns.oracle.com/apps/hcm/trees/organizationTreeService/types/' as "ns1",
'http://xmlns.oracle.com/adf/svc/types/' as "ns2"
),
'/env:Envelope/env:Body/ns1:addValueOrganizationTreeNodeResponse/ns1:treeNodeId'
passing xmltype(p_response)
columns value varchar2(500) path 'ns2:Value'
) x;
Вы также можете сделать это с помощью вызова XMLQuery()
вместо XMLTable()
, поскольку выожидаем только одного результата:
select xmlquery(
'declare namespace env = "http://schemas.xmlsoap.org/soap/envelope/"; (::)
declare namespace ns1 = "http://xmlns.oracle.com/apps/hcm/trees/organizationTreeService/types/"; (::)
declare namespace ns2 = "http://xmlns.oracle.com/adf/svc/types/"; (::)
/env:Envelope/env:Body/ns1:addValueOrganizationTreeNodeResponse/ns1:treeNodeId/ns2:Value/text()'
passing xmltype(p_response)
returning content
).getstringval()
into l_parenttrenodeid
from dual;