【问题标题】:Unable to use XMLTYPE in Oracle PL/SQL web service无法在 Oracle PL/SQL Web 服务中使用 XMLTYPE
【发布时间】:2015-10-16 10:17:57
【问题描述】:

我一直在尝试在 Oracle 11g (11.2.0.2.0) 中将我的 Oracle PL/SQL 包作为 Web 服务提供。虽然其他一切进展顺利,但我似乎在使用任何通过 Web 服务使用 XMLTYPE 的过程/函数时遇到了问题。虽然我会感到非常惊讶,但如果 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 "invalid identifier"。而在我的理解中,“XMLTYPE”是该行的唯一标识符,这意味着当通过 Web 服务执行该过程时,它不会被识别。

那么最后的问题是:XMLTYPE 不能用于通过 Web 服务调用的过程中是否存在限制?还是我在这里遗漏了什么?

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

【问题讨论】:

    标签: oracle oracle11g xmltype oracle-xml-db


    【解决方案1】:

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

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

    grant XDB_WEBSERVICES_WITH_PUBLIC to my_user;
    

    这是在我使用的一些指南中的 cmets 中,但显然 XMLTYPE 对 Web 服务启动的会话可见是必需的。

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

    RETURN return_xml.getClobVal();
    

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

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

    RETURN XMLTYPE(return_xml.getClobVal());
    

    尽管看起来很奇怪,但这种来回转换足以改变 XMLTYPE 的格式,因此可以很好地返回它并且没有字符限制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多