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

Я разработчик базы данных, и мы используем WSO2 Data Service Server для создания веб-служб на основе вызовов хранимых процедур 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>

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

<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>

person user3776505    schedule 25.06.2014    source источник


Ответы (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 в запросе, как в приведенном выше примере.

person Chanikag    schedule 03.10.2014