2015-10-16 52 views
0

我一直试图在Oracle 11g(11.2.0.2.0)中提供我的Oracle PL/SQL程序包作为Web服务。尽管其他一切都进行得很顺利,但我似乎在使用任何使用Web服务上的XMLTYPE的过程/函数时遇到了问题。虽然我会感到非常惊讶,如果XMLTYPE在Oracle Web服务中不受支持,并且还因为我没有发现任何表示这种限制的资源,我相信我做错了什么。但是,我无法弄清问题出在哪里,因此也就是问题所在。无法在Oracle PL/SQL Web服务中使用XMLTYPE

我在我的Oracle数据库中根据Native Oracle XML DB Web Services in Oracle 11g Release 1配置了本地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“无效的标识符”上我有我的选择条款的行。在我的理解中,“XMLTYPE”是该行唯一的标识符,这意味着在通过Web服务执行过程时不会识别它。

因此,最后的问题是:是否存在XMLTYPE不能用于通过Web服务调用的过程中的限制?或者我在这里错过了什么?

为了记录,我也尝试用方法格式XMLTYPE.CreateXML(...)替换构造器格式XMLTYPE(...),但这并没有帮助。

回答

0

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

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

grant XDB_WEBSERVICES_WITH_PUBLIC to my_user; 

这是在一些导游,我用的意见,但显然它是必需的XMLTYPE对于由Web服务启动的会话可见。

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

RETURN return_xml.getClobVal(); 

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

编辑。从Oracle本机Web服务返回CLOB似乎有4000个字符的限制。通过将其重新转换为XMLTYPE可以很难解决这个问题。因此,要正确地从Oracle本地Web服务返回XML,你会真正需要做到以下几点:

RETURN XMLTYPE(return_xml.getClobVal()); 

即使看多,这种前后铸造改变XMLTYPE足够的格式,这样就可以归还很好,没有字符限制。