2015-10-16 3 views
0

Я пытаюсь предоставить свой пакет Oracle PL/SQL в качестве веб-службы в Oracle 11g (11.2.0.2.0). В то время как все остальное идет хорошо, у меня, похоже, проблема с использованием любой процедуры/функции, которая использует XMLTYPE через веб-службу. Хотя я был бы очень удивлен, если XMLTYPE не поддерживался в веб-сервисе Oracle, а также потому, что я не нашел никаких ресурсов, указывающих на такое ограничение, я считаю, что я делаю что-то неправильно. Однако я не могу понять, в чем проблема, и, следовательно, вопрос.Невозможно использовать XMLTYPE в веб-службе Oracle PL/SQL

Я настроил собственный веб-сервис в своей базе данных Oracle в соответствии с Native Oracle XML DB Web Services in Oracle 11g Release 1, и я успешно прошел процедуры тестирования с использованием базовых типов данных с использованием 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. 

Когда служба настроена и пакет определен в базе данных, я могу получить WSDL для пакета от http://host:port/orawsv/DBSCHEMA/WEB_TEST_PACKAGE?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 «неверный идентификатор» на строка, в которой у меня есть свой select-clause. И в моем понимании «XMLTYPE» является единственным идентификатором в этой строке, что означает, что он не распознается, когда процедура выполняется через веб-службу.

Итак, наконец, вопрос: существует ли ограничение, которое XMLTYPE не может использовать в процедурах, вызываемых через веб-службу? Или я чего-то не хватает?

Для записи я также попытался заменить формат конструктора XMLTYPE (...) форматом метода XMLTYPE.CreateXML (...), но это не помогло.

ответ

0

Я, наконец, смог решить мою проблему. Решение состояло из двух частей:

Во-первых, мне нужно, чтобы дать мой пользователь веб-сервис следующее разрешение:

grant XDB_WEBSERVICES_WITH_PUBLIC to my_user; 

Это было в комментариях в некоторых руководствах, которые я использовал, но, видимо, требуется для XMLTYPE будет видимым для сеанса, запущенного веб-службой.

Во-вторых, я узнал, что наличие XMLTYPE в качестве возвращаемого типа функции является проблемой, когда функция вызывается веб-службой. У меня была одна такая функция, и решение заключалось в том, чтобы изменить его возвращаемый тип на CLOB и добавить в него следующее преобразование.

RETURN return_xml.getClobVal(); 

Это возвращает возвращаемое значение, как XML, в мой запрос SOAPUI.

Редактировать. Кажется, существует предел 4000 символов в возвращении CLOB из собственного веб-сервиса Oracle. Это может быть неудобно разрешено, возвращая его в XMLTYPE. Таким образом, чтобы правильно вернуть XML из Oracle родной веб-сервиса, вы на самом деле нужно сделать следующее:

RETURN XMLTYPE(return_xml.getClobVal()); 

Несмотря на то, глядя нечетное, это назад и вперед, литье изменяет формат достаточно XMLTYPE, так что он может быть возвращен красиво и без ограничения характера.