PL / SQL XMLTYPE ORA-30625

时间:2014-04-24 17:45:50

标签: oracle plsql xmltype

我正在使用返回以下输出的Web服务。我很难从输出中构建XMLTYPE变量。尝试输出CreateUserSessionFromInstanceResult

时出现以下错误
  

ORA-30625:禁止对NULL SELF参数进行方法调度

procedure xmltest is

str_xml varchar2(32000);
v_xml XMLTYPE;

BEGIN
str_xml :='<?xml version="1.0" encoding="utf-8"?>
       <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <soap:Body>
                <CreateUserSessionFromInstanceResponse xmlns="http://archer-tech.com/webservices/">
                    <CreateUserSessionFromInstanceResult>4FFABEE05C4910A31FEC75D5FEDCDFB5</CreateUserSessionFromInstanceResult>
                </CreateUserSessionFromInstanceResponse>
            </soap:Body>
       </soap:Envelope>';
v_xml := XMLTYPE(str_xml);
HTP.P(v_xml.extract('//CreateUserSessionFromInstanceResult/text()').getstringval());

END;

2 个答案:

答案 0 :(得分:2)

错误在这一行

HTP.P(v_xml.extract('//CreateUserSessionFromInstanceResult/text()').getstringval());

您收到错误是因为您的XPath表达式

//CreateUserSessionFromInstanceResult/text()

不匹配,因此extract(...)会返回NULL。当然,您无法在getstringval()上致电NULL,因此您会看到错误。

XPath不匹配的原因是名称空间。 xmlns元素上的<CreateUserSessionFromInstanceResponse>属性将此元素的名称空间及其包含的<CreateUserSessionFromInstanceResult>元素的名称空间设置为"http://archer-tech.com/webservices/"。另一方面,您的XPath表达式正在默认命名空间CreateUserSessionFromInstanceResult中搜索名称为""的元素。

修复是向extract添加第三个参数来声明此命名空间。您可以按照XML中显示的相同方式执行此操作:

HTP.P(v_xml.extract('//CreateUserSessionFromInstanceResult/text()',
                    'xmlns="http://archer-tech.com/webservices/"').getstringval());

答案 1 :(得分:0)

我遇到了类似的情况,但添加额外参数对我不起作用。

对我来说,解决方案是在使用 getstringval 之前检查节点是否存在并进行空检查,如下所示:

if v_xml.existsnode('//CreateUserSessionFromInstanceResult', 'xmlns="http://archer-tech.com/webservices/"') > 0 and v_xml.extract('//CreateUserSessionFromInstanceResult/text()', 'xmlns="http://archer-tech.com/webservices/"') is not null then
HTP.P(v_xml.extract('//CreateUserSessionFromInstanceResult/text()', 'xmlns="http://archer-tech.com/webservices/"').getstringval());
end if;
只做空检查可能就足够了。