我一直在尝试在 Oracle 11g (11.2.0.2.0) 中将我的 Oracle PL/SQL 包作为 Web 服务提供。虽然其他一切进展顺利,但我似乎在使用任何通过 Web 服务使用 XMLTYPE 的过程/函数时遇到了问题。虽然我会感到非常惊讶,但如果 Oracle Web 服务不支持 XMLTYPE,而且因为我还没有找到任何表明这种限制的资源,我相信我做错了什么。但是,我无法弄清楚问题出在哪里,因此是问题所在。
我已经根据Oracle 11g 第 1 版中的本机 Oracle XML DB Web 服务在我的 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(...),但这没有帮助。