无法在Oracle PL / SQL Web服务中使用XMLTYPE

时间:2015-10-16 10:17:58

标签: oracle oracle11g xmltype oracle-xml-db

我一直在尝试将Oracle PL / SQL包作为Oracle 11g(11.2.0.2.0)中的Web服务提供。当其他一切进展顺利时,我似乎在使用任何使用XMLTYPE而不是Web服务的过程/函数时遇到问题。虽然我会非常惊讶,如果Oracle Web服务不支持XMLTYPE,并且因为我还没有找到任何表明这种限制的资源,我相信我做错了什么。但是,我无法弄清楚问题出在哪里,因此无法解决问题。

我已根据Native Oracle XML DB Web Services in Oracle 11g Release 1在我的Oracle数据库中配置了本机Web服务,并且我已成功使用SoapUI测试具有基本数据类型的过程。

为了排除问题的任何其他来源,我创建了以下最小化的测试包来重现问题:

CREATE OR REPLACE PACKAGE web_test_package AUTHID CURRENT_USER AS
        PROCEDURE xmltype_test (dummy IN varchar2);
END;
/

CREATE OR REPLACE PACKAGE BODY web_test_package AS
        PROCEDURE xmltype_test (dummy IN varchar2)
        IS
                xt XmlType;
        BEGIN
                select XMLTYPE('<MyXmlTag></MyXmlTag>') into xt from dual;
        END xmltype_test;
END;
/

如果我现在在SQLPlus中运行已定义的过程,它运行得很好:

SQL> exec web_test_package.xmltype_test;

PL/SQL procedure successfully completed.

当配置服务并且已将包定义到数据库中时,我可以从http://host:port/orawsv/DBSCHEMA/WEB_TEST_PACKAGE?wsdl获取包的WSDL。使用WSDL我创建了一个SoapUI项目,其中包含一个示例请求。然后我配置使用基本身份验证的请求,我已准备好测试查询。

使用SoapUI运行查询时,我在响应中收到以下错误:

               <OracleError>
                  <ErrorNumber>ORA-19202</ErrorNumber>
                  <Message>Error occurred in XML processing</Message>
               </OracleError>
               <OracleError>
                  <ErrorNumber>ORA-00904</ErrorNumber>
                  <Message>: invalid identifier</Message>
               </OracleError>
               <OracleError>
                  <ErrorNumber>ORA-06512</ErrorNumber>
                  <Message>at "MY_USER.WEB_TEST_PACKAGE", line 6</Message>
               </OracleError>
               <OracleError>
                  <ErrorNumber>ORA-06512</ErrorNumber>
                  <Message>at line 1</Message>
               </OracleError>

如果我现在正确解释错误,则表示我收到错误ORA-00904&#34;无效标识符&#34;在我有select-clause的行上。在我的理解&#34; XMLTYPE&#34;是该行上唯一的标识符,这意味着在通过Web服务执行过程时无法识别它。

最后一个问题是:XMLTYPE是否存在无法在通过Web服务调用的过程中使用的限制?或者我在这里遗漏了什么?

为了记录,我还尝试用方法格式XMLTYPE.CreateXML(...)替换构造函数格式XMLTYPE(...),但这没有用。

1 个答案:

答案 0 :(得分:0)

我终于能够解决我的问题了。解决方案由两部分组成:

首先,我需要向我的网络服务用户授予以下权限:

grant XDB_WEBSERVICES_WITH_PUBLIC to my_user;

这是我使用的一些指南中的注释,但显然,对于Web服务启动的会话,XMLTYPE是必需的。

其次,我了解到当Web服务调用该函数时,将XMLTYPE作为函数的返回类型是一个问题。我有一个这样的函数,解决方案是将其返回类型更改为CLOB并在其末尾添加以下转换。

RETURN return_xml.getClobVal();

这将返回值作为XML很好地返回到我的SOAPUI请求。

编辑。从Oracle本地Web服务返回CLOB似乎有4000个字符的限制。通过将其转换回XMLTYPE可以很难解决这个问题。因此,要从Oracle本机Web服务正确返回XML,您实际上需要执行以下操作:

RETURN XMLTYPE(return_xml.getClobVal());

即使看起来很奇怪,这种来回的转换也会改变XMLTYPE的格式,以便可以很好地返回它,而且没有字符限制。