WSO2 DSS: настройка службы данных с использованием хранимой процедуры / функции Oracle, имеющей массив string / varchar2 в качестве входного параметра

#arrays #oracle #stored-procedures #wso2dss #input-parameters

#массивы #Oracle #хранимые процедуры #wso2-data-services-server #входные параметры

Вопрос:

Я разработчик базы данных, и мы используем сервер службы данных WSO2 для создания веб-сервисов на основе вызовов хранимых процедур Oracle. Одна из хранимых процедур принимает массив в качестве входного параметра. К сожалению, DSS не может сопоставить массив с этим входным параметром. Попытался просмотреть документацию WSO2, но этого не произошло. Я попытался поиграть с определением параметра, чтобы сделать его скалярным или массивом, как показано ниже.

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

Также не могли бы вы указать, как будет выглядеть URL-адрес для службы RESTful, которая будет принимать массив данных в качестве входных параметров?

Ниже приведен пример кода хранимой процедуры Oracle и соответствующий сценарий настройки WSO2 DSS. Предоставление и разрешение базы данных не являются проблемой.

 /* PL/SQL Code Start */

create or replace type str_array as table of varchar2(100) ;

create or replace procedure procarray (
    pv_arr IN str_array,
    pv_rset OUT sys_refcursor)
AS
BEGIN
    open pv_rset for select column_value as str from table(pv_arr);
End;

show errors;  

/* PL/SQL Code End */
  

Конфигурация веб-сервиса выглядит следующим образом

 <data name="test_arrayCall">
   <config id="CDE_ODS_DIT">
      <property name="driverClassName">oracle.jdbc.driver.OracleDriver</property>
      <property name="url">jdbc:oracle:thin:@zzzz:1521</property>
      <property name="username">xxxxxxx</property> 
      <property name="password">yyyyyyy</property>
   </config>
   <query id="callarray" useConfig="CDE_ODS_DIT">
      <sql>call xxxxxxx.procarray(?,?);</sql>
      <result element="rows" rowName="row">
         <element column="STR" name="STR" namespace="STR" xsdType="string"/>
      </result>
      <param name="pv_arr" paramType="ARRAY" sqlType="STRING"/> <!-- When making a call the service response throws an Oracle Error -->

      <!-- Below parameter setting doesn't work and the service fails to get itself registered successfully --> 
      <!-- <param name="pv_arr" paramType="ARRAY" sqlType="ARRAY" structType="xxxxxxx.STR_ARRAY"/> /> -->

      <param name="pv_rset" sqlType="ORACLE_REF_CURSOR" type="OUT"/>
   </query>
   <operation name="getdata">
      <call-query href="callarray">
         <with-param name="pv_arr" query-param="pv_arr"/>
      </call-query>
   </operation>
</data>
  

Ниже приведен пример запроса и вывода ответа при передаче двух значений в хранимую процедуру
Запрос :

 <body>
   <p:getdata xmlns:p="http://ws.wso2.org/dataservice">
      <!--1 or more occurrences-->
      <xs:pv_arr xmlns:xs="http://ws.wso2.org/dataservice">A</xs:pv_arr>
      <xs:pv_arr xmlns:xs="http://ws.wso2.org/dataservice">B</xs:pv_arr>
   </p:getdata>
</body>
  

Ответ :

 <soapenv:Fault xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:axis2ns14="http://ws.wso2.org/dataservice">
   <soapenv:Code>
      <soapenv:Value>axis2ns14:DATABASE_ERROR</soapenv:Value>
   </soapenv:Code>
   <soapenv:Reason>
      <soapenv:Text xml:lang="en-US">DS Code: DATABASE_ERROR
Nested Exception:-
javax.xml.stream.XMLStreamException: DS Fault Message: Error in 'SQLQuery.processStoredProcQuery'
DS Code: DATABASE_ERROR
Source Data Service:-
Name: test_arrayCall
Location: test_arrayCall.dbs
Description: N/A
Default Namespace: http://ws.wso2.org/dataservice
Current Request Name: getdata
Current Params: {pv_arr={A,B}}
Nested Exception:-
java.sql.SQLSyntaxErrorException: ORA-00911: invalid character


</soapenv:Text>
   </soapenv:Reason>
   <soapenv:Detail>
      <axis2ns13:DataServiceFault xmlns:axis2ns13="http://ws.wso2.org/dataservice">
         <axis2ns13:current_params>{pv_arr={A,B}}</axis2ns13:current_params>
         <axis2ns13:current_request_name>getdata</axis2ns13:current_request_name>
         <axis2ns13:nested_exception>java.sql.SQLSyntaxErrorException: ORA-00911: invalid character</axis2ns13:nested_exception>
         <axis2ns13:source_data_service>
            <axis2ns13:location>test_arrayCall.dbs</axis2ns13:location>
            <axis2ns13:default_namespace>http://ws.wso2.org/dataservice</axis2ns13:default_namespace>
            <axis2ns13:description>N/A</axis2ns13:description>
            <axis2ns13:data_service_name>test_arrayCall</axis2ns13:data_service_name>
         </axis2ns13:source_data_service>
         <axis2ns13:ds_code>DATABASE_ERROR</axis2ns13:ds_code>
      </axis2ns13:DataServiceFault>
   </soapenv:Detail>
</soapenv:Fault>
  

Ответ №1:

Отредактируйте sql-запрос как

    <query id="callarray" useConfig="CDE_ODS_DIT">
      <sql>call xxxxxxx.procarray(?,str_array(?));</sql>
      <result element="rows" rowName="row">
         <element column="STR" name="STR" namespace="STR" xsdType="string"/>
      </result>
      <param name="pv_arr" paramType="ARRAY" sqlType="STRING"/> <!-- When making a call the service response throws an Oracle Error -->

      <!-- Below parameter setting doesn't work and the service fails to get itself registered successfully --> 
      <!-- <param name="pv_arr" paramType="ARRAY" sqlType="ARRAY" structType="xxxxxxx.STR_ARRAY"/> /> -->

      <param name="pv_rset" sqlType="ORACLE_REF_CURSOR" type="OUT"/>
   </query>
  

Пожалуйста, обратите внимание, что данные массива должны быть переданы как тип str_array в запросе, как в примере bove